来自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 Camera2捕获歪斜的图像

来自分类Dev

Android Camera2 空预览图像

来自分类Dev

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

来自分类Dev

Android Camera2 API和EXIF

来自分类Dev

Android Camera2 同步图像和元数据

来自分类Dev

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

来自分类Dev

Android Camera2 API - 覆盖旧图像

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Android API 21+ Camera2 API

来自分类Dev

Android Camera2 API手动曝光更改

来自分类Dev

Android Camera2 API聚焦距离校准

来自分类Dev

Android Camera2 API-检测何时关注

来自分类Dev

在Android Vision API中切换到Camera2

来自分类Dev

Android Camera2 API手动曝光更改

来自分类Dev

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

来自分类Dev

Android Camera2 API 中的等效 canDisableShutterSound 方法

来自分类Dev

Android 5,camera2仅使用闪光灯

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Android JavaCV + Camera2

来自分类Dev

Android Camera2 getPreviewFrame

来自分类Dev

Android Camera2示例

来自分类Dev

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

来自分类Dev

Camera2 API 问题

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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