iOS6:如何使用从cvPixelBufferref到CIImage的YUV到RGB的转换function

从iOS6开始,苹果已经通过这个调用给出了使用原生YUV到CIImage的规定

initWithCVPixelBuffer:选项:

在核心的图像编程指南中,他们提到了这个function

利用iOS 6.0及更高版本中对YUV图像的支持。 相机像素缓冲区本来就是YUV,但大多数image processingalgorithm需要RBGA数据。 两者之间的转换是有成本的。 Core Image支持从CVPixelBuffer对象读取YUB并应用适当的颜色转换。

options = @ {(id)kCVPixelBufferPixelFormatTypeKey:@(kCVPixelFormatType_420YpCvCr88iPlanarFullRange)};

但是,我无法正确使用它。 我有一个原始的YUV数据。 所以,这就是我所做的

void *YUV[3] = {data[0], data[1], data[2]}; size_t planeWidth[3] = {width, width/2, width/2}; size_t planeHeight[3] = {height, height/2, height/2}; size_t planeBytesPerRow[3] = {stride, stride/2, stride/2}; CVPixelBufferRef pixelBuffer = NULL; CVReturn ret = CVPixelBufferCreateWithPlanarBytes(kCFAllocatorDefault, width, height, kCVPixelFormatType_420YpCbCr8PlanarFullRange, nil, width*height*1.5, 3, YUV, planeWidth, planeHeight, planeBytesPerRow, nil, nil, nil, &pixelBuffer); NSDict *opt = @{ (id)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_420YpCbCr8PlanarFullRange) }; CIImage *image = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:opt]; 

我没有形象。 Anyy知道我错过了什么。

编辑:我添加locking和解锁基地址之前打电话。 另外,我倾倒了pixelbuffer的数据,以确保pixelellbuffer正常保存数据。 它看起来像只有初始化调用有问题。 仍然CIImage对象返回零。

  CVPixelBufferLockBaseAddress(pixelBuffer, 0); CIImage *image = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:opt]; CVPixelBufferUnlockBaseAddress(pixelBuffer,0); 

在控制台中应该有错误消息: initWithCVPixelBuffer failed because the CVPixelBufferRef is not IOSurface backed 。 有关如何创buildIOSurface支持的CVPixelBuffer请参阅Apple的技术问答 CVPixelBuffer

调用CVPixelBufferCreateWithBytes()CVPixelBufferCreateWithPlanarBytes()将导致不是IOSurface支持的CVPixelBuffers …

…为此,在使用CVPixelBufferCreate()创build像素缓冲区时,必须在pixelBufferAttributes字典中指定kCVPixelBufferIOSurfacePropertiesKey

 NSDictionary *pixelBufferAttributes = [NSDictionary dictionaryWithObjectsAndKeys: [NSDictionary dictionary], (id)kCVPixelBufferIOSurfacePropertiesKey, nil]; // you may add other keys as appropriate, eg kCVPixelBufferPixelFormatTypeKey, kCVPixelBufferWidthKey, kCVPixelBufferHeightKey, etc. CVPixelBufferRef pixelBuffer; CVPixelBufferCreate(... (CFDictionaryRef)pixelBufferAttributes, &pixelBuffer); 

或者,如果提供给CVPixelBufferPoolCreate()pixelBufferAttributes字典包含kCVPixelBufferIOSurfacePropertiesKey ,则可以使用来自现有像素缓冲池的CVPixelBufferPoolCreatePixelBuffer()来制作IOSurface支持的kCVPixelBufferIOSurfacePropertiesKey

我正在研究一个类似的问题,并不断从Applefind相同的引用,而没有关于如何在YUV色彩空间中工作的更多信息。 我遇到以下情况:

默认情况下,Core Image假定处理节点是每像素128位,线性光,预乘RGBA浮点值,使用GenericRGB色彩空间。 您可以通过提供Quartz 2D CGColorSpace对象来指定不同的工作色彩空间。 请注意,工作色彩空间必须是基于RGB的。 如果您将YUV数据作为input(或其他不是基于RGB的数据),则可以使用ColorSyncfunction将其转换为工作色彩空间。 (有关创build和使用CGColorspace对象的信息,请参阅“Quartz 2D编程指南”。)对于8位YUV 4:2:2源,Core Image每千兆字节可以处理240个HD图层。 八位YUV是DV,MPEG,未压缩的D1和JPEG等video源的原生色彩格式。 您需要将YUV色彩空间转换为Core Image的RGB色彩空间。

我注意到没有YUV色彩空间,只有灰色和RGB; 和他们校准的表亲。 我不知道如何转换颜色空间,但如果我发现肯定会报告。