Ton*_*Jet 4 java camera android
这一切都在标题中,但在现已弃用的Android Camera API中,有两种方法:Camera.Parameters.getHorizontalViewAngle()和Camera.Parameters.getVerticalViewAngle().
现在,使用当前的Camera2 API,似乎在文档中没有相应的内容.我假设这是因为FOV角度比简单的水平和垂直值更复杂和细微,但我在网上找不到有关如何使用较新的Camera2 API计算Android设备的总视野的任何信息.
Edd*_*ala 12
基本公式是
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))
Run Code Online (Sandbox Code Playgroud)
这是假设理想镜头等的近似值,但通常足够好.
这计算整个传感器像素阵列的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))
Run Code Online (Sandbox Code Playgroud)
但是,垂直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))
Run Code Online (Sandbox Code Playgroud)
当输出宽高比<=有源阵列宽高比(letterboxing)时,上述工作原理; 如果不是这样,则输出水平尺寸减小,垂直尺寸覆盖整个有源阵列(柱箱).然后,水平方向的比例因子为active_array_aspect/output_aspect.
如果要计算放大视图的FOV,请将裁剪区域尺寸/纵横比替换为活动阵列尺寸/纵横比.
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3126 次 |
| 最近记录: |