# 从无到有搭建双目视觉系统: +实战深度图生成全流程, 首次碰到双目视觉之际, 我被那看似简易的原理给惊到了——两个摄像头像人眼那般, 便可以算出物体距离。然而当真着手去实现的话, 却发觉从标定直至深度图生成到处存在状况。本文会带领你完整经历此流程, 躲开我踩过的那些陷阱区域。## 1. 双目视觉基本概念同环境筹备, 双目视觉的关键所在是视差()测算。当两个摄像头从不一样角度观察同一个场景时, 物体在左右图像里的水平位置差异便是视差。物体距离越近,视差就越大。在这个看似简单的原理背后, 是需要精确的相机标定来支撑的, 同时还需要复杂的立体匹配算法来支撑。**环境准备清单**: 要求是3.8加以上版本(推荐使用管理环境), 需求为4.5加以上版本(包含模块), 需要NumPy 1.20加以上版本, 要有一对USB摄像头(建议同型号),要有棋盘格标定板(建议用A4纸打印)。安装命令是: ``` -- numpy ```验证安装为: ``` (cv2.) # 应显示4.5以上版本```*常见问题*: 要是碰到SGBM算法不可用这种情况, 也许是编译的时候没有包含模块。建议卸载之后再重新安装`--`。它是双目视觉里, 最为关键, 同时也是最容易出现差错的环节, 那便是双目相机标定实战相机标定。倘若标定结果良好, 会使得后续步骤达成事半功倍的效果, 然而若标定不佳, 将会致使深度图全然无法使用。### 2.1 将使用标准规格(推荐采用8x6内角点)的棋盘格标定板去制作标定板以及进行数据采集工作, 在打印的时候一定要确保做到: 纸张是平整的不存在褶皱现象, 方格的尺寸要进行精确的测量(建议边长设置为3cm), 要粘贴在硬质的平板之上同时保持刚性, 此为采集数据时所遵循的黄金法则: 左右相机对于拍摄工作要做到同步以进行(可以使用`cv2.(0)`和`cv2.(1)`), 标定板必须要出现在左右两边的图像之中, 要对整个视野范围进行覆盖(包括上下左右倾斜的视觉范围内), 要拍摄15至20组不同姿态的图像, 要避免出现强光反射以及镜头眩光的情况, 示例采集代码如下: ``` = cv2.(0) = cv2.(1)count = True:ret1, = .read()ret2, = .read()cv2.('Left', )cv2.('Right', )key = cv2.(1)if key == ord('s'): # 按s保存cv2.(f'left_{count}.jpg', )cv2.(f'{count}.jpg', )count += 1elif key == 27: # ESC退出.().()```### 2.2 对于标定的参数进行计算, 这个标定的过程需要进行相关核xin参与计算的参数有: 相机内用于计算相机相关几何关系的矩阵(其关联着焦距以及主点坐标), 畸变的系数(其中包含径向畸变和切向畸变这两种情况), 两台相机之间的旋转矩阵以及平移向量, 标定代码框架如下: ``` (位置,点数量=(7,6)): = # 3D点 = # 2D点# 生成标定板角点的理论坐标objp = np.zeros((*,这个地方有3), np.类型)objp 是因为np.mgrid关系而设定的坐标情况```。

0:,0:```

更多推荐