双目立体匹配重建(Stereo Matching Reconstruction)是一种经典的三维重建方法,其核心思想是:
通过两台相机从不同视角同时拍摄同一场景,通过对校正后的左右图像进行立体匹配获取两幅图像的 视差,再根据三角测量原理计算出场景的深度。
极几何:描述同一场景或者物体两个视点图像间的几何关系。

三维点与两个相机光心形成一个极平面,已知相机1图像上一点p,其三维点在o1到p点的空间射线上,其候选三维点P与o2的连线在这个极平面上。其中在相机2图像上的投影候选点组成了一条线,称之为极线。 也就是说,相机1p点对应的三维点一定 在另一个相机极线上。
那问题是在怎么找到另一个相机的极线?
在已知两个相机系统参数时,根据上述描述,极线约束公式可以写为:



非线性三角化重建。

视差是指三维场景中某一点在左右图像中对应点位置的像素级差距。

对极线校正(Epipolar Rectification / Stereo Rectification)**是双目视觉系统中的一个关键步骤,其目的就是:
把左右相机图像重新变换,使得对应点只需要在同一水平线上搜索。


① 得到两个摄像机之间的 Rotation和Translation之后,要用下面的API对两幅图像进行立体对极线校正,这就需要算出两个相机做对极线校正需要的R和T,用R1,T1, R2, T2表示,以及透视投影矩阵P1,P2:
cv::stereoRectify(camK, D, camK, D, imgL.size(), R, -R*t, R1, R2, P1, P2, Q);
② 得到上述参数后,就可以使用下面的API进行对极线校正操作了,并将校正结果保存到本地:
cv::initUndistortRectifyMap(P1(cv::Rect(0, 0, 3, 3)), D, R1, P1(cv::Rect(0, 0, 3, 3)), imgL.size(), CV_32FC1, mapx, mapy);
cv::remap(imgL, recImgL, mapx, mapy, CV_INTER_LINEAR);
cv::imwrite("data/recConyL.png", recImgL);
cv::initUndistortRectifyMap(P2(cv::Rect(0, 0, 3, 3)), D, R2, P2(cv::Rect(0, 0, 3, 3)), imgL.size(), CV_32FC1, mapx, mapy);
cv::remap(imgR, recImgR, mapx, mapy, CV_INTER_LINEAR);
cv::imwrite("data/recConyR.png", recImgR);
对极线校正结果如下所示,查看对极线校正结果是否准确,可以通过观察若干对应点是否在同一行上粗略估计得出:


假设我们已经知道了两个相机的外参,即R和T,也就是说,我们已经知道了两个相机的相对旋转和平移关系。
①首先我们要想把两个相机平面调整平行就从这个相对旋转R下手。如果两者之间的相对旋转较大,那固定一个只旋转另一个,很可能造成共同观测的世界点投影到变换之后的那个图像外边去,所以简单的办法就是折中一下,两个相机各旋转这个相对旋转的一半。这一步可以将两个相机的光轴平行。


双目结构光系统



Bouguet 算法是常用的标定立体校正方法

参考文献:
3D视觉之立体匹配(Stereo Matching)
双目相机原理揭秘--双目立体视觉原理搞懂很简单
12. 双目视觉之极线矫正
杨其望, 张慧, 刘江涛, 等. 双目结构光目标三维重建方法研究[J]. 广东工业大学学报, 2025, 42(5): 121--128. doi: 10.12052/gdutxb.240106.
Bouguet算法--源码解析
Bouguet极线校正进一步理解