2010-12-05 22 views
0

我从iPhone中以kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange格式(YUV,双平面)抓取YUV通道。iPhone YUV通道方向

我打算处理Y通道,所以它使用

CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

CVPixelBufferLockBaseAddress(pixelBuffer, 0); 

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

uint8_t *y_channel = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0); 

抓住的问题是,所述y_channel像素出现旋转和镜像(I绘制它们的覆盖层上,以看到什么样子:

- (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上,支持UIViews的CALayers会翻转,原点位于左上角,这可能会导致使用这些图层中的Quartz绘制的图像反转。

对于显示,我建议不要像你在这里展示的那样进行Quartz绘图,而是使用Y通道图像作为OpenGL ES纹理。这将更加高效。此外,您可以简单地指定正确的纹理坐标,以硬件加速方式自动处理所需的任何图像旋转。

我描述了如何在使用OpenGL ES 2.0 here的iOS设备上进行硬件加速的图像处理,并且我提供了一个使用着色器执行此处理的sample application,并将结果绘制到纹理中的屏幕上。在这个例子中,我正在使用BGRA色彩空间,但是您应该能够拉出Y通道并以相同的方式将其用作亮度纹理。