标题中都有这些内容,但是在现已弃用的Android Camera API中,有两种方法:Camera.Parameters.getHorizo​​ntalViewAngle()和Camera.Parameters.getVerticalViewAngle()。

现在,使用当前的Camera2 API,文档中似乎没有与之等效的东西。我认为这是因为FOV角度比简单的水平和垂直值更加复杂和细微,但我无法在线找到有关如何使用较新的Camera2 API计算Android设备总视场的任何信息。 。

最佳答案

基本公式是

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))

这是一个假设理想的镜片等的approximation,但通常足够好。

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

但是,给定输出的实际视场会更小;首先,传感器的读取区域通常小于整个像素阵列,因此,您无需直接使用PHYSICAL_SIZE,就需要首先按像素阵列像素计数与 Activity 阵列像素计数的比率(SENSOR_INFO_ACTIVE_ARRAY_SIZE/SENSOR_INFO_PIXEL_ARRAY_SIZE)进行缩放。

然后,视场取决于您配置的输出的长宽比(16:9 FOV不同于4:3 FOV),相对于有源阵列的长宽比,以及裁剪区域的宽高比(数字缩放),如果它小于整个 Activity 阵列。

每个输出缓冲区将是对相应捕获请求最小化进一步裁剪cropRegion的结果,以达到正确的输出宽高比。 (http://source.android.com/devices/camera/camera3_crop_reprocess.html有图表)。

假设我们有一个具有(120,120)像素阵列的传感器,并且有一个(10,10)-(110,110)的 Activity 阵列矩形,因此宽/高为100,100。

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

输出A和B的水平FOV相同,因为最大面积裁剪将导致两个输出都使用完整的有效数组宽度:
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:
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))

当输出宽高比
如果要计算放大 View 的FOV,则将裁剪区域的尺寸/长宽比替换为 Activity 数组的尺寸/长宽比。

10-08 08:55