Android SDK:获取原始预览相机图像而不显示它
我想用原始图像进行image processing而不显示在屏幕上,这明显降低了性能。
根据这个线程的答案在没有预览的情况下从相机拍摄图片在Android 1.5中是不可能的,但是有谁知道在Android 4(API级别15)中是否可能?
在Android 4中,接收原始图像数据而不显示在屏幕上的最简单的select是使用Camera.setPreviewTexture()调用将预览帧路由到GPU。
你可以用两种方法来使用它:
- 在GPU上进行实际的处理:设置一个OpenGL上下文( OpenGL ES 2 tutorial ),并在该上下文中创build一个SurfaceTexture对象。 然后将该对象传递给setPreviewTexture,并开始预览。 然后,在您的OpenGL代码中,您可以调用SurfaceTexture.updateTexImage,并将与SurfaceTexture关联的纹理ID更新为摄像机的最新预览帧。 如果需要,您还可以使用glReadPixels将RGB纹理数据读回到CPU进一步处理。
- 在CPU上进行处理:您可以简单地创build一个虚拟的SurfaceTexture对象,而无需设置任何OpenGL上下文。 将所需的任何整数作为纹理ID传递,然后使用setPreviewTexture将SurfaceTexture连接到相机。 只要您不调用updateTexImage,SurfaceTexture将简单地丢弃相机传递给它的所有数据。 然后使用setPreviewCallback设置预览callback,并使用该数据(通常以YUV格式)进行CPU处理。 这可能比#1效率低,但不需要知道OpenGL。
由于我不允许发表评论。 关于艾迪的回答。 您需要在NDK中使用它,因为使用Java接口将会消除任何性能优势。 从性能angular度来看,必须使用PixelBuffer是绝对疯狂的。 从RGBA888到YUV的转换也需要在C中完成。
不要尝试使用TextureView会更糟糕。 在转换为YUV之前,您必须将像素复制到位图,然后从位图复制到arrays。 这本身就占据了新品Nexus 7 2013品牌几乎30%的CPU利用率。
最有效的方法是直接与Camera.h交谈并绕过所有的Android API。 您可以创build自己的缓冲区并在YUV数据到达任何其他位置之前拦截YUV数据。
在屏幕上显示预览不会产生性能影响。 在我遇到的所有设备上,相机输出“连线”到不涉及CPU的表面或纹理,所有颜色转换和缩放都由专用硬件来完成。
可能有其他原因来“隐藏”预览,但请记住,API的目的最初是为了确保最终用户能够看到从相机到应用程序的任何内容,这是出于隐私和安全原因。