iOS:从相机获取逐像素数据

时间:2012-06-02 19:05:04

标签: iphone ios camera avfoundation pixel

我知道AVFoundation及其捕获支持(虽然不太熟悉)。但是,我没有看到任何易于访问的API来获取逐像素数据(每像素RGB或类似数据)。我记得在文档中读到这是可能的,但我真的不知道如何。所以:

  1. 可以这样做吗?如果是这样,怎么样?
  2. 我是否会获取原始图像数据或JPEG压缩数据?

2 个答案:

答案 0 :(得分:31)

AV Foundation可以为您提供视频或静态相机拍摄的图像的原始字节。您需要使用适当的AVCaptureDevice和相应的AVCaptureDeviceInput和AVCaptureDeviceOutput(AVCaptureVideoDataOutput或AVCaptureStillImageOutput)设置AVCaptureSession。 Apple在他们的文档中有一些这个过程的例子,它需要一些样板代码来配置。

配置捕获会话并从摄像头捕获数据后,您将设置-captureOutput:didOutputSampleBuffer:fromConnection:委托方法,其中一个参数将是CMSampleBufferRef。这将有一个CVImageBufferRef,您可以通过CMSampleBufferGetImageBuffer()访问它。在该像素缓冲区上使用CVPixelBufferGetBaseAddress()将返回表示相机帧的原始像素数据的字节数组的基址。这可以是几种不同的格式,但最常见的是BGRA和平面YUV。

我有一个使用此here的示例应用程序,但我建议您也查看my open source framework包装标准AV Foundation样板并使其易于执行图像处理GPU。根据您对这些原始相机字节的要求,我可能已经有了一些可以在那里使用的东西,或者比使用CPU处理更快的方法。

答案 1 :(得分:-4)

 lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
 float luminance = dot(textureColor.rgb, W);

 mediump vec2 p = textureCoordinate;
 if (p.x == 0.2 && p.x<0.6 && p.y > 0.4 && p.y<0.6) {
     gl_FragColor = vec4(textureColor.r * 1.0, textureColor.g * 1.0, textureColor.b * 1.0, textureColor.a);
 } else {
   gl_FragColor = vec4(textureColor.r * 0.0, textureColor.g * 0.0, textureColor.b * 0.0, textureColor.a *0.0);
 }