2010-12-05 3 views
0

Я захватываю канал YUV с IPhone в формате kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange (YUV, двух планарный).Ориентация канала IPhone YUV

Я намерен обработать у-канал, так что я захватить его с помощью

CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

CVPixelBufferLockBaseAddress(pixelBuffer, 0); 

int bufferHeight = CVPixelBufferGetHeight(pixelBuffer); 
int bufferWidth = CVPixelBufferGetWidth(pixelBuffer); 

uint8_t *y_channel = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0); 

Проблема в том, что y_channel пикселей появляется поворачиваются и зеркальные (я рисую их на накладываемого слоя, чтобы увидеть, что внешний вид, как :

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 
{ 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); 
    CGContextRef bitmapContext = CGBitmapContextCreate(rotated, 
                 imageSize->x, 
                 imageSize->y, 
                 8, // bitsPerComponent 
                 1*imageSize->x, // bytesPerRow 
                 colorSpace, 
                 kCGImageAlphaNone); 

    CFRelease(colorSpace); 

    CGImageRef cgImage = CGBitmapContextCreateImage(bitmapContext); 

    CGContextDrawImage(context, CGRectMake(0, 0, imageSize->x/2, imageSize->y/2), cgImage); 

    CFRelease(cgImage); 
    CFRelease(bitmapContext); 
} 

Я рассмотрел цикл по пикселям и создал исправленную версию изображения, но мне интересно, если есть способ, чтобы получить y_channel в правильной ориентации (IE: не вращается в 90 градусов) прямо с камеры.

ответ

2

Я не верю, что есть способ изменить ориентацию плоскости Y, поступающей с камеры, но это не должно иметь большого значения в вашей обработке, поскольку вы должны иметь возможность работать с ней просто отлично в своей родной ориентации. Если вы знаете, что он повернут на 90 градусов, просто подстройте свою обработку, чтобы работать с ней при этом вращении.

Кроме того, я считаю, что зеркальное отображение, которое вы видите, связано с вашим рисунком в координатном пространстве Core Graphics, где начало координат находится в левом нижнем углу. На iPhone, CALayers, которые возвращают UIViews, перевернуты так, чтобы начало координат находилось в левом верхнем углу, что может привести к инверсии изображений, выполненных с использованием кварца в этих слоях.

Для отображения я бы рекомендовал не делать кварцевый рисунок, как вы здесь, но вместо этого используйте изображение Y-канала как текстуру OpenGL ES. Это будет гораздо более результативным. Кроме того, вы можете просто указать правильные координаты текстур, чтобы автоматически обрабатывать любое вращение изображения, которое вы хотите, с аппаратным ускорением.

я описать, как сделать аппаратное ускорение обработки изображений на IOS, устройствах с использованием OpenGL ES 2.0 here, и я обеспечить sample application, что делает эту обработку с использованием шейдеров и рисует результат на экран в текстуре. В этом примере я работаю с цветовым пространством BGRA, но вы можете вытащить Y-канал и использовать его как текстуру яркости таким же образом.

Смежные вопросы