使用NDK在Android中进行实时图像处理

使用Android(2.3.3)手机,我可以使用相机通过onPreviewFrame(byte[] data, Camera camera)方法检索预览,以获取YUV图像。

对于某些图像处理,我需要将此数据转换为RGB图像并在设备上显示。 使用基本的java / android方法,运行速度低于5 fps ……

现在,使用NDK,我想加快速度。 问题是:如何将YUV数组转换为C中的RGB数组? 有没有办法在本机代码中显示它(也许使用OpenGL?)? 实时应该是可能的(Qualcomm AR演示向我们展示了这一点)。

我无法使用setTargetDisplay并在其上添加叠加层!

我知道Java,最近开始使用Android SDK并且没有C的经验

您是否考虑过使用OpenCV的Android端口 ? 它可以做的不仅仅是颜色转换,而且速度非常快。

Google搜索返回此页面以获取YUV-> RGB565的C实现。 作者甚至为它添加了JNI包装器。

您也可以通过使用Java获得成功。 我为androangelo-app的imagedetectíon做了这个。 我通过搜索“decodeYUV”使用了您在此处找到的示例代码。

为了处理帧,要考虑的基本部分是图像大小。 根据设备的不同,您可能会获得相当大的图像。 即对于Galaxy S2,支持的最小预览为640 * 480。 这是一个很大的像素。

我所做的是,在yuvtorgb解码之后,只使用每隔一行和每隔一列。 因此,处理320 * 240图像的效果非常好,并且允许我获得20fps的帧速率。 (包括一些降噪,从rgb到hsv的颜色转换和圆形检测)

此外,您应仔细检查提供给setPreview函数的图像缓冲区的大小。 如果它太小,垃圾收集将破坏一切。

为了获得结果,您可以查看androangelo-app的校准屏幕。 在那里,我在摄像机预览上覆盖了检测到的图像。