相机图像上的CPU处理

时间:2016-02-11 15:11:28

标签: android opengl-es android-camera

目前,我在屏幕上显示相机的预览,提供相机预览纹理 - camera.setPreviewTexture(...)(当然使用opengl进行)。

我有一个本地库,它将bytes[]作为图像,并返回byte[] - 与输入图像相关的结果图像。我想调用它,然后将输入图像和结果绘制到屏幕上 - 一个在另一个上。

我知道在Opengl中,为了在CPU中获取纹理数据,我们必须使用glReadPixel读取它,并且在处理之后我将必须将结果加载到纹理 - 这将有很大的每帧都会对表现产生影响。

我考虑过使用camera.setPreviewCallback(...),我正在获取框架(调用处理方法并将结果传输到我的SurfaceView),并行继续使用纹理预览技术在屏幕上绘图,但我害怕在previewCallback中得到的帧与纹理中得到的帧之间同步。

我错过了什么吗?或者没有简单的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

一种可能有用的方法是将摄像机的输出定向到提供Surface的ImageReader。发送到Surface的每个帧都可以作为YUV数据使用而无需复制,这使得它比某些替代方案更快。颜色格式的变化(步幅,对齐,交错)由ImageReader处理。

由于您希望摄像机图像与处理输出同时显示,因此您无法沿两条独立路径发送帧。

框架准备就绪后,您需要进行色彩空间转换并使用glTexImage2D()上传像素。这可能是性能限制因素。

从评论中可以看出,您熟悉使用片段着色器的图像过滤;对于发现此问题的其他人,您可以看到示例here