来自 Androidcamera2 API 的图像数据在 Galaxy S5 上翻转和压缩

2023-11-24

我正在实现一个应用程序,该应用程序对来自相机的实时图像进行实时图像处理。它使用现已弃用的 android.hardware.Camera 进行工作,但有限制;为了提高灵活性和性能,我想使用新的 android.hardware.camera2 API。然而,我在获取原始图像数据进行处理时遇到了麻烦。这是在三星 Galaxy S5 上。 (不幸的是,我没有另一个 Lollipop 设备可以方便地在其他硬件上进行测试)。

我得到了整个框架(受到“HdrViewFinder”和“Camera2Basic”示例的启发)的工作,并且实时图像通过 SurfaceTexture 和 GLSurfaceView 在屏幕上绘制。但是,我还需要访问图像数据(仅灰度就可以,至少目前如此)以进行自定义图像处理。根据文档StreamConfigurationMap.isOutputSupportedFor(类),直接获取图像数据的推荐表面为图像读取器(正确的?)。

所以我将捕获请求设置为:

mSurfaceTexture.setDefaultBufferSize(640, 480);
mSurface = new Surface(surfaceTexture);
...
mImageReader = ImageReader.newInstance(640, 480, format, 2);
...
List<Surface> surfaces = new ArrayList<Surface>();
surfaces.add(mSurface);
surfaces.add(mImageReader.getSurface());
...
mCameraDevice.createCaptureSession(surfaces, mCameraSessionListener, mCameraHandler);

在 ImageReader 的 onImageAvailable 回调中,我按如下方式访问数据:

Image img = reader.acquireLatestImage();
ByteBuffer grayscalePixelsDirectByteBuffer = img.getPlanes()[0].getBuffer();

...但是,虽然(如上所述)实时图像预览正在工作,但我在此处获取的数据(或我获取数据的方式)存在问题。根据

mCameraInfo.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP).getOutputFormats();

...应支持以下图像格式:NV21、JPEG、YV12、YUV_420_888。我已经尝试了所有(插入上面的“格式”),所有都支持根据设置的分辨率getOutputSizes(format),但没有一个给出期望的结果:

  • NV21:ImageReader.newInstance 抛出 java.lang.IllegalArgumentException:不支持 NV21 格式
  • JPEG:这确实有效,但对于实时应用程序来说,对每一帧进行 JPEG 编码和解码似乎没有意义......
  • YV12 和 YUV_420_888:这是最奇怪的结果——我可以看到得到灰度图像,但它是垂直翻转(是的,翻转,而不是旋转!)并且显着squished(在水平方向上显着缩放,但在垂直方向上没有缩放)。

我在这里缺少什么?是什么导致图像翻转和压扁?如何获得几何上正确的灰度缓冲区?我应该使用不同类型的表面(而不是 ImageReader)吗?

任何提示表示赞赏。


我找到了一个解释(虽然不一定是令人满意的解决方案):事实证明,传感器阵列的纵横比是 16:9(通过发现mCameraInfo.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);).

至少在请求 YV12/YUV_420_888 时,流媒体似乎不会以任何方式裁剪图像,而是不均匀地缩放图像,以达到请求的帧大小。当请求 16:9 格式时,图像具有正确的比例(不幸的是,其中只有两个更高分辨率的格式)。对我来说这似乎有点奇怪——当请求 JPEG、或使用等效的旧相机 API 函数或静态照片时,似乎不会发生这种情况;我不确定非均匀缩放的框架有什么用处。

我觉得这不是一个真正令人满意的解决方案,因为这意味着您不能依赖输出格式列表,而必须首先找到传感器尺寸,找到具有相同宽高比的格式,然后自己对图像进行下采样(如所须)...

我不知道这是预期的结果还是 S5 的“功能”。仍然欢迎提出意见或建议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自 Androidcamera2 API 的图像数据在 Galaxy S5 上翻转和压缩 的相关文章

随机推荐