1. 双目立体视觉基础原理
第一次接触双目立体视觉时,我被它模拟人眼的工作原理深深吸引。想象一下,当你闭上一只眼睛时,判断物体的距离会变得困难;而睁开双眼后,大脑通过比较两幅图像的差异就能轻松感知深度。这就是双目视觉的核心思想——通过两个摄像头模拟人眼,计算视差来重建三维世界。
在实际项目中,我常用一对经过严格校准的工业相机搭建系统。两个相机之间的水平距离(基线距离T)是关键参数,就像人的瞳距一样直接影响测量范围。基线越大,远距离测量越准,但会牺牲近距离的视野重叠区域。经过多次实验,我发现对于室内机器人导航,6-12cm的基线距离是最佳选择。
这里有个生活化的类比:假设你伸直手臂竖起大拇指,分别用左右眼观察。当拇指离眼睛很近时,左右眼看到的拇指位置差异很大(大视差);当拇指逐渐远离,这个差异会变小(小视差)。双目系统就是用数学公式量化这个过程:
python复制depth = (focal_length * baseline) / disparity
其中focal_length是相机焦距,baseline是两相机间距,disparity是同一物体在两幅图像中的像素坐标差。这个简单的三角测量公式,却是整个深度重建的基石。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 三角测量的实战细节
很多教程只给出理论公式,却忽略了实际工程中的关键点。根据我的踩坑经验,三角测量要获得准确结果,必须处理好三个环节:
首先是相机标定。有次项目 deadline 前夜,我们的深度图总是扭曲,后来发现是标定板拍摄时存在反光。现在我的标准流程是:
- 使用高对比度棋盘格(建议打印在哑光材质上)
- 从不同角度拍摄至少20组图像
- 用OpenCV的cv2.calibrateCamera()同时计算内外参和畸变系数
其次是视差计算精度。早期我们直接用整数像素坐标做减法,结果深度图出现明显分层。后来改用亚像素级角点检测,精度提升显著:
python复制# 亚像素级角点优化
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
corners = cv2.cornerSubPix(gray_image, corners, (11,11), (-1,-1), criteria)
