基本公式是
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,您需要先按像素阵列像素数与活动阵列像素数之比(SENSOR_INFO_ACTIVE_ARRAY_SIZE / SENSOR_INFO_PIXEL_ARRAY_SIZE)对其进行缩放.
然后,视场取决于您配置的输出的纵横比(16:9 FOV 与 4:3 FOV 不同),相对于活动阵列的纵横比,以及裁剪区域的纵横比(数字缩放)(如果它小于完整的活动数组)。
每个输出缓冲区将是为相应的捕获请求进一步裁剪cropRegion 以达到正确的输出纵横比的结果。 (http://source.android.com/devices/camera/camera3_crop_reprocess.html 有图表)。
假设我们有一个像素阵列为 (120,120) 的传感器,我们有一个 (10,10)-(110,110) 的活动阵列矩形,因此宽度/高度为 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))
当输出纵横比
如果您想计算放大视图的 FOV,请将裁剪区域尺寸/纵横比替换为活动阵列尺寸/纵横比。