android - Android camera2 CameraCharacteristics API 对于传感器尺寸的可靠性如何?

标签 android android-sensors android-camera2

我正在尝试使用 camera2 API 获取/计算设备摄像头的 FOV(我的代码在底部)。

我在 Galaxy S7 上的尝试:

  • 给定的传感器尺寸为 3.2mm x 2.4mm(使用 SENSOR_INFO_PHYSICAL_SIZE)。
  • 在这种情况下,我计算出的 HFOV 是 41.7°(给定的焦距是 4.2mm),我通过实验证明这是错误的。
  • 各种规范文档提到了 1/2.5 英寸的传感器尺寸(5.76 毫米 x 4.29 毫米,根据 wikipedia )——这将使我的 HFOV 为 68.9°,更接近我的实验。
  • CameraCharacteristics 中的值似乎有误。

在 Samsung Galaxy A3-2016 上进行相同的查询和实验更有说服力,计算出的 HFOV 似乎与实验相符。

关于 CameraCharacteristics 读数的可靠性,有没有人可以分享经验或数据?


我用来查询CameraCharacteristics的代码::

CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraID);
if (characteristics.get(CameraCharacteristics.LENS_FACING) == CameraCharacteristics.LENS_FACING_FRONT)
    continue;

int support = characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
if( support == CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY )
    Log.d("mr", "Camera " + cameraID + " has LEGACY Camera2 support");
else if( support == CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED )
    Log.d("mr", "Camera " + cameraID + " has LIMITED Camera2 support");
else if( support == CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_FULL )
    Log.d("mr", "Camera " + cameraID + " has FULL Camera2 support");
else
    Log.d("mr", "Camera " + cameraID + " has unknown Camera2 support?!");

// voir http://myandroidarchive.tistory.com/5 pour le query android
// voir http://paulbourke.net/miscellaneous/lens/ pour les maths
// include every focal length supported by the camera device, in ascending order.
float[] focalLengths = characteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
SizeF sensorSize = characteristics.get(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE);

float w = 0.5f * sensorSize.getWidth();
float h = 0.5f * sensorSize.getHeight();
Log.d("mr", "Camera " + cameraID + " has sensorSize == " + Float.toString(2.0f*w) + ", " + Float.toString(2.0f*h));
for (int focusId=0; focusId<focalLengths.length; focusId++) {
    float focalLength = focalLengths[focusId];
    float horizonalAngle = (float) Math.toDegrees(2 * Math.atan(w / focalLength));
    float verticalAngle = (float) Math.toDegrees(2 * Math.atan(h / focalLength));
    Log.d("mr", "Camera " + cameraID + "/f" + focusId + " has focalLength == " + Float.toString(focalLength));
    Log.d("mr", "  * horizonalAngle == " + Float.toString(horizonalAngle));
    Log.d("mr", "  * verticalAngle == " + Float.toString(verticalAngle));
}

最佳答案

这里是 Scanbot 的开发者(也就是我已经足够使用相机了)。

根据我的经验,Camera API 没有什么是可靠的,主要是因为此 API 是硬件和特定于供应商的相机驱动程序之上的一个相对较薄的层。换句话说,API 的输出将取决于供应商决定放在那里的内容,并且不受 Google 管理(与 Android SDK 的其余部分不同)。

关于android - Android camera2 CameraCharacteristics API 对于传感器尺寸的可靠性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40511641/

相关文章:

android - react native : Webview getUserMedia not working (onPermissionRequest override? )

android - 如何对未发布的应用程序进行 Beta 测试?

Android 自然传感器方向帮助

android - 对象在应用程序相机的边缘显得模糊

android - camera2 如何从图像读取器监听器中的 YUV_420_888 图像获取 Exif 数据

java - 没有通知的 Android 前台服务 - 如何?

java - 有没有办法让对象A表现得像对象B?

android - 在自定义应用程序中从可穿戴设备获取数据

Android 10 无法注册 Sensor.TYPE_STEP_COUNTER

java - android应用程序的内存分配问题