Android camera2到帧缓冲锯齿图像?

问题描述 投票:0回答:1

与使用ImageReader(OpenGL-黑白,ImageReader-彩色)保存摄像机框架相比,为什么使用OpenGL渲染摄像机框架(然后将其保存)会产生锯齿图像?两者都使用相同的尺寸。

enter image description here

此问题的背景/细节:

我正在使用Camera2和GLES(不超过GLES31)构建ImageReader的非阻塞版本,目的是在不中断预览的情况下提取高分辨率的静态相机帧。

该设置使用TextureView进行预览,并使用GLSurfaceView捕获屏幕外的帧。 GLSurfaceView具有一个简单的渲染器和着色器,可将GL_TEXTURE_EXTERNAL_OES绘制到可从中提取原始图像数据的帧缓冲区。

在我的测试设备上,尺寸设置如下:相机传感器尺寸为3264x2448(通过CameraCharacteristics获得)

GLSurfaceView具有defaultBufferSize 3264x2448和布局3264x2448。格式也通过getHolder()。setFormat(ImageFormat.JPEG)设置为JPEG,并且JPEG质量为100

帧缓冲区设置为3264x2448

在我看来,这将导致相机框架以1对1的方式转移,但显然不是这种情况。

我尝试了其他几个尺寸,例如匹配屏幕尺寸,从StreamConfigurationMap中选择合适的尺寸,自定义尺寸,所有这些都会导致锯齿状输出。好像总是在后台进行一些上采样或下采样(GL_TEXTURE_EXTERNAL_OES实际上以不同的尺寸出现?)。

感谢您对此主题的任何投入,因为我在这一点上已经坚持了数周。

与使用ImageReader(OpenGL-黑白,ImageReader-彩色)保存摄像机框架相比,为什么使用OpenGL渲染摄像机框架(然后将其保存)会产生锯齿图像?两者都使用相同的...

android opengl-es opengl-es-2.0 android-camera2
1个回答
0
投票

您是否使用SurfaceTexture提供的变换矩阵来变换GL中的纹理输入?由于某些渲染路径中的某些复杂性,默认变换将图像的边框缩小1个像素:

© www.soinside.com 2019 - 2024. All rights reserved.