来自Android camera2 API的图像数据在Galaxy S5上翻转并压缩

史蒂芬·G。

我正在实现一个应用程序,该应用程序对相机的实时图像使用实时图像处理。使用现在不推荐使用的android.hardware.Camera,它有一定的局限性。为了提高灵活性和性能,我想使用新的android.hardware.camera2 API。但是,我无法获取原始图像数据进行处理。这是在三星Galaxy S5上。(不幸的是,我没有方便的其他Lollipop设备可以在其他硬件上进行测试)。

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

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

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();

...应支持以下ImageFormat:NV21,JPEG,YV12,YUV_420_888。我已经尝试了所有方法(为上述“格式”插入了插件),都支持根据设置分辨率getOutputSizes(format),但是没有一个能够提供理想的结果:

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

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

任何提示表示赞赏。

史蒂芬·G。

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

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

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

我不知道这是这里的预期结果还是S5的“功能”。评论或建议仍然欢迎。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Android L-使用Camera2 API自动对焦拍摄闪光灯图像

来自分类Dev

使用Android L和Camera2 API的相机预览图像数据处理

来自分类Dev

Android 5,camera2仅使用闪光灯

来自分类Dev

我应该为Android使用Camera2还是Camera API?

来自分类Dev

Android Camera2 API和EXIF

来自分类Dev

如何使用Android Camera2 API捕获单个图像?

来自分类Dev

Android Camera2 API聚焦距离校准

来自分类Dev

Android Camera2 API-检测何时关注

来自分类Dev

Android Camera2 getPreviewFrame

来自分类Dev

Android Camera2 API手动曝光更改

来自分类Dev

Android API 21+ Camera2 API

来自分类Dev

Android Camera2捕获歪斜的图像

来自分类Dev

在Android Vision API中切换到Camera2

来自分类Dev

Android JavaCV + Camera2

来自分类Dev

使用Android camera2 API打开/关闭闪光灯不起作用

来自分类Dev

Android Camera2 API切换回-前置摄像头

来自分类Dev

三星Galaxy S7支持什么级别的Android Camera2 API

来自分类Dev

Android Camera2在TextureView上显示黑色和扭曲的JPEG图像?

来自分类Dev

Android Camera2示例

来自分类Dev

Android Camera2 API手动曝光更改

来自分类Dev

Android Camera2图像处理:什么是几何校正?

来自分类Dev

使用Android Camera2 API快速捕获闪光/不闪光图像

来自分类Dev

使用Android Camera2 API在后台捕获视频

来自分类Dev

Android Camera2 空预览图像

来自分类Dev

Android Camera2 API 中的等效 canDisableShutterSound 方法

来自分类Dev

Android Camera2 API - 覆盖旧图像

来自分类Dev

如何在预览到 Android Camera2 API 期间获取指向每个帧数据的指针?

来自分类Dev

Camera2 API 问题

来自分类Dev

Android Camera2 同步图像和元数据