来自Android Camera2 API的图像数据在Galaxy S5上翻转和挤压

发布时间:2022-07-12 / 作者:清心寡欲
本文介绍了来自android Camera2 API的图像数据在Galaxy S5上翻转和挤压的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在实现一个应用程序,它使用实时图像处理来自相机的实时图像。它正在使用现在已弃用的android.hardware.Camera;进行工作,但有局限性。为了提高灵活性和性能,我想使用新的android.hardware.camera2 API。然而,我在获取原始图像数据以进行处理时遇到了困难。这是一部三星Galaxy S5手机。(遗憾的是,我手头没有另一台棒棒糖设备可以在其他硬件上测试)。

我得到了整个框架(灵感来自‘HdrViewFinder’和‘Camera2Basic’示例),并通过SurfaceTexture和GLSurfaceView在屏幕上绘制了实时图像。但是,我还需要访问图像数据(仅灰度图像就可以了,至少目前是这样),以便进行自定义图像处理。根据StreamConfigurationMap.isOutputSupportedFor(class)的文档,建议直接获取图像数据的表面应为ImageReader(对吗?)。

因此,我已将捕获请求设置为:

mSurfaceTexture.setDefaultBufferSize(640, 480);
mSurface = new Surface(surfaceTexture);
...
mImageReader = ImageReader.newInstance(640, 480, format, 2);
...
List surfaces = new ArrayList();
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();
...应支持以下ImageFormats:NV21、JPEG、YV12、YUV_420_888。我已经尝试了所有(插入上面的‘Format’),都支持getOutputSizes(format)设置的分辨率,但都没有给出想要的结果:
  • NV21:ImageReader.newInstance抛出java.lang.IlLegalArgumentException:不支持NV21格式
  • JPEG:这确实有效,但对于实时应用程序来说,对每一帧进行JPEG编码和解码似乎没有意义...
  • YV12和YUV_420_888:这是最奇怪的结果--我可以看到得到灰度图像,但它是垂直翻转的(是的,翻转,而不是旋转!)并且显著挤压(显著水平缩放,但不垂直缩放)。

我在这里错过了什么?是什么导致图像被翻转和挤压?我怎样才能得到几何上正确的灰度缓冲区?我是否应该使用其他类型的图面(而不是ImageReader)?

感谢任何提示。

推荐答案

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

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

我觉得这并不是一个真正令人满意的解决方案,因为这意味着你不能依靠输出格式列表,而是必须首先找到传感器大小,找到相同宽高比的格式,然后自己(根据需要)对图像进行下采样...

我不知道这是预期中的结果,还是S5的一个‘功能’。仍欢迎提出意见或建议。

这篇关于来自Android Camera2 API的图像数据在Galaxy S5上翻转和挤压的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持吉威生活!



[英文标题]Image data from Android camera2 API flipped & squished on Galaxy S5


声明:本媒体部分图片、文章来源于网络,版权归原作者所有,如有侵权,请联系QQ:330946442删除。