我知道AVFoundation及其采集支持(虽然不太熟悉)。但是,我没有看到任何可以轻松获取每个像素数据的API(例如每个像素的RGB值)。我记得在文档中读到过这是可能的,但我真的不知道如何操作。所以:
- 这可行吗?如果可以,怎么做?
- 我将获得原始图像数据还是已经进行了JPEG压缩的数据?
我知道AVFoundation及其采集支持(虽然不太熟悉)。但是,我没有看到任何可以轻松获取每个像素数据的API(例如每个像素的RGB值)。我记得在文档中读到过这是可能的,但我真的不知道如何操作。所以:
AV Foundation可以为由视频或静态相机捕获的图像提供原始字节。您需要使用适当的AVCaptureDevice和相应的AVCaptureDeviceInput和AVCaptureDeviceOutput(AVCaptureVideoDataOutput或AVCaptureStillImageOutput)设置AVCaptureSession。苹果在其文档中提供了一些示例,这需要一些样板代码进行配置。
一旦您配置好捕获会话并从相机捕获数据,您将设置一个 -captureOutput:didOutputSampleBuffer:fromConnection:
代理方法,其中一个参数将是CMSampleBufferRef。它将包含一个CVImageBufferRef,您可以通过 CMSampleBufferGetImageBuffer()
访问它。使用该像素缓冲区的 CVPixelBufferGetBaseAddress()
将返回表示相机帧的原始像素数据的字节数组的基地址。这可以有几种不同的格式,但最常见的是BGRA和平面YUV。
我有一个使用此功能的示例应用程序(链接),但我建议您也查看我的开源框架,它封装了标准AV Foundation模板,并使在GPU上执行图像处理变得容易。根据您想要对这些原始相机字节执行的操作,我可能已经有可以使用的内容或比在CPU上处理更快的方法。
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);
}
AlprResults recognize(unsigned char* pixelData, int bytesPerPixel, int imgWidth, int imgHeight, std::vector<AlprRegionOfInterest> regionsOfInterest);
我只理解了pixelData
和regionsOfInterest
这两个点。 - Alexander Yakovlev