【发布时间】:2013-11-20 00:27:37
【问题描述】:
从 iOS6 开始,Apple 已经通过这个调用提供了使用原生 YUV 到 CIImage 的规定
initWithCVPixelBuffer:选项:
在核心图像编程指南中,他们提到了这个功能
利用 iOS 6.0 及更高版本对 YUV 图像的支持。 相机像素缓冲区本机是 YUV,但大多数图像处理 算法需要 RBGA 数据。两者之间的转换是有成本的 二。 Core Image 支持从 CVPixelBuffer 对象中读取 YUB 和 应用适当的颜色变换。
选项 = @{ (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];
我的图像为零。知道我错过了什么。
编辑: 我在调用之前添加了锁定和解锁基地址。另外,我转储了像素缓冲区的数据以确保像素缓冲区正确保存数据。看起来只有 init 调用有问题。仍然 CIImage 对象返回 nil。
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
CIImage *image = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:opt];
CVPixelBufferUnlockBaseAddress(pixelBuffer,0);
【问题讨论】:
-
你能解决它吗? .如果是,请发布您的解决方案
-
您好 Rugger,如果您能解决,请提供解决方案。谢谢
标签: ios objective-c ios6 core-image