Получение желаемых данных из ссылки CVPixelBuffer
У меня есть программа, которая просматривает вход камеры в режиме реального времени и получает значение цвета среднего пикселя. Я использую метод captureOutput: для получения CMSampleBuffer из вывода AVCaptureSession (который считывается как CVPixelBuffer), а затем я получаю значения rgb пикселя, используя следующий код:
// Get a CMSampleBuffer's Core Video image buffer for the media data
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
// Lock the base address of the pixel buffer
CVPixelBufferLockBaseAddress(imageBuffer, 0);
// Get the number of bytes per row for the pixel buffer
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
// Get the pixel buffer width and height
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
unsigned char* pixel = (unsigned char *)CVPixelBufferGetBaseAddress(imageBuffer);
NSLog(@"Middle pixel: %hhu", pixel[((width*height)*4)/2]);
int red = pixel[(((width*height)*4)/2)+2];
int green = pixel[(((width*height)*4)/2)+1];
int blue = pixel[((width*height)*4)/2];
int alpha = 1;
UIColor *color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:(blue/255.0f) alpha:(alpha)];
Я думал, что эта формула ((ширина * высота)*4)/2 даст мне средний пиксель, но это даст мне верхний средний пиксель изображения. Мне интересно, какую формулу мне нужно использовать, чтобы получить доступ к пикселю в середине экрана. Я немного застрял, потому что я действительно не знаю внутреннюю структуру этих пиксельных буферов.
В будущем я хотел бы взять 4 средних пикселя и усреднить их для более точного считывания цветов, но сейчас я просто хотел бы понять, как эти вещи работают.
1 ответ
Основная проблема с вашей формулой определения местоположения среднего пикселя состоит в том, что он работает только для неровного числа строк сканирования. Если у вас четное число, он выбирает первый пиксель в строке развертки чуть ниже середины. Это средний левый пиксель. Поскольку видеокадры iPhone поворачиваются на 90 градусов, этот пиксель на самом деле является верхним средним пикселем.
Итак, лучшая формула для определения среднего пикселя:
(height / 2) * bytesPerRow + (width / 2) * 4