OpenCV笔记—投影与三维测量

一、立体成像

1.1 概述

立体成像通道寻找两个画面的对应点,来计算三维位置。为了减少搜寻的计算成本,要尽可能的限制搜寻范围。
包括以下几个步骤:
1.去畸变:消除径向和切向透镜畸变;
2.标定:使得左右相机的图像是行对齐的;
3.匹配:从左右相机的图像中,找到相同特征,计算视差;
4.重投影:将视差转化为距离

1.2 三角测量

假设两个相机的图像平面完全共面,光轴平行,对应行精确的对齐。基线为T,焦距为f,点p在左右中的横坐标分别为xl,xr,深度为:
Z = f T x l − x r Z= \frac{f T}{x_l - x_r} Z=xlxrfT
由上式画出视差与深度的关系,两个成反比。视差小的时候,微小的视差变化会造成大的深度变化。只有物体离相机较近时才有较高的深度分辨率。

无畸变矫正后的立体坐标系,以图像的左上角为原点,两个平面行对齐,投影中心为Ol、Or,主光线与图像平面相交于主点(cx,cy)。相机坐标系以左相机的投影中心为原点,在计算时,需要将图像上的点,由相机坐标系转到像素坐标系。
在这里插入图片描述

1.3 对极几何

左右相机分别有投影中心Ol、Or和投影平面,点P投影到投影平面的点分别为pl、pr。投影中心的连线交于投影平面的点为极点el、er,由极点和物理点p组成的平面称为极面,线plel、prer为极线。
当点P投影到右侧平面时,该点实际上可能位于P到Ol线段中的任意位置,我们无法知道相机与点P之间的距离,如果该点投影到左相机的投影平面上,那它将会位于对应的极线上。
所以,给点右相机上的一个点,对应左相机上的匹配点一定位于极线上。

在这里插入图片描述

1.4 本征矩阵与基本矩阵

本征矩阵E包含两个相机间的平移和旋转的信息,将在左右相机坐标系中观察到的P点的物理坐标关联了起来(pl与pr)。基本矩阵F除了包含本征矩阵外,还包含了两个相机的内参数,将像素坐标系中左右相机的点关联了起来(ql与qr)。
1.本征矩阵的数学原理
左右相机坐标系下的物理点p,通过旋转和平移矩阵关联在了一起,pr=R(pl-T)。在极面上,有向量pl和T,平面的法向量为两者的叉乘,因此他们满足
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020090419545055.png#pic_center
将(pl-T)带入上式中,得到
在这里插入图片描述
将叉乘写成矩阵乘法的形式
在这里插入图片描述
在这里插入图片描述
这里RS就是本征矩阵E的定义,这里的P是世界坐标系下的点,利用投影公式将其转成相机坐标系下的点p
E是秩为2的3*3的矩阵,有五个旋转平移参数,以及两个约束:行列式为0、两个非奇异值相等
在这里插入图片描述
2.基本矩阵数学
基本矩阵引入了内参矩阵,将相机坐标系下的点转化为像素坐标系下的点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
利用函数findFundamentalMat()计算基本矩阵
在这里插入图片描述
前两个参数为二维点或三维点的数组;第三个参数确定计算基本矩阵的方法;7点算法和8点算法对异常值十分敏感,可用后面两种算法,param1是RANSAC算法中,从点到极线的最大距离,超过此距离被认为是异常值。函数返回值是一个Mat数组,可用于计算极线的函数。
在这里插入图片描述

1.4计算极线

computeCorrespondEpilines()用于计算另一幅图像中对应的极线,给定一副图像的任意点,另一幅图像中有不同对应的极线,算出的极线以ax+by+c=0来表示。第一个参数是二维或三维数组;第二个参数为1或2,标明哪一个函数被定义,F是基本矩阵。
在这里插入图片描述

1.5立体标定

立体标定用stereoCalibrate()查找两个相机之间的旋转矩阵和平移矢量,并且可以计算相机的畸变矩阵,本征矩阵和基本矩阵。分别对两个相机进行标定,计算旋转矩阵和平移矢量。每一对棋盘图都会使RT产生变换,使用R\T的中间值作为近似值,用迭代算法,使得投影误差最小
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

stereoCalibrate(
InputArrayOfArrays objectPoints,//三维点
InputArrayOfArrays imagePoints1,InputArrayOfArrays imagePoints2, //左右相机上的点,即为函数找到的角点
InputOutputArray cameraMatrix1,InputOutputArray distCoeffs1, //左相机矩阵和畸变系数
InputOutputArray cameraMatrix2, InputOutputArray distCoeffs2, //右相机矩阵和畸变系数
Size imageSize, OutputArray R,OutputArray T,//图像大小和输出
OutputArray E, OutputArray F, 
int flags=CALIB_FIX_INTRINSIC , //使用这些矩阵中的值
TermCriteria criteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 1e-6))

1.6立体校正

Bouguet算法:给点两幅图像的旋转和平移,使得没付图像的重投影变化最小化,同时最大化视图的公共视野。
1.将右相机图像到左相机图像的旋转矩阵分为两部分:rr和rl;
2.两个相机各旋转一半,左右相机的图像共面,但还未行对准,需要将极点变换到无穷远处,达到行对准;
3.构造变换矩阵Rrect,通过右相机到左相机的平移矩阵T。首先构造e1,极点要变换到无穷远处,极线要水平,那么左右相机的投影中心之间的平移向量就是左极点的方向
在这里插入图片描述
4.e2与主光轴正交,可以通过e1与主光线方向的交叉乘积获得,e3又与e1e2正交
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

void stereoRectify(InputArray cameraMatrix1, InputArray distCoeffs1, //相机标定的矩阵和畸变系数
InputArray cameraMatrix2,InputArray distCoeffs2, Size imageSize, 
InputArray R, InputArray T,//外参
OutputArray R1, OutputArray R2, //左右相机行对准的旋转矩阵
OutputArray P1, OutputArray P2, OutputArray Q, 
int flags=CALIB_ZERO_DISPARITY, double alpha=-1, 
Size newImageSize=Size(), Rect* validPixROI1=0, Rect* validPixROI2=0 )

1.7 校正映射

利用initUndistortRectifyMap()来预计算左右视图的校正查找图,如图所示,函数的校正过程从c到a延伸,对于标定图像c中的每一个整型像素,我们从未畸变的b中找到其坐标,并用它来找到原始图像a中实际浮点坐标,浮点坐标的像素值由该像素的邻近整型像素位置插值得到,一般用双线性插值
在这里插入图片描述

 initUndistortRectifyMap( 
 InputArray cameraMatrix, //相机的内参矩阵
 InputArray distCoeffs,//畸变参数
InputArray R, //旋转矩阵,校正函数中的R
InputArray newCameraMatrix,//经过校正后的相机矩阵,校正函数中的p的前三列
Size size,
 int m1type, 
 OutputArray map1, //映射表,从什么地方为每个目标图像插值源像素
 OutputArray map2 );//映射表可以直接插入到remap中

1.8 立体匹配

块匹配
步骤:
1.预过滤使得图像亮度归一化,并增强纹理。用一个33到2121的窗口,中心像素的灰度值为min(max(Ic-I,-Icap),Icap),Ic为窗口的平均灰度值,Icap为一个阈值,默认30。
2.使用SAD窗口,对于左侧像素点,在右侧寻找匹配点,匹配查找起始于最小视差点(视差为0),向左移动视差个数的位置
在这里插入图片描述
最小允许视差增量与深度范围分辨率的关系为
在这里插入图片描述
3.后置滤波以消除不良匹配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值