您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 立体视觉再次整理学习
双目测距的基本原理如上图所示,双目测距主要是利用了目标点在左右两幅视图上成像的横坐标直接存在的差异(即视差dlrxx)与目标点到成像平面的距离Z存在着反比例的关系:ZfTd。其中:f焦距d视差xT摄像头中心距xc左像平面的坐标系与立体坐标系中原点的偏移yc右像平面的坐标系与立体坐标系中原点的偏移其中f,xT,xc和yc可以通过立体标定获得初始值,并通过立体校准优化,使得两个摄像头在数学上完全平行放置,并且左右摄像头的xc,yc和f形同。而立体匹配所做的工作,就是在之前的基础上,求取视差d(这个d一般需要达到亚像素精度)。假设目标点在左视图中的坐标为(x,y),在左右视图上形成的视差为d,目标点在以左摄像头为原点的世界坐标系中的坐标为(X,Y,Z),则存在上图所示的变换矩阵Q,使得1QxydXYZW。图像的获取摄像头定标摄像头定标一般都需要一个放在摄像头前的特制的标定参照物(棋盘纸),摄像头获取该物体的图像,并由此计算摄像头的内外参数。标定参照物上的每一个特征点相对于世界坐标系的位置在制作时应精确测定,世界坐标系可选为参照物的物体坐标系。在得到这些已知点在图像上的投影位置后,可计算出摄像头的内外参数。如上图所示,摄像头由于光学透镜的特性使得成像存在着径向畸变,可由三个参数1k,2k,3k确定;由于装配方面的误差,传感器与光学镜头之间并非完全平行,因此成像存在切向畸变,可由两个参数1p,2p确定。单个摄像头的定标主要是计算出摄像头的内参(焦距f和成像原点xc,yc、五个畸变参数(一般只需要计算出1k,2k,1p,2p,对于鱼眼镜头等径向畸变特别大的才需要计算3k))以及外参(标定物的世界坐标)。OpenCV中使用的求解焦距和成像原点的算法是基于张正友的方法,而求解畸变参数是基于Brown的方法。1.图像坐标系、摄像头坐标系和世界坐标系的关系摄像头成像几何关系,其中CO点称为摄像头(透镜)的光心,CX轴和CY轴与图像的X轴和Y轴平行,CZ轴为摄像头的光轴,它与图像平面垂直。光轴与图像平面的交点1O,即为图像坐标系的原点。由点CO与CX、CY、CZ轴组成的坐标系称为摄像头坐标系,CO1O的距离为摄像头焦距,用f表示。图像坐标系是一个二维平面,又称为像平面,实际上就是摄像头的CCD传感器的表面。每个CCD传感器都有一定的尺寸,也有一定的分辨率,这个就确定了毫米与像素点之间的转换关系。举个例子,CCD的尺寸是86mmmm,帧画面的分辨率设置为640480pixelpixel,那么毫米与像素点之间的转换关系就是80/pixelmm。设CCD传感器每个像素点的物理大小为dxdy,相应地,就有180dxdy。00101011001kuxvyluv其中,像素点的大小为kl,单位为毫米。cot000001sin001011CCCCffxfyXYZZ其中,f为摄像机焦距,为摄像机坐标系的偏斜度(即两坐标轴不完全垂直,镜头坐标和CCD是否垂直)。需要说明的是,一般情况下,很接近90,所以在要求不是很严格的情况下就直接将设为90。可能引起误差的情况是:当对一幅照片进行拍摄的时候,由于摄影变换使得照片的图像坐标系在重新成像后不是90了。此时,若忽略这个参数,将产生很大的定标误差。0CC0C00C1cot000000110sin001010011cot01100=sin00101YZZCCCCCCffkufvlffkkfAluXvZuXYvPZZ由于矩阵A包含了摄像机全部的6个内参数0,0,,,,klfuv,所以称A为摄像机内参数矩阵。这些参数可能会随着温度、湿度、气压等环境因素的变化而改变,所以为了保证定标的精度,有必要对各内参数进行标定。33331110CwCwTCwXXtRYYZZ其中,33()xyzRrrr为旋转矩阵,33xyztttt为平移向量,0(000)T摄像头矩阵(内参)的目的是把图像的点从图像坐标转换成实际物理的三维坐标。qMQ其中xqyw,00001xxyyMfcfc,XQYZ2.进行摄像头定标时,棋盘方格的实际大小square_size(默认为1.0f)的设置对定标参数的影响。在标定时,需要指定一个棋盘方格的长度,这个长度(一般以毫米为单位,如果需要更精确可以设为0.1毫米量级)与实际长度相同,标定得出的结果才能用于实际距离测量。一般如果尺寸设定准确的话,通过立体标定得出的Translation向量的第一个分量xT的绝对值就是左右摄像头的中心距。3.OpenCV中用cvCalibrateCamera2进行相机标定的精度差,标定结果不稳定原因。原因一:可能是在标定的时候标定板所在平面与成像平面(imageplane)之间的夹角太小,张正友论文里的仿真数据(有噪声的数据)说明当两者夹角太小误差会很大,从张正友的论文里给出的5幅图中,其中标定平面与成像平面的夹角分别为:8.8947、11.2325、24.4875、10.8535、9.5829(单位:度)。而且张正友的论文中也提到两幅标定板之间的位置平行放置的话,相当于一幅。因此在实际标定中平行放置的情况最好避免。原因二:标定时拍摄的图片太少,虽然张正友的论文里只用了5幅图片,但是建议10来幅左右还是必要的,因为实际中可能标定板用A4的纸打印出来贴在一块板上的,标定板上的世界坐标精度就不是特别高,多拍摄几幅图像能减少这方面带来的误差,而且多个角度拍摄也可能解决了问题一(标定板和成像平面夹角小的问题)。原因三:图像上角点提取的不准确,用cvFindChessboardCorners函数找角点不是很好,假如拍到的图像不是完整的棋盘格的时候肯定会有问题的,而且也可能用这个函数提取不出角点,建议可以用其他工具:OpenCVandMatLabCameraCalibrationToolboxesEnhancementCameraCalibrationToolboxforMatlabOpenCV2.1以后对图像角点的提取准确度比较高,cvFindChessboardCorners和cvFindCornerSubPix结合可以获得很好的角点检测效果。因此,影响定标结果较大的就是标定板与镜头的夹角和棋盘图像数目,在实际定标过程中,棋盘图像数目应该大于20张,每成功检测一次完整的棋盘角点就要变换一下标定板的姿态(包括角度、距离)。4.单目定标函数cvCalibrateCamera2采用怎样的flags比较合适?由于一般镜头只需要计算1k,2k,1p,2p四个参数,所以我们首先要设置CV_CALIB_FIX_K3;其次,如果所用的摄像头不是高端的、切向畸变系数非常少的,则不要设置CV_CALIB_ZERO_TANGENT_DIST,否则单目校正误差会很大;如果事先知道摄像头内参的大概数值,并且cvCalibrateCamera2函数的第五个参数intrinsic_matrix非空,则也可设置CV_CALIB_USE_INTRINSIC_GUESS,以输入的intrinsic_matrix为初始估计值来加快内参的计算;其它的flag一般都不需要设置,对单目定标的影响不大。双目定标和双目校正双目摄像头定标不仅要得出每个摄像头的内部参数,还需要通过标定来测量两个摄像头之间的相对位置(即右摄像头相对于左摄像头的三维平移t和旋转R参数)。要计算目标点在左右两个视图上形成的视差,首先要把该点在左右视图上两个对应的像点匹配起来。然而,在二维空间上匹配对应点是非常耗时的,为了减少匹配搜索范围,我们可以利用极线约束使得对应点的匹配由二维搜索降为一维搜索。而双目校正的作用就是要把消除畸变后的两幅图像严格地行对应,使得两幅图像的对极线恰好在同一水平线上,这样一幅图像上任意一点与其在另一幅图像上的对应点就必然具有相同的行号,只需在该行进行一维搜索即可匹配到对应点。1.关于cvStereoCalibrate的使用如果按照LearningOpenCV的例程,直接通过cvStereoCalibrate来实现双目定标,很容易产生比较大的图像畸变,边角处的变形较厉害。最好先通过cvCalibrateCamera2对每个摄像头单独进行定标,再利用cvStereoCalibrate进行双目定标。这样定标所得参数才比较准确,随后的校正也不会有明显的畸变。2.cvStereoCalibrate计算EssentialMatrix和FundamentalMatrix(1)EssentialMatrix本征矩阵如上图所示,给定一个目标点p,以左摄像头光心lO为原点。点p相对于光心lO的观察位置为lP,相对于光心rO的观察位置为rP。点p在左摄像头成像平面上的位置为lp,在右摄像头成像平面上的位置为rp。注意lP、rP、lp、rp都处于摄像机坐标系,其量纲是与平移向量T相同的(lp、rp在图像坐标系中对应的像素坐标为lq、rq)。假设右摄像头相对于左摄像头的相对位置关系由旋转矩阵R和平移向量T表示,则可得:()rlRTPP。现在我们要寻找由点p、lO和rO确定的对极平面的表达式。注意到平面上任意一点x与点a的连线垂直于平面法向量n,即向量(x-a)与向量n的点积为0:()0xan。在lO坐标系中,光心rO的位置为T,则p、lO和rO确定的对极平面可由下式表示:()0()TlTlTPP。由()rlRTPP和1RTR可得:()0()TrTTrPRP。另一方面,向量的叉积又可表示为矩阵与向量的乘积,记向量T的矩阵表示为S,得:llTSPP。那么就得到:0()TlRSrPP。这样,我们就得到EssentialMatrix:E=RS。通过矩阵E我们知道lP和rp的关系满足:0()TlErPP。进一步地,由1/lllpfPZ和/rrrrpfPZ。我们可以得到点P在左右两个摄像机坐标系中的观察点lp和rp应满足的极线约束关系为:0()TlErpp。注意到E是不满秩的,它的秩为2,那么0()TlErpp表示的实际上是一条直线,也就是对极线。(2)FundamentalMatrix基础矩阵由于矩阵E并不包含摄像头内参信息,且E是面向摄像头坐标系的。实际上我们更感兴趣的是在图像像素坐标系上去研究一个像素点在另一视图上的对极线,这就需要用到摄像机的内参信息将摄像头坐标系和图像像素坐标系联系起来。在(1)中,lp和rp是物理坐标值,对应的像素坐标值为lq和rq,摄像头内参矩阵为M,则有:1pqM。从而:0()TlErpp,11()0TrlrlEqqMM。这里,我们就得到FundamentalMatrix:11()rlFEMM。并有0TrlFqq。3.cvStereoCalibrate计算EssentialMatrix和FundamentalMatrix4.双目校正原理及cvStereoRectify的应用如图所示,双目校正是根据摄像头定标后获得的单目内参数据(焦距、成像原点、畸变系数)和双目相对位置关系(旋转矩阵和平移向量),分别对左右视图进行消除畸变和行对准,使得左右视图的成像原点坐标一致(CV_CALIB_ZERO_DISPARITY标志位设置时发生作用)、两摄像头光轴平行、左右成像平面共面、对极线行对齐。在OpenCV2.1版之前,cvStereoRectify的主要工作就是完成上述操作,校正后的显示效果如图(c)所示。可以看到校正后左右视图的
本文标题:立体视觉再次整理学习
链接地址:https://www.777doc.com/doc-2152034 .html