OpenCV双目测距实战:从标定到三维重建的完整流程(附Python代码)
在计算机视觉领域,双目测距技术因其成本适中、精度可靠的特点,被广泛应用于机器人导航、自动驾驶、工业检测等场景。本文将带你完整实现一个基于OpenCV的双目测距系统,从相机标定到深度计算,最后完成三维重建。
1. 双目视觉基础原理
双目测距的核心思想是三角测量。当两个摄像头从不同角度观察同一场景时,物体在左右图像中的位置会存在差异(视差),这种差异与物体的距离成反比关系。具体而言:
- 基线距离(B):两个摄像头光心之间的水平距离
- 焦距(f):摄像头的焦距(像素单位)
- 视差(d):物体在左右图像中的水平坐标差
深度Z的计算公式为:
Z = (B × f) / d
关键参数影响:
| 参数 | 对测距的影响 | 典型值范围 |
|---|---|---|
| 基线距离 | 基线越长,测距范围越远 | 50-200mm |
| 焦距 | 焦距越长,视差灵敏度越高 | 500-2000像素 |
| 视差 | 距离越近,视差越大 | 0-256像素 |
实际项目中,我们还需要考虑:
- 镜头畸变校正
- 图像对齐(极线校正)
- 立体匹配算法选择
- 深度图后处理
2. 硬件准备与相机标定
2.1 硬件配置建议
# 推荐的双目相机配置参数
camera_params = {
'resolution': (1280, 720), # 建议至少720P
'frame_rate': 30, # 工业场景可提升至60fps
'sync_mode': 'hardware', # 硬件同步可减少时序误差
'baseline': 120, # 单位mm,根据测距需求调整
'lens_fov': 90 # 视场角,广角镜头需更多畸变校正
}
2.2 相机标定实战
标定过程分为单目标定和双目标定两个阶段:
- 采集标定板图像:
# 使用如下命令通过OpenCV采集图像
python capture_calib.py --left 0 --right 1 -n 30 -d ./calib_imgs
- 单目标定代码:
def single_camera_calibration(images, pattern_size=(9,6)):
obj_points = [] # 3D世界坐标
img_points = [] # 2D图像坐标
# 准备标定板角点的世界坐标 (0,0,0), (1,0,0), ..., (8,5,0)
objp = np.zeros((pattern_size[0]*pattern_size[1], 3), np.float32)
objp[:,:2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1,2)
for img in images:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)
if ret:

&spm=1001.2101.3001.5002&articleId=154665622&d=1&t=3&u=5ebd6b42d7724232aaba5ac55cd9e0b3)
357

被折叠的 条评论
为什么被折叠?



