当前位置:首页 > 立体视觉知识补充
现在我们有一架平衡双目摄像机,和一个棋盘和一个待重构的物体或者要拍摄的画面,我们的目的就是利用两个摄像机捕捉同一个画面或者物体图像,然后根据在两幅图像上遍历同一个世界三维点映射到两个图像平面的响应匹配点,然后利用匹配点视差和摄像机相关参数,以及图像二维点的信息就可以得到世界物体的三维坐标。
1、立体标定
cvStereoCalibrate(),利用两个摄像机同时捕获的不同视场来实现标定,同时获得本征矩阵E,基础矩阵F,两摄像机坐标系的旋转矩阵R和平移矩阵T或者摄像机内参数M和畸变系数distCoeffs。
立体标定和单摄像机标定是有区别的。立体标定除了可以计算出摄像机的内参数和畸变系数,还可以计算出本征矩阵E,基础矩阵F,两个摄像机的旋转矩阵R和平移向量T.
立体标定函数参数中需要两个着相机的内参数和畸变系数,它们即可以作为输入,也可以作为输出,这里我们让它们作为输出,由立体标定函数计算它们。
因此,我们就可以手持棋盘,然后用两个摄像机同时捕捉棋盘的不同视场,对于每一个视场,我们两个摄像机都有拍摄的同一棋盘的图像对,对于两个摄像机旋转矩阵R和平移向量T,我们通过一个视场就可以求解出来,然而为了计算结果的稳定,则需要多个视场来优化结果。对于两个摄像机的内参数矩阵和畸变系数,我们至少需要10个视场。因此,我们可以通过手持棋盘,旋转和平移棋盘以获得10个视场,从而获得10幅图像对,来进行立体标定。
在这一步,我们利用极线约束来检查标定的结果。(有了本征矩阵我们就可以得到基础矩阵,有了基础矩阵,我们就可以计算极线)
2、立体校正
cvStereoRetify(),利用相机内参数以及上一步得到R,T,得到两个摄像机极线水平对准的旋转矩阵Rl和Rr,投影矩阵P,重投影矩阵Q,为实现两幅图像水平对准准备数据。
该函数名为立体校正,并没有完成真正的立体校正,而是获得了立体校正的所需要的参数。通过立体校正,我们可以获得两个摄像机的投影矩阵P,有了投影矩阵,我们可以利用相机模型公式5-19,然后在利用立体校正后的图像(特征点水平对齐)来进行三维坐标计算。然而我们可能并不这样做,因为OpenCV已经给出了计算的函数,输入视差图和重投影矩阵Q,得到三维点坐标。
有时候,我们在三维重建的时候,这样做:假设我们想重建一个物体,我们用两个摄像机拍摄这个物体,如果该物体有足够的surf特征点,我们获取这两幅图像的特征点的坐标位置,然后利用立体校正得到投影矩阵,计算获取物体三维点云。这样的步骤是错误的,或者做出来可能效果也不好。因为我我们进行立体标定的目的是为了使得两幅图像水平对齐,也就是两台摄像机的光轴是平行的,即无穷远处相交。我们知道对于两幅图像,水平对齐后,像对于的特征点或者匹配点在同一图像扫描行上,这样,我们才能利用理想情况下的深度公式:Z=fT/x1-x2,f为焦距,T表示两个相机光轴之间的距离。我们可以假设,如果我们获得的两幅图像对应的匹配点,不在同一行,那么x1-x2,就会发生变化。
因此,如果我们在做图像预处理时,一定要始终保持两幅图像的大小是一样的。不能随便的剪切。
3、校正映射
分为两个步骤:计算查找表和重投影,此步完成真值的图像的校正。
1、cvInitUndistortRectifyMap()函数利用摄像机内参数M和畸变系数,以及投影矩阵P或者校正后的摄像机内参数Mrect,以及旋转矩阵T,来计算原始图像到校正后的查找表。
2、cvRemap函数,利用计算得到的查找表,和拍摄得到原始图像,设置一定的插值方法,得到校正后的图像。
由于左右图像都需要校正,所以该过程要进行两次。
4、立体匹配
到了这一步,我们就可以根据具体的情况,应用不同的特征点匹配了。
OpenCV实现的块匹配算法相当于密集点匹配算法,我们也可以利用稀疏点匹配算法,如sift等。通过这些匹配点,我们就可以获得匹配点的位置,即x1和x2,我们就可以计算得到他们之间的视差,从而得到计算得到三维点坐标。
对于一个物体点的坐标(X,Y,Z),我们关心的更多的是Z,Z就是所谓的深度,通俗一点:Z是两个摄像机透镜中心(光心)所在平面到物体点所在平面之间的距离。(推导见:相机模型)因为我们计算的过程中操作的的大部分是像素,那么我们得到距离也是用像素来度量的。
5、现实世界单位和像素的关系
这个问题是个头疼的问题,我感觉只有等待自己亲自验证了,才能肯定的回答,但是我在这里分析一下先。
1)世界物体的三维点,一般选择的应该是左摄像机的投影中心为坐标系的原点(数学模型中的)。视差是左摄像机对应的匹配点的x坐标减去右相机对应的匹配点的x坐标。
我们知道,如果知道了视差和重投影矩阵,以及匹配点就可以根据公式求解出三维点坐标。我们将主要公式列出:
(Q中除了c'x来至于右相机,其他参数均是左相机,Tx为为左摄像机投影中心到右摄像机投影中的平移向量的x分量)如果Q是由Pl和Pr联合求解的得到的话,那么Q中cx和cy等参数都应该是校正后的摄像机参数了。如果那样的话,主光线在无穷远处相交,则cx=c'x,既然我们使用的校正后的摄像机内参数,那么cx就必然等于c'x了,那为什么还会列出上面的Q表达式呢,直接将Q矩阵的右下角设置为0不就好了吗?难道它也在告诉我们,我们使用Q时也可以在用校正前的摄像机内参数求解?这不得而知了。
2)我们知道摄像机的内参数是根据单应性求解得到的。 为了理解,我们引入下图:
在棋盘平面上,我们定义一个三维坐标系,棋盘平面上的一个内角点就是一个世界物理点,这个三维坐标系中,棋盘位于xoy平面内,那么棋盘上的点的z坐标就是0值。
我们知道从棋盘上的点(X,Y,0),映射到图像平面内的点(x,y),如果没有摄像机内参数的影响,即摄像机是完美的,也或者说摄像机的内参数矩阵是单位阵。那么三维点(其实是平面内的一点)经过一定的旋转R和平移t,就可以到达图像平面内的一点。但是实际上摄像机并不是完美的,那么这个单应性矩阵中,就含有摄像机的内参数。
共分享92篇相关文档