用双目相机实现坐标标定

一:相机参数设置和计算

镜头参数:MF2808-10MP  靶面尺寸2/3'' ,视场角(对角×水平×垂直)  69.7×58.5×45.5

焦距:8mm,分辨率:1624×1240

1.1视场角的计算

图像分辨率越高,双目匹配的的精度越高,由匹配误差带来的测量误差越小。此外,焦距和图像分辨率影响相机的视场角度。

海康MV-CS020-10UC的像素尺寸是4.5*4.5μm

计算出来x轴的水平视场角是49度,y轴的垂直视场角是38.4度

1.2关于基线的选取

关于基线的选取:在12mm焦距,780mm双目基线长度的参数下,测量28m远的物体,一个像素的匹配误差带来的测量误差约为0.5m。具体计算方法如下:
双目测距的公式为:

 关于雷达站的误差范围要求至少不能大于1.6m,再严格一些,不能大于0.8米。

中Z为深度,单位m;f为焦距,单位像素;b为双目基线长度,单位m;d为双目视差,单位像素;对于选用12mm镜头焦距的MER-230-168U3C相机,以像素为单位的焦距为:

在b=0.78m的双目基线下,Z=28m处的双目视差:

 

假设由于双目匹配引入了1个像素的匹配误差,此时d=56.6,则Z=28.5;由此可以得到在28m远的距离处,一个像素的匹配误差会带来0.5m的测量误差。
      Tips:以上参数以及相关的计算方法和数据可以作为搭建双目测量系统时的参考。

 1.3自己雷达基线的选取

8mm焦段,780mm双目基线长度的参数下,测量28米远和14米远的距离的测量误差的计算

需要学习的知识

1.相机的四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。

2.针孔相机模型

3.相机畸变

4.双目视觉的知识

5.立体匹配算法

6.相机位姿估计

参考资料:【RM2020 圆桌】第五期 新兵种讨论之雷达站【RoboMaster论坛-科技宅天堂】

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是实现双目相机标定的Python代码示例: ```python import cv2 import numpy as np # 设置棋盘格大小和格点数 board_size = (9, 6) square_size = 0.025 # 棋盘格格子宽度(米) # 构建棋盘格世界坐标系 world_points = np.zeros((np.prod(board_size), 3), np.float32) world_points[:, :2] = np.indices(board_size).T.reshape(-1, 2) world_points *= square_size # 读取标定用的图片 left_img = cv2.imread('left.png') right_img = cv2.imread('right.png') # 检测棋盘格角点 retval1, corners1 = cv2.findChessboardCorners(left_img, board_size) retval2, corners2 = cv2.findChessboardCorners(right_img, board_size) # 确保两幅图片都检测到了角点 if retval1 and retval2: # 提取角点坐标 corners1 = cv2.cornerSubPix(cv2.cvtColor(left_img, cv2.COLOR_BGR2GRAY), corners1, (11, 11), (-1, -1), criteria=(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)) corners2 = cv2.cornerSubPix(cv2.cvtColor(right_img, cv2.COLOR_BGR2GRAY), corners2, (11, 11), (-1, -1), criteria=(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)) # 绘制角点 cv2.drawChessboardCorners(left_img, board_size, corners1, True) cv2.drawChessboardCorners(right_img, board_size, corners2, True) # 标定相机 retval, camera_matrix1, dist_coeffs1, camera_matrix2, dist_coeffs2, R, T, E, F = cv2.stereoCalibrate( [world_points], [corners1], [corners2], cv2.initCameraMatrix2D([world_points], [corners1], left_img.shape[::-1], 0), cv2.initCameraMatrix2D([world_points], [corners2], right_img.shape[::-1], 0), left_img.shape[::-1], flags=cv2.CALIB_FIX_INTRINSIC ) # 打印标定结果 print('Camera matrix 1:\n', camera_matrix1) print('Distortion coefficients 1:\n', dist_coeffs1) print('Camera matrix 2:\n', camera_matrix2) print('Distortion coefficients 2:\n', dist_coeffs2) print('Rotation matrix:\n', R) print('Translation vector:\n', T) else: print('Failed to detect chessboard corners.') # 显示结果 cv2.imshow('Left Image', left_img) cv2.imshow('Right Image', right_img) cv2.waitKey() cv2.destroyAllWindows() ``` 在这个示例中,我们首先定义了棋盘格大小和格点数,并构建了棋盘格世界坐标系。然后,我们读取了用于标定的左右相机图像,并使用`cv2.findChessboardCorners`函数检测棋盘格角点。如果两幅图片都检测到了角点,我们就使用`cv2.stereoCalibrate`函数进行相机标定。最后,我们打印标定结果并显示用于标定的图像和检测到的角点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lylsalt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值