При настройке AVCaptureVideoDataOutput, который возвращает необработанные кадры камеры, вы можете установить формат кадров, используя следующий код:
[videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]];
В этом случае указывается формат пикселей BGRA (я использовалэто для соответствия формату цвета для текстуры OpenGL ES).Каждый пиксель в этом формате имеет один байт для синего, зеленого, красного и альфа-канала в указанном порядке.Это позволяет легко извлекать цветовые компоненты, но вы жертвуете небольшой производительностью, поскольку вынуждены выполнять преобразование из собственного цветового пространства YUV для камеры.
Другие поддерживаемые цветовые пространства: kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
и kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
на более новых устройствах и kCVPixelFormatType_422YpCbCr8
на iPhone 3G.Суффикс VideoRange
или FullRange
просто указывает, возвращаются ли байты между 16 - 235 для Y и 16 - 240 для УФ или полными 0 - 255. Для каждого компонента.
Я считаю, что цветовое пространство по умолчанию используетсяэкземпляром AVCaptureVideoDataOutput является плоское цветовое пространство YUV 4: 2: 0 (за исключением iPhone 3G, в котором чередуется YUV 4: 2: 2).Это означает, что в видеокадре содержатся две плоскости данных изображения, причем Y-плоскость идет первой.Для каждого пикселя в вашем получающемся изображении есть один байт для значения Y в этом пикселе.
Вы могли бы получить эти необработанные данные Y, реализовав что-то подобное в обратном вызове делегата:
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
unsigned char *rawPixelBase = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer);
// Do something with the raw pixels here
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
}
Затем можно определить местоположение в данных кадра для каждой координаты X, Y на изображении и вытащить байт, соответствующий компоненту Y с этой координатой.
Пример Apple FindMyiCone с WWDC 2010 (доступно вместе с видео) показывает, как обрабатывать необработанные данные BGRA из каждого кадра.Я также создал пример приложения, в котором вы можете загрузить код для здесь , который выполняет отслеживание цветных объектов с использованием живого видео с камеры iPhone.Оба показывают, как обрабатывать необработанные данные пикселей, но ни один из них не работает в цветовом пространстве YUV.