一、概念
FOV(Field of View)是一个用于描述视野范围的术语。它通常用于计算设备(如摄像机、虚拟现实头显或眼睛)所能捕捉到的可见区域。
- 水平FOV(Horizontal FOV):描述视野在水平方向上的范围,通常以度(°)或弧度(rad)为单位。
- 垂直FOV(Vertical FOV):描述视野在垂直方向上的范围,同样通常以度或弧度为单位。
- 对角线FOV(Diagonal FOV):描述视野对角线方向上的范围,通常以度或弧度为单位。
FOV的大小会影响到用户或设备所能看到的景象的广度和逼真程度。较大的FOV可以提供更广阔的视野,使用户感到更加沉浸在虚拟现实环境或更好地观察到摄像机捕捉到的场景。然而,较大的FOV通常需要更复杂的设备和技术来实现。
在摄影和计算机图形学中,FOV也经常与焦距(focal length)、相机镜头和投影类型(例如透视投影或正交投影)一起使用,以影响图像的外观和透视效果。不同的FOV设置可以用来创造不同的视觉效果,从而满足特定的需求和创意要求。
二、计算方式
如图所示,要计算FOV,只要我们拿到传感器的长度SensorSize,摄像头的焦距FocalLength,就可以由三角函数计算得到FOV了,即:
tan ( 1 2 ∗ F O V ) = ( 1 2 ∗ S e n s o r S i z e ) / F o c a l L e n g t h \tan{(\frac{1}{2} * FOV)}=(\frac{1}{2} * SensorSize) / FocalLength tan(21∗FOV)=(21∗SensorSize)/FocalLength
可得:
F O V = 2 ∗ arctan ( ( 1 2 ∗ S e n s o r S i z e ) / F o c a l L e n g t h ) FOV=2*\arctan{((\frac{1}{2} * SensorSize) / FocalLength)} FOV=2∗arctan((21∗SensorSize)/FocalLength)
三、代码
CameraManager cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
try {String[] cameraIdList = cameraManager.getCameraIdList();for (int i = 0; i < cameraIdList.length; i++) {Log.v(TAG, "valid camera id: " + cameraIdList[i]);CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraIdList[i]);// 获取传感器的尺寸SizeF sensorSize = cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE);float[] floats = cameraCharacteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS);Log.d(TAG, "focal Lengths: " + Arrays.toString(floats));float focalLength = cameraCharacteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS)[0];float horizontalFov = (float) (2 * Math.toDegrees(Math.atan(sensorSize.getWidth() / (2 * focalLength))));float verticalFov = (float) (2 * Math.toDegrees(Math.atan(sensorSize.getHeight() / (2 * focalLength))));Log.d(TAG, "horizontalFov: " + horizontalFov + ", verticalFov: " + verticalFov);}
} catch (CameraAccessException e) {e.printStackTrace();
}