如何将iPhone摄像头的实时视频源转换为灰度?

如何将iPhone摄像头的实时视频源转换为灰度?,iphone,cocoa-touch,avfoundation,Iphone,Cocoa Touch,Avfoundation,如何从iPhone摄像头中获取实时帧,将其转换为灰度,然后在我的应用程序中显示在屏幕上?您需要使用iOS 4.0,它允许您最终启动摄像头,并在帧准备就绪时将其作为原始数据接收。然后,您可以按照自己的喜好处理这些帧,并将它们显示在屏幕上 最好的办法是在登录后抓取WWDC会话409(“使用带AV基金会的摄像头”),这将使您能够在UIImagePickerController上生成自己的变体 要从RGB转换为亮度,您可能需要快速公式: brightness = (0.257 * R) + (0.504

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

您需要使用iOS 4.0,它允许您最终启动摄像头,并在帧准备就绪时将其作为原始数据接收。然后,您可以按照自己的喜好处理这些帧,并将它们显示在屏幕上

最好的办法是在登录后抓取WWDC会话409(“使用带AV基金会的摄像头”),这将使您能够在UIImagePickerController上生成自己的变体

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

brightness = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16;
它来自标准的RGB到YUV转换公式,例如。根据您将图像显示到屏幕上的方式,您可能可以直接存储这些值(例如,如果您要使用OpenGL-只需上传为亮度纹理),或者将R、G和B存储为:

1.164(brightness - 16)

(来自同一来源)

要进一步阐述Tommy所说的内容,您需要使用iOS 4.0中的AVFoundation来捕获实时相机帧。但是,我建议您直接使用OpenGL进行图像处理,否则您将无法在当前硬件上获得实时结果

对于OpenGL ES 1.1设备,我将考虑使用苹果的示例应用程序作为基础(其中有一个OpenGL灰度过滤器),并通过它运行您的实时视频帧

对于OpenGL ES 2.0,您可能希望使用可编程着色器来实现此效果。我展示了如何使用着色器通过各种过滤器处理实时iPhone摄像头数据,并对其工作原理进行了说明

在我的基准测试中,iPhone4可以使用可编程着色器以60 FPS的速度进行处理,但如果依赖CPU绑定的代码进行处理,则只能获得大约4 FPS的处理速度


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

不要进行任何类型的转换,而是使用kCVPixelFormatType_420YPCBCR8BIPLANARVIDEORAGE('420v')并抓取Y平面(Luma)数据-仅为8位:如果要使用BGRA,则在OpenGLES中上载到纹理的数据量的25%。无需进行任何类型的RGB->YUV转换,它可以在OpenGLES 1.1和2.0中工作,而无需进行混合或着色器效果。

您好,谢谢您的回答。但我有一个问题,当我尝试你给我的例子建议。。。我正在为带有iPhone3G的sdk 4.0开发。当我试着运行这个例子时,我得到了一个SIGABRT。。。是因为我使用了4.0 sdk吗?@GgSalent-iPhone 3G的GPU不支持OpenGL ES 2.0(您需要iPhone 3G s、iPhone 4、iPad或第三代或第四代iPod touch)。因此,我链接到的示例将不会在您的设备上运行。您需要从中提取相机读取代码,并将其与GLImageProcessing示例中的OpenGL ES 1.1处理例程相结合。