使用 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 教程,因为这需要相当多的代码。
我正在使用 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 教程,因为这需要相当多的代码。