Android SDK:获取原始预览相机图像而不显示它

时间:2012-05-27 17:33:54

标签: android

我想用原始图像进行图像处理而不在屏幕上显示,这显然会降低性能。

根据此帖子Taking picture from camera without preview的答案,这在Android 1.5中是不可能的,但有人知道它是否可以在Android 4(API级别15)中使用?

3 个答案:

答案 0 :(得分:45)

在Android 4中,接收原始图像数据而不在屏幕上显示它的最简单方法是使用Camera.setPreviewTexture()调用将预览帧路由到GPU。

您可以通过两种方式使用它:

  1. 在GPU上进行实际处理:设置OpenGL上下文(OpenGL ES 2 tutorial),并在该上下文中创建SurfaceTexture对象。然后将该对象传递给setPreviewTexture,并开始预览。然后,在OpenGL代码中,您可以调用SurfaceTexture.updateTexImage,并且与SurfaceTexture关联的纹理ID将更新为相机的最新预览帧。如果需要,您还可以使用glReadPixels将RGB纹理数据读回CPU,以便进一步处理。
  2. 在CPU上进行处理:您可以简单地创建一个虚拟SurfaceTexture对象,而无需设置任何OpenGL上下文。将任何所需的整数作为纹理ID传递,并使用setPreviewTexture将SurfaceTexture连接到相机。只要您不调用updateTexImage,SurfaceTexture就会丢弃相机传入其中的所有数据。然后使用setPreviewCallback设置预览回调,并使用该数据(通常采用YUV格式)进行CPU处理。这可能不如#1效率低,但不需要知道OpenGL。

答案 1 :(得分:1)

因为我不被发表评论。关于艾迪的回答。您需要在NDK中使用它,因为使用Java接口将抵消任何性能优势。从性能的角度来看,必须使用PixelBuffer绝对是疯了。您从RGBA888到YUV的转换也需要在C中完成。

不要尝试使用TextureView,因为情况会更糟。在转换为YUV之前,您必须将像素复制到位图中,然后从位图复制到数组中。这本身就占据了新品牌Nexus 7 2013的cpu利用率的近30%。

最有效的方法是直接与Camera.h对话并绕过所有Android API。您可以创建自己的缓冲区并在YUV数据进入其他任何地方之前拦截它们。

答案 2 :(得分:1)

在屏幕上显示预览不会产生性能影响。在我遇到的所有设备上,相机输出“连线”到表面或纹理,不涉及CPU,所有颜色转换和缩放由专用硬件处理。

可能有其他原因“隐藏”预览,但请记住,API的目的最初是为了确保最终用户看到从相机到应用程序的任何内容,出于隐私和安全原因。