10

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

// 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 средних пикселя и усреднить их для более точного считывания цвета, но сейчас я хотел бы получить представление о том, как это работает.

ответ

4

Основная проблема с вашей формулой для определения среднего пикселя заключается в том, что он работает только для нечетного числа строк сканирования. Если у вас четное число, он выбирает первый пиксель на строке сканирования чуть ниже середины. Это средний левый пиксель. Поскольку кадры iPhone видео поворачиваются на 90 градусов, этот пиксель на самом деле является верхним средним пикселем.

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

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

Да, ориентации по умолчанию для двух камер на IOS устройствах пейзажа, так что если вы делаете какую-либо портретный режим работы вы» придется иметь дело с вращающейся рамкой. –

+0

@Codo любой совет? http://stackoverflow.com/questions/37611593/how-to-create-cvpixelbufferref-with-yuv420i420-data –

+0

Любопытно, почему часть ширины умножается на 4? – OutOnAWeekend