Получение желаемых данных из ссылки CVPixelBuffer

У меня есть программа, которая просматривает вход камеры в реальном времени и получает значение цвета среднего пикселя. Я использую метод captureOutput: для захвата CMSampleBuffer из выхода AVCaptureSession (который, как считается, считывается как CVPixelBuffer), а затем я беру значения rgb для пикселя, используя следующий код:

// Get a CMSampleBuffer 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 iPhone вращаются на 90 градусов, этот пиксель на самом деле является верхним средним пикселем.

Итак, лучшей формулой для определения среднего пикселя является:

(height / 2) * bytesPerRow + (width / 2) * 4