ubuntu双目摄像机标定
时间: 2025-04-26 17:10:47 浏览: 29
### 双目摄像头标定过程
在Ubuntu系统上进行双目摄像头的标定时,通常采用OpenCV库来完成这一任务。具体来说,可以通过编写Python脚本来调用OpenCV的相关函数来进行标定工作[^1]。
#### 准备阶段
为了确保能够顺利执行后续的操作,在开始之前应当确认已经成功安装了必要的依赖项以及配置好了环境变量。对于Ubuntu 18.04而言,建议按照特定指南完成OpenCV及其附加模块(opencv_contrib)的部署。
#### 获取棋盘格图像序列
双目相机标定过程中需要用到一系列拍摄有标准尺寸黑白相间方格图案的照片作为输入数据源。这些图片应该覆盖不同的视角范围以便于算法更精确地计算内外部参数。可以使用两个同步触发机制相连结的一对相同型号单反数码照相机分别对着同一平面内的同一个固定位置摆放好的国际象棋盘模板拍照获得;也可以直接利用现成的数据集[^2]。
#### 编写并运行标定程序
下面给出了一段用于读取上述准备好的多组立体匹配模式下的左/右视图,并对其进行处理从而得到所需各项系数值(如焦距focal length, 主点principal point偏移等)及其它几何变换关系描述符(旋转矩阵rotation matrix和平移向量translation vector) 的Python代码片段:
```python
import numpy as np
import cv2
import glob
# 设置寻找亚像素角点的参数
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# 棋盘格内部交差点的数量
pattern_size = (9, 6)
objp = np.zeros((np.prod(pattern_size), 3), np.float32)
objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2)*20 # 假设每边长度为20mm
# 存储世界坐标系中的三维点和对应图像上的二维投影点
object_points = []
image_left_points = []
image_right_points = []
images_left = sorted(glob.glob('left_*.jpg'))
images_right = sorted(glob.glob('right_*.jpg'))
for img_name_l, img_name_r in zip(images_left, images_right):
img_l = cv2.imread(img_name_l)
gray_l = cv2.cvtColor(img_l,cv2.COLOR_BGR2GRAY)
ret_l, corners_l = cv2.findChessboardCorners(gray_l, pattern_size,None)
img_r = cv2.imread(img_name_r)
gray_r = cv2.cvtColor(img_r,cv2.COLOR_BGR2GRAY)
ret_r, corners_r = cv2.findChessboardCorners(gray_r,pattern_size,None)
if ret_l and ret_r:
object_points.append(objp)
corners_refined_l = cv2.cornerSubPix(gray_l,corners_l,(11,11),(-1,-1),criteria)
image_left_points.append(corners_refined_l)
corners_refined_r = cv2.cornerSubPix(gray_r,corners_r,(11,11),(-1,-1),criteria)
image_right_points.append(corners_refined_r)
# 绘制检测到的角点
cv2.drawChessboardCorners(img_l, pattern_size, corners_refined_l,ret_l)
cv2.imshow('img',img_l)
cv2.waitKey(500)
cv2.drawChessboardCorners(img_r, pattern_size, corners_refined_r,ret_r)
cv2.imshow('img',img_r)
cv2.waitKey(500)
cv2.destroyAllWindows()
# 执行实际的双目校准流程
stereo_criteria = (cv2.TERM_CRITERIA_MAX_ITER + cv2.TERM_CRITERIA_EPS, 100, 1e-5)
flags = 0
flags |= cv2.CALIB_FIX_INTRINSIC
ret, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, R, T, E, F = \
cv2.stereoCalibrate(object_points,
image_left_points,
image_right_points,
None, None, None, None,
gray_l.shape[::-1],
criteria=stereo_criteria,
flags=flags)
print("Camera matrices:\n",cameraMatrix1,"\n\n",cameraMatrix2)
print("\nDistortion coefficients:\n",distCoeffs1,"\n\n",distCoeffs2)
print("\nRotation Matrix:\n",R)
print("\nTranslation Vector:\n",T)
```
此部分实现了从加载样本直至输出最终结果的整体逻辑控制结构体。其中涉及到的关键技术要点包括但不限于特征提取(`findChessboardCorners`)、精度提升(`cornerSubPix`)、可视化辅助功能(`drawChessboardCorners`)以及核心运算环节(`stereoCalibrate`)[^4]。
#### 结果分析与应用
当以上步骤完成后,将会得到一组关于两台摄像设备之间相对位姿的信息——即所谓的“外参”,同时还包含了各自镜头本身的光学特性说明文档——也就是常说的“内参”。有了它们之后便可以在很多场合下发挥重要作用,比如构建虚拟现实场景时需要知道参与者所处空间的确切尺度大小;又或者是无人驾驶车辆感知周围障碍物距离的时候要依靠此类先验知识来做决策支持等等。
阅读全文
相关推荐













