双目立体视觉系统的主要流程通常包括以下几个关键步骤:
-
相机标定:
首先,需要对每个相机进行单独的标定,以获取它们的内参(焦距、主点坐标、畸变系数)和外参(旋转矩阵和平移向量)。- 内参标定:确定每个相机的内部参数,如焦距、光心(主点)坐标、径向畸变和切向畸变系数。
- 外参标定:确定双目相机之间的相对位置和姿态,包括基线长度、旋转矩阵和平移向量,使用从两个相机捕获的标定板图像中的匹配点来计算基础矩阵或本质矩阵。
-
立体校正(Rectification):
根据相机的标定的旋转矩阵和平移向量等,对两个相机捕获的原始图像进行校正,使得校正后的图像在同一平面上且互相平行。这样,图像的每行像素之间共线,简化了后续的立体匹配过程。- 立体校正的目的是调整图像,使得左图像和右图像的极线在水平方向上对齐(或者说相机光轴平行),从而简化立体匹配过程。
- 校正过程通常涉及到对图像进行仿射变换或透视变换,以消除垂直视差,使得对应点的水平位置对齐。
-
图像重映射:
根据校正后的参数,对图像进行重映射(remapping),生成新的校正后的图像。在这个过程中,图像的像素会被重新分配到新的位置上,以确保对应点的水平对齐。 -
立体匹配(Stereo Matching):
- 在立体校正和图像重映射后的图像上进行像素点的匹配。这个过程涉及计算左图像中的像素点与右图像中相应位置的像素点之间的相似度,以找到最佳匹配点。
- 匹配方法可以是基于区域的(如块匹配)、基于特征的(如SIFT、SURF)或基于深度学习的。
- 一般基于极线约束:使用基础矩阵或本质矩阵,可以计算出每个像素点在另一个相机图像中的极线位置,匹配只在极线上进行,可以加快匹配速度和运算量。
-
深度计算(Depth Estimation):
- 根据立体匹配得到的视差图(Disparity Map),计算每个像素对应的深度信息。视差是左图像和右图像中对应点之间的水平像素差异,与物体的深度成反比。
- 深度计算通常涉及到三角测量,使用相机的内参和基线距离来计算物体的实际深度。
-
三维重建(3D Reconstruction):
使用深度信息,可以将二维图像中的点转换为三维空间中的坐标,从而重建场景的三维结构。 -
后处理(Post-processing):
对深度图进行优化,包括去除错误匹配点、平滑处理、滤波等,以提高深度图的质量。
这些步骤共同作用,使得双目立体视觉系统能够从两个不同视角的图像中恢复出场景的三维信息。在实际应用中,这些步骤可能需要根据具体的系统设计和应用需求进行调整。
在实际应用中,可以使用计算机视觉库(如OpenCV)中的函数来辅助完成这些步骤。例如,OpenCV提供了cvStereoRectify
函数来进行立体校正,以及cvInitUndistortRectifyMap
和cvRemap
函数来生成校正映射并重映射图像。这些函数可以帮助开发者处理双目相机的校正问题,从而获得更准确的立体视觉结果。
补充:立体视觉的问题由来:
上图从物理原理上展示了为什么单目相机不能测量深度值而双目可以的原因。我们看到红色线条上三个不同远近的黑色的点在下方相机上投影在同一个位置,因此单目相机无法分辨成的像到底是远的那个点还是近的那个点,但是它们在上方相机的投影却位于三个不同位置,因此通过两个相机的观察可以确定到底是哪一个点。