opencv投影与三维视觉

 

计算极线

opencv函数cv:computeCorrespondEpilines()根据一幅图像中的点列,计算另一幅图像中对应的极线,每条极线以三点(a,b,c)的形式编码,定义为ax+by+c=0

书上两节都叫立体校正,机翻笑嘻了

立体校正

通过校正,两个摄像机的光轴是平行的

立体校正取决于查找两个摄像机之间的旋转矩阵R和平移矢量T

立体校正和单摄像机标定之间区别:

1.立体校正cv::sterepCalibrate()不仅可以算R和T,还可以算畸变矩阵,本征矩阵和基本矩阵

cv::calibrateCamera()得到的结果是相机内参矩阵,畸变系数,旋转向量和平移向量

2.在函数cv::calibrateCamera()中,以摄像机和棋盘视图之间的一系列旋转和平移结束,

而在函数cv::sterepCalibrate()中,我们搜寻单个旋转矩阵和平移向量来联系左右摄像机

先使用cv::calibrateCamera()计算每个摄像机对应的旋转和平移参数,然后将这些参数带入求解两个摄像机之间的旋转和平移矩阵          
为了消除每一对棋盘的R和T误差,将R和T参数的中间值作为初始值并采用鲁棒的Levenberg-Marquardt 迭代算法,找到棋盘角点在两个摄像机视图的最小投影误差,返回R和T最终结果。         
为了使结果清晰,旋转矩阵被用作到与左摄像机共面的右摄像机上,保证两个像平面平行但不是行对准        

两个摄像机几乎不存在完全共面的行对齐的像平面,立体校正的目的使将两个摄像机的像平面重新映射,使二者位于完全相同的平面上,图像行完全对准到前向平行配置

非标定立体校正:Hartley算法

Hartley算法旨在找到将极点映射到无穷远处的单应矩阵,同时使两幅立体图像之间的计算误差最小化,这样可以通过匹配两幅图像之间的对应点实现

避免了计算两个摄像机的内参数,因为内参数隐含在点的匹配中

Hartley算法优点是可以通过观察场景中的点简便的进行在线立体校正,缺点是场景的图像尺寸未知,例如如果用棋盘生成点对,将无从知道棋盘从一端到另一端距离,也无法知道摄像机内参数

即立体重构的非唯一性:不同大小的物体,在焦距和主点不同情况下可能像相同

假设已知基本矩阵,Hartley算法过程:

  1. 使用基本矩阵,通过F * el=0和er * F=0 分别计算左右极点
  2. 求单应矩阵Hr将右极点映射到无穷远
  3. 选择右侧图像原点映射到左侧图像原点,所求单应矩阵将由Hr = G * R * T得到
  4. 搜寻一个匹配的单应矩阵Hl,将左极点发送到无穷远,并使两图像对齐

已标定的立体校正:Bouguet算法

Bouguet极线校正方法:左右相机成像平面各旋转一半,使得左右图像重投影造成的误差最小,左右视图的共同面积最大。

由cv::stereoRectify()实现