双目视觉系统中,极线校正(Epipolar Rectification)与单应性矩阵/多平面单应性模型
在双目视觉系统中,极线校正(Epipolar Rectification)的目标是使左右图像的对应点位于同一水平线上,从而简化立体匹配的搜索过程。标准的双目相机标定和校正流程,其核心原理与单应性矩阵的应用方式如下:
1. 极线校正的原理与单应性矩阵的关系
- 校正的本质:通过立体标定得到的旋转矩阵(
R
)和平移向量(T
),计算左右相机的校正变换矩阵(R1
,R2
,P1
,P2
)。这些矩阵将左右相机的成像平面对齐到同一虚拟平面上,使得极线水平对齐。 - 单应性矩阵的作用:
R1
和R2
本质上是单应性变换矩阵,但它们作用于整个图像平面,而非针对特定物体或背景平面。校正后的坐标系中,所有场景点的视差仅通过水平位移(xL−xR)计算,与深度成反比。
2. 代码中为何没有多平面单应性模型
- 全局校正假设:标准双目校正默认场景符合单一平面假设(即所有点位于同一深度平面),因此使用统一的变换矩阵(
R1
,R2
)。这种假设在标定板场景中是成立的(标定板本身是一个平面)。 - 实际场景的适用性:
当场景中存在多个深度平面(如物体和背景)时,全局校正仍能正常工作,因为:- 极线校正是几何变换,不依赖场景内容,仅依赖相机参数(内参、外参)。
- 不同深度平面的视差通过统一的透视投影公式 Z=fB/(xL−xR)计算,无需分平面处理。
3. 多平面单应性模型的适用场景
- 需分平面处理的情况:
若场景需要将不同平面(如前景物体和背景)投影到不同的虚拟平面上(例如增强现实中的分层渲染),则需要为每个平面计算单独的单应性矩阵。 - 代码未涉及的原因:
您的代码是基础的双目标定流程,目的是获取相机的几何参数(而非场景内容分析)。多平面单应性模型需要额外的平面分割和分区域变换步骤,通常在后续的立体匹配或场景理解中实现。
4. 关键代码段解析
(1) 立体标定(stereoCalibrate
)
cpp
double stereoError = stereoCalibrate( | |
objectPoints, leftImagePoints, rightImagePoints, | |
leftCameraMatrix, leftDistCoeffs, | |
rightCameraMatrix, rightDistCoeffs, | |
imageSize, R, T, E, F, | |
CALIB_FIX_INTRINSIC // 固定内参,仅优化外参 | |
); |
- 作用:计算左右相机之间的旋转矩阵
R
和平移向量T
,用于描述右相机相对于左相机的位置和方向。 - 输出:本质矩阵
E
和基础矩阵F
描述了极线约束关系,但实际校正中未直接使用。
(2) 立体校正(stereoRectify
)
cpp
stereoRectify( | |
leftCameraMatrix, leftDistCoeffs, | |
rightCameraMatrix, rightDistCoeffs, | |
imageSize, R, T, R1, R2, P1, P2, Q, | |
0, 0, imageSize | |
); |
- 核心输出:
R1
,R2
:左右相机的校正旋转矩阵,将成像平面旋转到共面行对准的坐标系。P1
,P2
:左右相机的新投影矩阵,包含校正后的内参和虚拟平面信息。Q
:视差到深度的映射矩阵,用于后续三维重建。
- 几何意义:通过
R1
和R2
的变换,使得左右图像中的对应点仅需在水平方向搜索。
5. 不同平面的视差一致性验证
- 标定板场景:所有角点位于同一平面,校正后视差应严格符合 xL−xR=fB/Z。
- 多平面场景验证:
若在复杂场景(如物体和背景)中观察到视差异常,需排查以下问题:- 标定误差:标定板角点检测误差或相机参数不准确会导致校正矩阵偏差。
- 立体匹配算法限制:SGBM等算法在弱纹理区域的匹配可能失效。
- 校正后极线未严格水平:使用
cv::stereoRectify
的alpha
参数调整有效区域,确保极线对齐。
6. 改进方向
若需处理多平面场景(如物体与背景分离):
- 平面分割:使用深度图或语义分割区分不同平面。
- 分区域校正:对每个平面单独计算单应性矩阵(需结合场景几何先验)。
- 视差图后处理:通过平面掩码优化不同区域的视差。
总结
通过全局几何变换(R1
, R2
)实现了极线校正,无需多平面单应性模型即可保证视差计算的正确性。多平面模型仅在需要分层次处理场景时引入,属于高级应用范畴,不影响基础校正流程的准确性。