如何计算相机视场角
简介
-
视野,视场,视角(field of view, FOV)
-
在光学仪器中,以光学仪器的镜头为顶点,以被测目标的物像可通过镜头的最大范围的两条边缘构成的夹角,称为视场角
-
视场角分为水平视场角和垂直视场角
视场角计算
SDK
- 部分海康相机SDK可以获取视场角
- 如果
NET_DVR_GetLastError
返回错误代码23,说明设备不支持
NET_DVR_GetSTDConfig(lUserID, NET_DVR_GET_GISINFO, &struCfg);
float fHorizontalValue = struGISInfo.fHorizontalValue; // 水平视场角
float fVerticalValue = struGISInfo.fVerticalValue; // 垂直视场角
printf("水平视场角:%.3f, 垂直视场角:%.3f\n", fHorizontalValue, fVerticalValue);
视距和视场宽高
- 根据实际视距和视场宽高来计算
{ α h = 2 a r c t a n 实 际 视 场 宽 度 / 2 实 际 视 距 α v = 2 a r c t a n 实 际 视 场 高 度 / 2 实 际 视 距 \begin{cases} \alpha_h = 2arctan\frac{实际视场宽度/2}{实际视距}\\ \alpha_v = 2arctan\frac{实际视场高度/2}{实际视距} \end{cases} {αh=2arctan实际视距实际视场宽度/2αv=2arctan实际视距实际视场高度/2
CCD靶面尺寸
- 根据CCD靶面尺寸和焦距来计算
- 可以查询《靶面尺寸和镜头焦距配套对应的视场角》
{ α h = 2 a r c t a n H C C D 2 f h α v = 2 a r c t a n W C C D 2 f v \begin{cases} \alpha_h = 2arctan\frac{H_{CCD}}{2f_h}\\ \alpha_v = 2arctan\frac{W_{CCD}}{2f_v} \end{cases} {αh=2arctan2fhHCCDαv=2arctan2fvWCCD
像素焦距和图像长宽
- 根据像素焦距和图像长宽获取
{ α h = 2 a r c t a n H i m g 2 f x α v = 2 a r c t a n W i m g 2 f y \begin{cases} \alpha_h = 2arctan\frac{H_{img}}{2f_x}\\ \alpha_v = 2arctan\frac{W_{img}}{2f_y} \end{cases} {αh=2arctan2fxHimgαv=2arctan2fyWimg
- 比较推荐这一种方法,简单示例:
- 寻找已知实际尺寸的四个点,不同角度拍摄至少四张
- 标定内参矩阵
def build_world_coor(num_points=4): # 自定义世界坐标系
world_coor = np.zeros((num_points, 3), np.float32)
world_coor[0,:] = [0, 0, 0]
world_coor[1,:] = [0.6, 0,0]
world_coor[2,:] = [0.6, 0.6, 0]
world_coor[3,:] = [0, 0.6, 0]
return world_coor
def calib_k(path, size, num_points, path_out=None): # 内参标定
world_coor = build_world_coor(num_points)
l_data = read_data(path)
l_world, l_img = [], []
for ind, item in enumerate(l_data):
img_coor = np.zeros((num_points, 1, 2), dtype='float32')
l_world.append(world_coor)
for i in range(num_points):
img_coor[i,:,:] = np.matrix(item[2*i:2*i+2])
l_img.append(img_coor)
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(l_world, l_img, size, None, None)
print('内参矩阵:', mtx)
- 计算视场角
Width = 2560
Height = 1440
fov_h = 2 * np.rad2deg(np.arctan( Width / (2*fx)))
fov_v = 2 * np.rad2deg(np.arctan( Height/ (2*fy)))
print("水平视场角: ", fov_h)
print("垂直视场角: ", fov_v)