java – 相似的Camera.Parameters.getHorizo??ntalViewAngle()和
这一切都在标题中,但在现已弃用的
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,而是首先按像素阵列像素数与有效数组像素数的比例进行缩放(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)) 当输出宽高比为< =有源阵列宽高比(letterboxing)时,上述工作原理;如果不是这样,则输出水平尺寸减小,垂直尺寸覆盖整个有源阵列(柱箱).然后,水平方向的比例因子为active_array_aspect / output_aspect. 如果要计算放大视图的FOV,请将裁剪区域尺寸/纵横比替换为活动阵列尺寸/纵横比. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |