如何将实时视频输入从iPhone相机转换为灰度?

时间:2010-12-07 20:59:27

标签: iphone cocoa-touch avfoundation

我如何从iPhone相机中获取实时帧,将它们转换为灰度,然后在我的应用程序中将它们显示在屏幕上?

3 个答案:

答案 0 :(得分:5)

你需要使用iOS 4.0,它允许你 - 最后 - 只是启动相机并在它们准备就绪时接收帧作为原始数据。然后,您可以根据需要处理帧,并根据需要将它们放在屏幕上。

最好的办法是在登录here后获取WWDC会话409(“使用带AV基础的摄像头”),这样可以让你在UIImagePickerController上生成自己的变种。

要从RGB转换为亮度,您可能需要快速公式:

brightness = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16;

它来自标准的RGB到YUV转换公式,例如described here。根据您将图像设置为屏幕的方式,您可以直接存储这些值(例如,如果您要使用OpenGL - 只需上传为亮度纹理)或将R,G和B存储为:< / p>

1.164(brightness - 16)

(来自同一个来源)

答案 1 :(得分:4)

不使用任何类型的转换,而是使用kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange('420v')并获取Y-Plane(Luma)数据 - 这只是8位:您要上传到纹理的数据量的25%在OpenGLES中,如果你使用BGRA。无需进行任何类型的RGB-&gt; YUV转换,它可以在OpenGLES 1.1和2.0中工作,而无需进行混合或着色效果。

答案 2 :(得分:2)

为了扩展Tommy所说的内容,你需要在iOS 4.0中使用AVFoundation来捕捉实时相机帧。但是,我建议直接使用OpenGL进行图像处理,否则你将无法在当前硬件上实现实时结果。

对于OpenGL ES 1.1设备,我将使用Apple的GLImageProcessing示例应用程序作为基础(其中包含一个OpenGL灰度过滤器)并通过它运行实时视频帧。

对于OpenGL ES 2.0,您可能希望使用可编程着色器来实现此效果。我将展示如何使用着色器通过this sample application中的各种过滤器处理实时iPhone相机数据,并详细说明其工作原理here

在我的基准测试中,iPhone 4可以使用可编程着色器以60 FPS进行此处理,但如果依靠CPU绑定代码执行此操作,则只能获得大约4 FPS。

自从我上面写了以后,我现在创建了an open source framework封装了这个OpenGL ES 2.0视频处理,并且它有一个内置的灰度过滤器,您可以使用它。您可以使用应用于视频源的GPUImageGrayscaleFilter快速转换为黑白,或使用GPUImageSaturationFilter以受控量选择性地对此视频进行去饱和处理。查看SimpleVideoFilter示例,了解如何将其应用于实时视频源,然后将其录制到磁盘。