iOS:从相机获取逐像素数据
Posted
技术标签:
【中文标题】iOS:从相机获取逐像素数据【英文标题】:iOS: Get pixel-by-pixel data from camera 【发布时间】:2012-06-02 19:05:03 【问题描述】:我知道 AVFoundation 及其捕获支持(虽然不太熟悉)。但是,我没有看到任何易于访问的 API 来获取逐像素数据(每像素 RGB 或类似数据)。我确实记得在文档中读到这是可能的,但我真的不知道如何。所以:
-
可以这样做吗?如果有,怎么做?
我会获取原始图像数据还是 JPEG 压缩数据?
【问题讨论】:
【参考方案1】: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 上处理更快的方法。
【讨论】:
终于解决了这个问题……您在此处发布的代码确实很有帮助:***.com/a/11615472/472768 谢谢! 你能解释一下在这种情况下我应该在输入这个函数时提供什么吗?AlprResults recognize(unsigned char* pixelData, int bytesPerPixel, int imgWidth, int imgHeight, std::vector<AlprRegionOfInterest> regionsOfInterest);
我只了解pixelData
和regionsOfInterest
的观点。
@SashaKid - 我不知道那个函数是做什么的,这听起来像是一个完全独立的问题。
@BradLarson 你能帮忙从 GPUImage2 获取颜色吗?目前,我已经完成了从 SolidColorGenerator 到 RenderView 的平均颜色输出。但我不知道如何从中获取 UIColor 。你能帮帮我吗?
@WINSergey - 如果您只需要平均颜色,AverageColorExtractor 将提供一个回调,返回平均颜色的 RGBA 分量。如果您需要屏幕上特定像素的颜色,您可以附加 RawDataOutput 来提取图像的原始字节并提取与您想要的像素对应的字节。【参考方案2】:
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);
【讨论】:
以上是关于iOS:从相机获取逐像素数据的主要内容,如果未能解决你的问题,请参考以下文章