我正在试着从苹果的ARKit上买一部RGB色彩空间的CVPixelBuffer。在ARSessionDelegate的func session(_ session: ARSession, didUpdate frame: ARFrame)方法中,我得到了ARFrame的一个实例。在Displaying an AR Experience with Metal页面上,我发现这个像素缓冲区在YCbCr (YUV)颜色空间中。
我需要将其转换为RGB色彩空间(我实际上需要CVPixelBuffer而不是UIImage)。我在iOS上找到了关于颜色转换的something,但我无法在Swift 3中使用它。
发布于 2017-06-12 03:16:02
有几种方法可以做到这一点,这取决于你想要什么。实时执行此操作的最佳方法(即,将缓冲区渲染到视图)是使用自定义着色器将YCbCr CVPixelBuffer转化为RGB。
使用金属的:如果你创建一个新项目,选择“增强现实应用程序”,并为内容技术选择“金属”,生成的项目将包含进行此转换所需的代码和着色器。
使用OpenGL的:来自苹果的GLCameraRipple example使用AVCaptureSession来捕捉摄影机,并展示了如何将生成的CVPixelBuffer映射到GL纹理,然后在着色器中将其转化为RGB (同样,在示例中提供)。
非实时:解决了this stackoverflow question地址将缓冲区转换为UIImage的问题,并提供了一种非常简单的方法。
发布于 2017-06-27 10:59:07
我在这个问题上也坚持了几天。我在网上能找到的所有代码片段都是用Objective-C而不是Swift编写的,关于CVPixelBuffer到UIImage的转换。
最后,下面的代码片段非常适合我,它可以将YUV图像转换为JPG或PNG文件格式,然后可以将其写入应用程序中的本地文件。
func pixelBufferToUIImage(pixelBuffer: CVPixelBuffer) -> UIImage {
let ciImage = CIImage(cvPixelBuffer: pixelBuffer)
let context = CIContext(options: nil)
let cgImage = context.createCGImage(ciImage, from: ciImage.extent)
let uiImage = UIImage(cgImage: cgImage!)
return uiImage
}发布于 2017-06-17 04:25:07
docs明确表示您需要访问亮度和色度平面:
ARKit捕获平面YCbCr格式(也称为YUV)格式的像素缓冲区。要在设备显示器上渲染这些图像,需要访问像素缓冲区的亮度和色度平面,并将像素值转换为RGB格式。
所以没有办法直接获得RGB平面,你必须在你的着色器中处理这个问题,无论是在金属中还是在@joshue描述的openGL中
https://stackoverflow.com/questions/44416089
复制相似问题