10

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

  1. 这可以做到吗?如果是这样,怎么做?
  2. 我会得到原始图像数据,还是 JPEG 压缩的数据?
4

2 回答 2

32

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

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

我在这里有一个使用它的示例应用程序,但我建议您也看看我的开源框架,它封装了标准的 AV Foundation 样板,并且可以轻松地在 GPU 上执行图像处理。根据你想用这些原始相机字节做什么,我可能已经有了一些你可以在那里使用的东西,或者一种比 CPU 处理更快的方法。

于 2012-06-02T19:20:47.573 回答
-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);
 }
于 2015-03-09T12:26:30.927 回答