Android camera2 CameraCharacteristics API 传感器尺寸的可靠性如何?
How reliable is Android camera2 CameraCharacteristics API for sensor size?
我正在尝试使用 camera2
API 我底部的代码 get/compute 设备摄像头的 FOV。
关于我对 Galaxy S7 的尝试:
- 给定的传感器尺寸为 3.2mm x 2.4mm(使用
SENSOR_INFO_PHYSICAL_SIZE
)。
- 在这种情况下,我计算出的HFOV是41.7°(给定的焦距是4.2mm),我通过实验证明是错误的。
- 各种规格文档提到 1/2.5" 传感器尺寸(根据 wikipedia 为 5.76mm x 4.29mm)- 这将使我的 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 的开发者(又名我用相机工作够了)。
根据我的经验,关于相机 API 的任何内容都不可靠,主要是因为此 API 是硬件和供应商特定相机驱动程序上的一个相对较薄的层。换句话说,API 的输出将取决于供应商决定放在那里的内容,而不是由 Google.
管理的(与 Android SDK 的其余部分不同)。
我正在尝试使用 camera2
API 我底部的代码 get/compute 设备摄像头的 FOV。
关于我对 Galaxy S7 的尝试:
- 给定的传感器尺寸为 3.2mm x 2.4mm(使用
SENSOR_INFO_PHYSICAL_SIZE
)。 - 在这种情况下,我计算出的HFOV是41.7°(给定的焦距是4.2mm),我通过实验证明是错误的。
- 各种规格文档提到 1/2.5" 传感器尺寸(根据 wikipedia 为 5.76mm x 4.29mm)- 这将使我的 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 的开发者(又名我用相机工作够了)。
根据我的经验,关于相机 API 的任何内容都不可靠,主要是因为此 API 是硬件和供应商特定相机驱动程序上的一个相对较薄的层。换句话说,API 的输出将取决于供应商决定放在那里的内容,而不是由 Google.
管理的(与 Android SDK 的其余部分不同)。