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

11

我知道AVFoundation及其采集支持(虽然不太熟悉)。但是,我没有看到任何可以轻松获取每个像素数据的API(例如每个像素的RGB值)。我记得在文档中读到过这是可能的,但我真的不知道如何操作。所以:

  1. 这可行吗?如果可以,怎么做?
  2. 我将获得原始图像数据还是已经进行了JPEG压缩的数据?

2个回答

32

AV Foundation可以为由视频或静态相机捕获的图像提供原始字节。您需要使用适当的AVCaptureDevice和相应的AVCaptureDeviceInput和AVCaptureDeviceOutput(AVCaptureVideoDataOutput或AVCaptureStillImageOutput)设置AVCaptureSession。苹果在其文档中提供了一些示例,这需要一些样板代码进行配置。

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

我有一个使用此功能的示例应用程序(链接),但我建议您也查看我的开源框架,它封装了标准AV Foundation模板,并使在GPU上执行图像处理变得容易。根据您想要对这些原始相机字节执行的操作,我可能已经有可以使用的内容或比在CPU上处理更快的方法。


3
终于做到了...你在这里发布的代码真的很有帮助: https://dev59.com/omgu5IYBdhLWcg3wDS-j#11615472谢谢! - FeifanZ
你能解释一下我应该在这个函数的输入中提供什么吗?AlprResults recognize(unsigned char* pixelData, int bytesPerPixel, int imgWidth, int imgHeight, std::vector<AlprRegionOfInterest> regionsOfInterest); 我只理解了pixelDataregionsOfInterest这两个点。 - Alexander Yakovlev
@SashaKid - 我不知道那个函数是做什么的,而且听起来像是完全不同的问题。 - Brad Larson
@BradLarson,您能帮忙获取GPUImage2中的颜色吗?目前,我已经通过SolidColorGenerator从RenderView获取了平均颜色的输出。但我不知道如何从中获取UIColor。您能帮我吗? - WINSergey
1
@WINSergey - 如果您只需要一个平均颜色,则AverageColorExtractor将提供一个回调函数,返回平均颜色的RGBA组件。如果您需要屏幕上特定像素的颜色,则可以附加一个RawDataOutput来提取图像的原始字节,并拉出相应于所需像素的字节。 - Brad Larson

-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);
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接