通过具有 16:9 传感器阵列的相机上的 android Camera2 API 捕获 4:3 相机图片

Posted

技术标签:

【中文标题】通过具有 16:9 传感器阵列的相机上的 android Camera2 API 捕获 4:3 相机图片【英文标题】:Capturing 4:3 camera picture via android Camera2 API on camera with 16:9 sensor array 【发布时间】:2015-06-08 11:23:35 【问题描述】:

我想使用 Camera2 API(在 5.0 版本的 android 中添加)从 android 正面摄像头捕捉具有 4:3 纵横比的视频。除非摄像头具有 16:9 传感器阵列(作为三星 Galaxy S5 的前置摄像头),否则它可以正常工作。在这种情况下,图片看起来像是被拉伸了 16:9 的图片并被压缩到 MediaRecorder 提供的 4:3 表面中。

根据文档,只要 MediaRecorder 的大小设置为getOutputSizes(MediaRecorder.class) 提供的大小之一,就不需要任何额外的配置。相机应自动裁剪图片,使其适合 MediaRecorder 表面的大小。

我还测试了相反的情况 - 使用 4:3 传感器阵列(Nexus-5 的前置摄像头)在相机上录制 16:9 视频。它工作正常 - 图片被裁剪为 16:9 宽高比。

我认为这是 android API 中的一个错误,但想看看这里是否有我想念的东西。

重现该问题的最简单方法是使用 google 提供的 camera2Basic 示例应用程序和以下 change 切换到使用前置摄像头和 4:3 大小进行预览。它在 Nexus-5 上正常工作,但在三星 Galaxy S5 上提供拉伸图像。下面是三星 Galaxy S5 (android 5.0) 上 camera2Basic 应用的截图。

【问题讨论】:

你知道如何解决这个问题了吗?或者在这种情况下什么都做不了? @Droidwala 我没有找到任何解决方法。 【参考方案1】:

如果图像是 16x9,您可以(并且应该)使用内置的裁剪功能来选择 4x3 的图像区域。也就是说,只需裁剪以丢弃两侧的“不必要”像素。这可以通过使用CaptureRequest.SCALER_CROP_REGION 向 CaptureRequest 添加一个字段/值来完成。

该链接对它进行了更多解释,但您真正需要的只是一个 if 语句来检查传感器的比率和一些数学运算来确定您要选择的区域的边界。

【讨论】:

我在 SCALER_CROP_REGION 设置为 4:3 的情况下进行了测试,但没有帮助。图片仍然拉伸。 SCALER_CROP_REGION 不能创造奇迹,见***.com/a/42655935/192373【参考方案2】:

您可以通过参考android camera2应用程序源代码来避免它。 https://android.googlesource.com/platform/packages/apps/Camera2/+/android-cts-5.1_r4/src/com/android/camera/one/v2/OneCameraZslImpl.java

【讨论】:

虽然这可能会回答问题,但it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。

以上是关于通过具有 16:9 传感器阵列的相机上的 android Camera2 API 捕获 4:3 相机图片的主要内容,如果未能解决你的问题,请参考以下文章

买单反相机的APS画幅 ,APS -P 、APS -H 、APS-C是啥意思?

走廊上的相机安装及调试方法

阵列相机-光场相机-AI双目测温相机-红外AI识别相机

阵列上的广播掩码操作

ALD技术,相机去噪,图像传感器

3D,激光三角法