2011-10-01 33 views
1

使用Android(2.3.3)手机,我可以使用相机以onPreviewFrame(byte[] data, Camera camera)方法检索预览以获取YUV图像。使用NDK在Android中实时图像处理

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

现在,使用NDK,我想加快速度。问题是:如何将YUV数组转换为C中的RGB数组?有没有一种方法可以在本地代码中显示它(使用OpenGL或许?)?实时应该是可能的(Qualcomm AR演示向我们展示了这一点)。我不能使用setTargetDisplay并在其上覆盖!

我知道Java的,最近开始了Android SDK和在C零经验

回答

3

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

+0

哇,在整个搜索过程中,OpenCV永远不会弹出! (以前在纯C++中使用它)我不知道他们有一个Android端口。谢谢你的提示;根据我在示例应用程序中看到的,它具有我需要的功能,并且人脸检测功能可以实时接近! *进一步挖掘OpenCV * 非常感谢=) – Knots

+0

没问题!很高兴我能帮忙=)并且,玩得开心! – mevatron

0

谷歌搜索的C实现YUV-> RGB565的返回this page。作者甚至为它包含了JNI包装器。

+0

确实,我已经找到了这一个,尽管我似乎无法得到它的工作。让我先试试OpenCV库,因为它们已经有很多图像处理代码=)谢谢! – Knots

0

您也可以继续使用Java。我为androangelo-app的imagedetecton做了这个。 我使用了通过搜索“decodeYUV”在这里找到的示例代码。

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

我所做的只是在yuvtorgb解码之后使用每隔一行和每一列。所以处理一张320 * 240的图像效果很好,可以让我获得20fps的帧率。 (包括一些降噪,从rgb到hsv的颜色转换和圆检测)

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

结果您可以检查androangelo-app的校准屏幕。在那里,我在相机预览中覆盖了检测到的图像。