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

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

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

AV基金会可以为您提供由video或静止照相机拍摄的图像的原始字节。 您需要使用适当的AVCaptureDevice和相应的AVCaptureDeviceInput和AVCaptureDeviceOutput(AVCaptureVideoDataOutput或AVCaptureStillImageOutput)来设置AVCaptureSession。 苹果在他们的文档中有这个过程的一些例子,它需要一些样板代码来configuration。

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

我有一个在这里使用这个示例应用程序,但我build议你也看看我的开放源代码框架 ,它包装标准的AV基础样板,并使其在GPU上执行image processing很容易。 根据你想要用这些原始相机字节做什么,我可能已经有了一些你可以使用的东西,或者比CPU上的处理快得多。

  lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); float luminance = dot(textureColor.rgb, W); mediump vec2 p = textureCoordinate; if (px == 0.2 && px<0.6 && py > 0.4 && py<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); }