首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么是安卓Camera2 API等同于Camera.Parameters.getHorizontalViewAngle()和Camera.Parameters.getVerticalViewAngle()?

什么是安卓Camera2 API等同于Camera.Parameters.getHorizontalViewAngle()和Camera.Parameters.getVerticalViewAngle()?
EN

Stack Overflow用户
提问于 2016-10-10 19:29:20
回答 2查看 5.5K关注 0票数 9

所有这些都在标题中,但是在现在不受欢迎的Android中,有两种方法: Camera.Parameters.getHorizontalViewAngle()和Camera.Parameters.getVerticalViewAngle()。

现在,使用当前的Camera2 API,在文档中似乎不存在与这些API等价的内容。我认为这是因为FOV角度比简单的水平和垂直值更复杂和细微,但我无法在网上找到任何信息,说明如何使用更新的Camera2 API计算安卓设备的总视场。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-11 17:30:20

基本公式是

代码语言:javascript
运行
复制
FOV.x = 2 * atan(SENSOR_INFO_PHYSICAL_SIZE.x / (2 * LENS_FOCAL_LENGTH))
FOV.y = 2 * atan(SENSOR_INFO_PHYSICAL_SIZE.y / (2 * LENS_FOCAL_LENGTH))

这是一个近似假设一个理想的镜头,等等,但通常足够好。

这将计算整个传感器像素阵列的FOV。

但是,给定输出的实际视场将更小;首先,传感器的读出区域通常小于整个像素数组,因此,您需要首先根据像素阵列像素计数与活动阵列像素计数( PHYSICAL_SIZE / SENSOR_INFO_PIXEL_ARRAY_SIZE)的比例来缩放它,而不是直接使用full。

然后,视场取决于您配置的输出的纵横比( 16:9 FOV将与4:3 FOV不同),相对于活动阵列的纵横比,如果它小于全活动阵列,则取决于作物区域的纵横比(数字变焦)。

每个输出缓冲器将是对相应的捕获请求进行最小程度的进一步裁剪以达到正确的输出高宽比的结果。(reprocess.html有图表)。

假设我们有一个像素阵列为(120,120)的传感器,我们有一个活动阵列矩形(10,10)-(110,110),所以宽度/高度为100,100。

我们配置两个输出,输出A为(40,30),输出B为(50,50)。让我们将作物区域保留在最大值(0,0)-(100,100)。

输出A和B的水平FOV将是相同的,因为最大面积的作物将导致使用完全活动阵列宽度的两种输出:

代码语言:javascript
运行
复制
output_physical_width = SENSOR_INFO_PHYSICAL_SIZE.x * ACTIVE_ARRAY.w / PIXEL_ARRAY.w
FOV_x = 2 * atan(output_physical_width / (2 * LENS_FOCAL_LENGTH))

然而,垂直FOV将不同-输出A将只使用3/4的垂直空间,因为纵横比不匹配:

代码语言:javascript
运行
复制
active_array_aspect = ACTIVE_ARRAY.w / ACTIVE_ARRAY.h
output_a_aspect = output_a.w / output_a.h
output_b_aspect = output_b.w / output_b.h
output_a_physical_height = SENSOR_INFO_PHYSICAL_SIZE.y * ACTIVE_ARRAY.h / PIXEL_ARRAY.h * output_a_aspect / active_array_aspect
output_b_physical_height = SENSOR_INFO_PHYSICAL_SIZE.y * ACTIVE_ARRAY.h / PIXEL_ARRAY.h * output_b_aspect / active_array_aspect
FOV_a_y = 2 * atan(output_a_physical_height / (2 * LENS_FOCAL_LENGTH))
FOV_b_y = 2 * atan(output_b_physical_height / (2 * LENS_FOCAL_LENGTH))

当输出高宽比为<=活动数组纵横比(字母装箱)时,上述方法可以工作;如果不是这样,则减少输出水平维数,垂直维数覆盖整个活动数组(柱塞装箱)。然后,水平方向的比例因子是active_array_ The /output_方面。

如果要计算缩放视图的FOV,则将作物区域维度/纵横比替换为活动数组维度/高宽比。

票数 15
EN

Stack Overflow用户

发布于 2017-08-24 15:49:01

代码语言:javascript
运行
复制
private float getHFOV(CameraCharacteristics info) {
    SizeF sensorSize = info.get(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE);
    float[] focalLengths = info.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS);

    if (focalLengths != null && focalLengths.length > 0) {
        return (float) (2.0f * atan(sensorSize.getWidth() / (2.0f * focalLengths[0])));
    }

    return 1.1f;
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39965408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档