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

我正在尝试使用camera2 API获取/计算设备摄像机的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) – 这将给我一个68.9°的HFOV,更接近我的实验.
> Cameracharacteristics中的值似乎有误.

三星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的输出将取决于供应商决定放在哪里,而不是(与Android SDK的其他部分不同)由Google管理.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...