使用 Camera2 预览处理后的图像

Previewing processed image with Camera2

我正在使用 Camera2 basic sample。我希望用 openCV 做一些基本的图像处理。

This question 讨论了同样的问题,但答案只谈到 通过 ImageReader 获取 预览帧。

我的问题是
是否可以在 rendered/displayed 到 SurfaceTexture 之前处理图像帧。

ImageReader 在您从它获取的每个图像中为您提供一组 ByteBuffer;您可以在 Java 或本机代码中对它们进行操作。

最简单的情况是捕获 JPEG 并将其保存到磁盘,但您也可以请求 YUV_420_888 数据,然后根据需要进行处理。

编辑回复评论:

如果您已经从 TextureView 获取了 SurfaceTexture,并将其传递给相机,那么您就无法拦截中间的缓冲区。 如果你想修改它们,那么你需要创建一个相机发送缓冲区的中间目标,编辑它们,然后将它们发送到 TextureView 进行显示。

有几种选择。可能最有效的方法是在中间使用 EGL:

Camera -> SurfaceTexture -> EGL -> SurfaceTexture -> TextureView

这需要大量样板代码来创建 EGL 上下文,但如果您的编辑可以编写为 EGL 着色器,则效果很好。 如果我没记错的话,你可以通过从它创建一个 EGLImage 来渲染到 TextureView 给定的 SurfaceTexture,然后你可以创建另一个 SurfaceTexture 传递给相机,你在 EGL 着色器中将其用作渲染的纹理。

我建议查找 EGL 教程,因为这需要相当多的代码。