摄像机标定.doc

上传人:豆**** 文档编号:17609519 上传时间:2022-05-25 格式:DOC 页数:16 大小:235.50KB
返回 下载 相关 举报
摄像机标定.doc_第1页
第1页 / 共16页
摄像机标定.doc_第2页
第2页 / 共16页
点击查看更多>>
资源描述

《摄像机标定.doc》由会员分享,可在线阅读,更多相关《摄像机标定.doc(16页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流摄像机标定.精品文档.摄像机标定1、摄像机外参:决定摄像机坐标与世界坐标系之间相对位置关系。其中Pw为世界坐标,Pc是摄像机坐标,他们之间关系为Pc = RPw + T式中,T= (Tx,Ty,Tz),是平移向量,R = R(,)是旋转矩阵,分别是绕摄像机坐标系z轴旋转角度为,绕y轴旋转角度为,绕x轴旋转角度为。6个参数组成(,Tx,Ty,Tz)为摄像机外参。2、摄像机内参:确定摄像机从三维空间到二维图像的投影关系。针孔摄像机模型为6个参数(f,Sx,Sy,Cx,Cy);远心摄像机模型为5个参数(f,Sx,Sy,Cx,Cy)。线阵摄像机为9个

2、参数(f,Sx,Sy,Cx,Cy,width.highth)。其中,f为焦距;表示径向畸变量级,如果为负值,畸变为桶型畸变,如果为正值,那畸变为枕型畸变。Sx,Sy是缩放比例因子。对针孔摄像机来讲,表示图像传感器上水平和垂直方向上相邻像素之间的距离;对于远心摄像机模型,表示像素在世界坐标系中的尺寸。Cx,Cy是图像的主点。对针孔摄像机来讲,这个点是投影中心在成像平面上的垂直投影,同时也是径向畸变的中心。对于远心摄像机模型,只表示畸变的中心。Vx,Vy,Vz:线阵摄像机必须与被拍摄物体之间有相对移动才能拍摄到一幅有用的图像。这是运动向量。sx和sy是相邻像元的水平和垂直距离3、标定板为正方形,尺

3、寸大小为要照射区域宽度的1/3,如像区为100*80mm,那么标定板为30*30mm。其中标定板按照D:Program FilesHALCON-10.0calib(具体的视个人安装位置所定)来用CAD画图。下面是自制标定板的网址。4、按照下面网址步骤进行标定5、具体实施步骤标定的目的是确定相机的内参和外参。第一步:依照halcon标定板描述文件(后缀名是.descr)尺寸制作标定板。一般标定板大小是照射区域的1/3,每个标定孔的像素不能少于10个。第二步:先定义内参的初始值。StartCamPar:=0.006,0,6e-6,6e-6,Width*0.5,Height*0.5,Width,He

4、ight依次是焦距,畸变,像素尺寸宽,像素尺寸高,中心点坐标宽,中心点坐标高,图片尺寸第三步:通过标定助手实现标定把内存保存成文件,通过标定助手完成。write_cam_par (StartCamPar, E:/Halcon例子/摄像机标定/标定.dat)导入自己刚才保存的参数选择正确的描述文件然后可以标定了利用相机不断采集标定为使得图片标定完成,调节下面这些参数。具体参数意义见翻译的find_caltab、find_marks_and_pose这两个参数。标定要是有问题会提示警告,如果没有问题,标定板在每个位置每个标定孔都能识别出来。标定需要转化十几副图片来准确确定内参和外参。查看结果相机外

5、参显示在这块相机内参会显示在这块点击保存可以把内参和外参保存成文件。接着可以入下图插入代码。插入代码,插入整个标定过程第四步:使用程序实现相机标定create_calib_data (calibration_object, 1, 1, CalibModelID)set_calib_data_cam_param (CalibModelID, 0, area_scan_division, StartCamPar)set_calib_data_calib_object (CalibModelID, 0, caltab_100mm.descr)先定义一个标定模版句柄。接着打开相机取图或者直接读文件里的

6、图,开始标定。通过find_caltab找到标定板位置,然后通过find_marks_and_pose确定标定点坐标和相机外参RCoord, CCoord, StartPose。通过set_calib_data_observ_points把读取的标定点坐标与描述文件比较结合相机外参,不断修正相机标定模版CalibModelID。calibrate_cameras (CalibModelID, ErrorsDiv)get_calib_data (CalibModelID, camera, 0, params, CamParam)标定相机,读取相机的参数给CamParam(内参)。第五步:转化成世

7、界坐标image_points_to_world_plane (CamParam, StartPose, Row, Col, mm, X1, Y1)把图片中的Row, Col点们转化到世界坐标值X1, Y1通过下面计算两点距离distance_pp (X10:4, Y10:4, X11:5, Y11:5, Distance)可以通过image_to_world_plane来转化图片第六步:确定原点(没有实验,待验证)标定时换很多位置放置标定板其实是为了内参标定的更准确,外参只要一张标定板图就可以确定了。因此,换各个角度标定内参,最后一个位置把标定板放在自己想要的坐标原点位置再标定一次,那么转换

8、成世界坐标后,坐标原点就是标定板中心点,标定板上的小黑角在第三象限,依次右手为Y轴,X轴。(注:标定板防止的平面Z最好与使用的平面平行。Z轴正方向为垂直平面向下。然后,考虑标定板的厚度0.75mm,重新设置原点,光Z改变了(下面函数单位为m)。set_origin_pose (Pose, 0, 0, 0.00075, NewPose)第七步完成:完成。张正友摄像机标定的研究(MATLAB+OpenCV)张正友 本科浙大,本来以为是中国人论文是中文呢,哎张正友的主页:不过里面的棋盘格跟我的不一样啊,why?,我决定先看看中文的论文吧,我的首要任务是弄清楚输入输出,流程,怎么用吧matlab 跟

9、opencv上都有张正友的实现matlab calibration主页 :http:/www.vision.caltech.edu/bouguetj/calib_doc/GML C+ Camera Calibration Toolbox:http:/graphics.cs.msu.ru/en/science/research/calibration/cpp因为cvCalibrateCamera2 函数主要是用张正友的平面标定方法的,所以首先我建议大家看一下张正友的那篇经典的论文1) 完整版 22页 里面分析的非常详细A Flexible New Technique for Camera Cal

10、ibration.rar(2) 精简版 8页Flexible Camera Calibration by Viewing a Plane from Unknown Orientations - Zhang, ICCV99,(http:/www.vision.caltech.edu/bouguetj/ . zhan99.pdf)piao 在opencv论坛上的帖子在OpenCV中用cvCalibrateCamera2进行相机标定(附程序)看到论坛里有不少人在用OpenCV中的标定函数cvCalibrateCamera2 进行相机标定时遇到不少问题,说一些自己的看法。1)因为cvCalibrate

11、Camera2 函数主要是用张正友的平面标定方法的,所以首先我建议大家看一下张正友的那篇经典的论文完整版 22页 里面分析的非常详细A Flexible New Technique for Camera Calibration.rar(精简版 8页Flexible Camera Calibration by Viewing a Plane from Unknown Orientations - Zhang, ICCV99,(http:/www.vision.caltech.edu/bouguetj/ . zhan99.pdf)2)至于不少人说OpenCV中用cvCalibrateCamera2

12、 进行相机标定的精度差,标定结果不稳定,我想可能的原因有:原因之一)可能是在标定的时候标定板所在平面与成像平面(image plane)之间的夹角太小,张正友论文里的仿真数据(有噪声的数据)说明当两者夹角太小误差会很大, 从张正友的论文里给出的5幅图中(8.8947 11.2325 24.4875 10.8535 9.5829(单位:度)。而且张正友的论文中也提到两幅标定板之间的位置平行放置的话,相关相当于一幅 因此在实际标定中平行放置的情况最好避免,可能有时你无形之中就犯了这个错误。原因之二)标定时拍摄的图片太少,虽然张正友的论文里只用了5幅图片,但是我建议搞个10来幅左右还是必要的,因为我

13、们实际中可能标定板用A4的纸打印出来贴在一块板上的,标定板上的世界坐标精度就不是特别高,多拍摄几幅图像能减少这方面带来的误差,而且多个角度拍摄也可能解决了问题一:标定板和成像平面夹角小的问题。这个家伙用20幅来标定(http:/www.vision.caltech.edu/bouguetj/ . ample.html)原因之三)图像上角点提取的不准确,我认为用cvFindChessboardCorners函数找角点不是很好,假如拍到的图像不是完整的棋盘格的时候肯定会有问题的,而且也不少人反应用这个函数提取不出角点,建议可以用其他工具 比如:OpenCV and MatLab Camera Ca

14、libration Toolboxes Enhancement(http:/graphics.cs.msu.ru/en/research/calibration/)Camera Calibration Toolbox for Matlab(http:/www.vision.caltech.edu/bouguetj/calib_doc/htmls/example.html)强烈推荐当然还有可能其他人为的什么原因。3)建议用其他方法比如Tsai的标定方法或其他的标定工具进行标定强烈推荐 用这个matlab标定工具箱来进行标定,可以和OpenCV做个对比嘛 ,它也是基于张正友的平面标定方法的,做得非

15、常人性化,呵呵,有误差分析、标定结果三维重建、重投影计算角点等功能 。Camera Calibration Toolbox for Matlab(http:/www.vision.caltech.edu/bouguetj/calib_doc/)4)三个OpenCV下的标定程序程序1)基于OpenCV的计算机视觉技术实现( (有标定图片 改下参数 可以直接运行)from基于OpenCV的计算机视觉技术实现 .rar摄像机定标from基于OpenCV的计算机视觉技术实现 .rar(525.67 KiB) 被下载 17063 次程序2) 自己写的一个简单的标定程序:plane_calibration

16、_opencv(要先准备好 角点的图像坐标和对应的世界坐标 )download/file.php?id=284程序3)主页上的例子 . iant=zh-tw附件程序4)plane_calibration_opencv.raropencv+cvut 实现 原理部分单应性矩阵在摄像机标定时的作用 在计算机视觉中单应性矩阵的求解在摄像机标定的过程中有重要的意义,单应性矩阵中包含着摄像机的内参数矩阵,旋转向量和平移向量。 我们设3维空间有一点Q=X Y Z 1T(齐次坐标系表示),到成像仪上的qx y 1T映射,设单应性矩阵为H,s为比例系数。则Q和q之间的关系可表示为q=ShQ. 在点映射过程中,点

17、要经过旋转和平移的物理变换,所以设物理变换坐标W=R T,R为旋转向量,T为平移向量。然后再投射过程中,根据得到的摄像机的内参矩阵M,所以q=sMWQ,从而推算出H=sMW. 通过单应性矩阵,我们把源图像平面上的点击位置与目标图像平面的伤的点击位置联系了起来,而opencv中有一个函数提供了单应性矩阵的计算:cvFindHomography().而opencv中是采用从多个视场,采集图片,并计算相应的单应性矩阵,从而求解摄像机的内参数(内参数相对于摄像机的视场是不变的)。立体视觉标定系统的分析与设计1 引言摄像机标定是立体视觉测量的关键问题之一。它的目的是确定三维物体的世界坐标系到摄像机图像坐

18、标系的映射关系,其中包括摄像机成像系统内外几何及光学参数的标定和两个或多个摄像机之间相对位置关系的标定。根据不同的摄像机模型,摄像机标定可分为线性标定、非线性标定和两步法。线性标定不考虑镜头畸变,简单快速,但精度低;非线性标定考虑了畸变参数,但计算繁琐,速度慢;两步法介于两者之间,采用由粗到精策略,是一种比较灵活的方法1。根据有无标定物,摄像机标定可分为自标定方法和基于主动视觉的标定方法、基于标定物的方法。相对于前两者,后者的优点是可以使用任意摄像机模型,标定精度高2。在标定物选择上,一般分为棋盘方格和标圆靶两类。相对于棋盘格角点提取,圆靶质心提取算法具有速度快,抗噪能力强,稳定性好的特点。基

19、于“两步法”标定技术,本文以二维圆靶平面作为标定物,在VC环境开发了立体视觉标定系统。2单摄像机标定2.1 非线性摄像机模型非线性摄像机的透视投影模型如图1。其中图1非线性摄像机透视投影模型为某世界坐标系下空间点的三维坐标。为点在摄像机坐标系(以摄像机光心为O为原点,Z轴与光轴重合)下的坐标。为理想摄像机模型(不考虑畸变)下点图像坐标。为点实际图像坐标(含畸变)。是点计算机图像坐标,以像素为单位。摄像机模型的建立就是从到的变换过程,具体步骤如下:从世界坐标系到摄像机坐标系的变换从摄像机坐标系到图像平面坐标的理想投影变换(f为有效焦距):畸变模型(从到的变换)非线性畸变一般包括径向畸变、切向畸变

20、、偏心畸变等。工业测量中,径向畸变是影响机器视觉精度的主要因素,可由以下关系表示:从实际图像坐标到计算机图像坐标的变换是计算机图像实际主点坐标。dX,dY分别为图像x,y方向上单位像素的尺寸大小。例如,CCD成像面积大小为4.83.6mm,图像分辨率大小为768576像素,则将(1)、(2)、(3)、(4)相结合可得非线性摄像机模型:2.2圆心标定点提取标定算法中常用棋盘方格点3和圆靶圆心4作为标定点。前者往往通过Harris、susan等角点提取方法获得,尽管这些方法精度高,但抗噪性能弱运算量大,而且易受噪声影响。圆心提取算法计算的是特定区域的当量中心,算法简单,抗噪能力强,即使图像发生扭曲

21、时(如圆被扭曲成椭圆),也能准确地提取其重心位置。本文以包含49个不同大小的标定圆的圆靶为标定板,识别并将所有标定圆自动排序,一 一提取质心坐标。与目前常用的标定点提取算法相比,方便快捷而且达到了亚像素精度。具体步骤如下:固定摄像机,调整标定板所占视场内的比例(一般在3:5左右);截取标定区域,调节对比度增加其亮度,阈值分割将标定区域二值化;采用“贴标签”算法5对标定区域内所有标定圆一一标识、排序并以不同颜色显示;利用公式(6)计算每个标定圆的圆心坐标。由于对标定圆进行排序,在立体标定完成后,每个圆心的空间坐标将与其像平面坐标一一对应。2.3 “两步法”标定算法实现Tsai提出的基于RAC约束

22、(Radial Alignment Constraint)的两步法2先利用线性变换方法求解摄像机参数,再以求得的参数作为初始值,考虑畸变因素,利用非线性优化方法进一步提高标定精度。在Tsai算法第2步求解非线性优化中本文使用阻尼最小二乘法,求解非线性方程组。单摄像机标定的程序模块如下:数据读入模块:读取标定区域圆心坐标。解方程模块:求解Tsai算法第一步中的线性方程,解得。非线性最优化模块:将的结果带入非线性方程,解得估计值,然后以此作为初始值,调用软件包求解非线性方程组,得到。数据输出模块:将标定参数以txt文件保存。畸变校正模块:由的畸变系数,利用式(3)可得到原始图像中对应点的坐标。至此

23、,单目摄像机标定模块的设计结束,具体流程如图2。图2单目摄像机标定流程3、双目立体视觉标定立体摄像机模型如图3。点在世界坐标系、左右摄像机坐标系下的非齐次坐标分别为。左右摄像机外参数为。由于左右摄像机外参数都基于同一世界坐标系(系统将世界坐标原点定在第一个标定圆质心沿轴正向1000mm处),故有现假定左摄像机光心位于世界坐标原点处,令则右摄像机坐标系与此时的世界坐标系O-XYZ可通过空间转换矩阵R,T表示为:4、系统介绍与实验结果4.1 系统介绍基于上述分析,通过VC+平台的强大支持,本文开发了一套双目立体视觉标定系统(设计流程如图4)。图5是系统的部分用户界面:系统读入左右摄像机视频后,用户

24、可手动选取标定区域(一般包括标定板上全部49个圆即可)并做预处理;“开始标定”进入单摄像机标定界面对左右摄像机分别标定;“确认”后系统保存左右摄像机参数;点击“标定”,系统将调用立体视觉算法计R,T算和标定圆质心的三维坐标,数据保存为TXT文件。图5(a) 系统的主界面图5(b)单摄像机标定界面3.2 标定实验系统由两个MV-808H工业相机(成像平面4.8*3.6 mm)、两路MV-8002采集卡组成;图像分辨率为768576。图6显示了左右标定区域;图6 左右标定区域5、小结实验结果表明,本系统操作简单,有较好的稳定性,对空间点的测量达到了一定的精度,可广泛应用在立体测量领域中。摄像机标定

25、和立体标定尝试用OpenCV来实现立体视觉也有一段时间了,主要的参考资料就是Learning OpenCV十一、十二章和OpenCV论坛上一些前辈的讨论。过程中磕磕碰碰,走了不少弯路,终于在前不久解决了最头大的问题,把整个标定、校准、匹配的流程调试成功。(虽然还有一些问题至今尚未搞清)在这里写这篇文章,第一方面是给自己一个总结,第二方面是感觉OpenCV立体视觉方面的资料还是相当零散和不完整,新手入门需要花很长时间才能摸索出来,第三方面,也是自己在过程中有些问题仍旧迷迷糊糊,希望可以抛砖引玉。1.摄像头我用的摄像头是淘宝上买的三维摄像头,两个USB Camera加一个可调节的支架。实物照片如下

26、1.1 三维摄像头实物图双USB摄像头的OpenCV驱动可以参考以下链接将上面代码复制到自己的工程之后还需要对工程或者编译环境做一下设置VC6下的详尽设置可以见代码的注释(修改工程的属性)VS2008中的设置也可以参照代码注释中VC+2005的设置(修改编译环境)2. 标定由于OpenCV中cvStereoCalibrate总是会得到很夸张的结果(见下文5.1问题描述),所以最后还是决定用Bouguet的Matlab标定工具箱立体标定,再将标定的结果读入OpenCV,来进行后续图像校准和匹配。Matlab标定工具箱的参考链接如下:http:/www.vision.caltech.edu/bou

27、guetj/calib_doc/上面有详细的使用步骤,用起来相当的方便。以下是我个人用Matlab工具箱进行立体标定的步骤,供参考,如果需要更详细步骤的话还是参照上面的链接把Matlab工具箱的文件copy到对应目录下,把所要标定的棋盘图也放到.m文件所在的目录下,然后在Matlab命令行窗口中打入calib_gui,选择Standard之后便出现以下窗口2.1. calilb_gui面板我们先对右摄像头的标定,所以先把从右摄像头上采集到的棋盘图复制到工具箱目录下。点击Image names,命令行窗口会提示你输入图片的basename以及图片的格式(比如你图片文件名是right1, righ

28、t2, , right10,basename就是right),然后Matlab会自动帮你读入这些图片,如下图所示,可以看到,读入了10幅右摄像头的棋盘图。采集棋盘图的时候要注意,尽量让棋盘占据尽可能多的画面,这样可以得到更多有关摄像头畸变方面的信息2.2. 图像basename读入2.3. 读入的棋盘图然后再回到主控制界面,点击Extract grid corners,提取每幅图的角点2.4. calib_gui面板点击完后,命令行会出现如下提示,主要是让你输入棋盘角点搜索窗口的大小。窗口定的大一点的话提取角点会比较方便点(即便点得偏离了也能找到),但也要注意不能大过一个方格的大小。剩下的两个

29、选项,只要回车选用默认设置就可以了2.5. 选择窗口大小然后就开始了角点的提取工作,按一定顺序分别提取棋盘的最边上的角点,程序会自动帮你找到所有对应的角点2.6. 提取角点2.7. 提取角点2在提取第一幅图的时候命令行窗口可能会提示你输入方格大小,这里输入你方格的实际大小就行,比如我方格是27mm,就输入27。这步事实上相当关键,它定义了空间的尺度,如果要对物体进行测量的话,这步是必须的。按相同的方法提取完10幅图后,点击Calibration,开始摄像头标定2.8. calib_gui面板经过多次迭代后,程序会最终得到摄像头的内外参数,如下图所示(图中符号由于字体关系没有完全显示,中间的问号

30、是表示误差的加减号)2.9. Calibration迭代过程及结果可以通过面板上的Show Extrinsic查看一下标定结果,可以验证一下标定外参数的结果2.10. 外部参数图示验证标定结果无误之后,就点击面板上的Save按钮,程序会把标定结果放在一个叫Calib_Result.mat中,为了方便后续立体标定,把这个文件名改为Calib_Result_right.mat。左摄像头标定的方法与右摄像头相同,生成的Calib_Result.mat之后,将其改名为Calib_Result_left.mat就可以了左右摄像头都标定完成之后,就可以开始立体标定了。在Matlab命令行中键入stereo

31、_gui启动立体标定面板,如下图所示2.11. stereo_gui面板点击Load left and right calibration files并在命令行中选择默认的文件名(Calib_Result_left.mat和Calib_Result_right.mat)之后就可以开始Run stereo calibration了,run之后的结果如下图所示,左右摄像头的参数都做了修正,并且也求出了两个摄像头之间的旋转和平移关系向量(om和T)2.12. 立体标定结果在面板上点击Show Extrinsics of stereo rig,可以看到如下图所示的双摄像头关系图,可以看到,两个摄像头基

32、本是前向平行的2.13. 双摄像头与定标棋盘间的位置关系得到了立体标定参数之后,就可以把参数放入xml文件,然后用cvLoad读入OpenCV了。具体的方法可以参照Learning OpenCV第11章的例子,上面就是用cvSave保存标定结果,然后再用cvLoad把之前的标定结果读入矩阵的2.14. xml文件示例这里需要注意的是Matlab标定结果中的om向量,这个向量是旋转矩阵通过Rodrigues变换之后得出的结果,如果要在cvStereoRectify中使用的话,需要首先将这个向量用cvRodrigues转换成旋转矩阵。关于Rodrigues变换,Learning OpenCV的第1

33、1章也有说明。2.15. 旋转矩阵的Rodrigues形式表示3. 立体校准和匹配有了标定参数,校准的过程就很简单了。我使用的是OpenCV中的cvStereoRectify,得出校准参数之后用cvRemap来校准输入的左右图像。这部分的代码参考的是Learning OpenCV十二章的例子。校准之后,就可以立体匹配了。立体匹配OpenCV里面有两种方法,一种是Block Matching,一种是Graph Cut。Block Matching用的是SAD方法,速度比较快,但效果一般。Graph Cut可以参考Kolmogrov03的那篇博士论文,效果不错,但是运行速度实在是慢到不能忍。所以还

34、是选择BM。以下是我用BM进行立体匹配的参数设置cpp:nogutterview plaincopy1. BMState=cvCreateStereoBMState(CV_STEREO_BM_BASIC,0);2. assert(BMState!=0);3. BMState-preFilterSize=13;4. BMState-preFilterCap=13;5. BMState-SADWindowSize=19;6. BMState-minDisparity=0;7. BMState-numberOfDisparities=unitDisparity*16;8. BMState-textu

35、reThreshold=10;9. BMState-uniquenessRatio=20;10. BMState-speckleWindowSize=13;其中minDisparity这个参数我设置为0是由于我的两个摄像头是前向平行放置,相同的物体在左图中一定比在右图中偏右,如下图3.1所示。所以没有必要设置回搜的参数。如果为了追求更大的双目重合区域而将两个摄像头向内偏转的话,这个参数是需要考虑的。3.1. 校正后的左右视图另外需要提的参数是uniquenessRatio,实验下来,我感觉这个参数对于最后的匹配结果是有很大的影响。uniquenessRatio主要可以防止误匹配,其主要作用从下

36、面三幅图的disparity效果比对就可以看出。在立体匹配中,我们宁愿区域无法匹配,也不要误匹配。如果有误匹配的话,碰到障碍检测这种应用,就会很麻烦。3.2. UniquenessRatio为0时的匹配图,可以看到大片的误匹配区域3.3. UniquenessRatio为10时的disparity map, 可以看到误匹配被大量减少了, 但还是有噪点3.4. UniquenessRatio为20时的disparity map, 可以看到误匹配基本被去除了, 点云干净了很多关于cvFindStereoCorrespondenceBM这个函数的源代码,曾经做过比较详细的研究,过一段时间也会把之前写

37、的代码注释整理一下,发篇博文。4.实际距离的测量在用cvFindStereoCorrespondenceBM得出disparity map之后,还需要通过cvReprojectImageTo3D这个函数将单通道Disparity Map转换成三通道的实际坐标矩阵。具体的数学原理可以参考下面这个公式(from chenyusiyuan4.1 距离转换公式但是在实际操作过程中,用cvReprojectImageTo3D得到的数据并未如实际所想,生成深度矩阵所定义的世界坐标系我就一直没弄清楚。这在下面的例子中会详细说明,希望这方面的专家能帮忙解答一下:图4.2是测量时的实际场景图,场景中主要测量的三

38、个物体就是最前面的利乐包装盒、中间的纸杯、和最远的塑料瓶。4.2. 实际场景中三个待测物体的位置图4.3是校准后的左右图和匹配出来的disparity map,disparity窗口中是实际的点云,object窗口是给disparity map加了个阈值之后得到的二值图,主要是为了分割前景和背景。可以看到要测的三个物体基本被正确地分割出来了4.3. 双目摄像头得到的disparity map图4.4是在disparity窗口中选取一个点后然后在实际坐标矩阵中得到的对应三维信息,在这里,我在三个物体的点云上各选一个点来代表一个物体实际的坐标信息。(这里通过鼠标获取一点坐标信息的方法参考的是ope

39、ncv sample里的watershed.cpp)4.4. 对应点的三维坐标在这里可以看到,(265, 156)也就是利乐包装盒的坐标是(13, 12, -157),(137, 142)纸杯的坐标是(77, 30, -312),(95, 115)塑料瓶的坐标是(144, 63, -482)。补充一下:为了方便显示,所以视差图出来之后进行了一个0-255的normalize,所以value值的前一个是normalize之后点的灰度值,后一个是normalize之前点的实际视差图。由cvFindStereoCorrespondenceBM算法的源代码:dptry*dstep = (short)(

40、ndisp - mind - 1 + mindisp)*256 + (d != 0 ? (p-n)*128/d : 0) + 15) 4);其中ndisp是ndisp = state-numberOfDisparities;mindisp是mindisp = state-minDisparity;mind就是sad得出的视差实际视差大约是(64-mind-1)*256=1163, 基本是对的, 后面一项修正值在通常情况下可以忽略目前我还是不是很清楚立体坐标系原点和尺度,但是从这三个点的z坐标可以大致看出这三个物体的距离差大概是1:2:3,基本与实际场景中物体的位置一致。因此,可以通过这种方法确

41、定出物体的大致距离信息。但是,如果就从摄像头参数本身来测量距离的话,就不是很明白了,还求这方面的大牛解答。5. 一些问题5.1 关于StereoCalibrateOpenCV自带的cvStereoCalibrate感觉不怎么好用,用这个函数求出的内参外参和旋转平移矩阵进行校准,往往无法达到行对准,有时甚至会出现比较可怕的畸变。在看了piao的不知道有谁在这方面有过成功经验的,可以出来分享一下。毕竟用Matlab工具箱还是麻烦了些。5.2Translation向量以及立体匹配得出的世界坐标系Learning OpenCV中对于Translation和Rotation的图示是这样的5.1. Lea

42、rning OpenCV中的图示可是在实验过程中发现,如果将Translation向量按尺度缩放,对于StereoRectify之后的左右视图不会有变化,比如将T = -226.73817 -0.62302 8.93984 ,变成T = -22.673817 -0.062302 0.893984 ,在OpenCV中显示的结果不会有任何变化。而且我如果修改其中的一个参量的话,左右视图发生的变化也不是图5.1中所示的那种变化(比如把x缩小,那么视图发生的变化不是往x轴方向的平移)。因此又回到了老问题,这里这些坐标的尺度究竟是什么?通过ReprojectTo3D那个函数得到的三维坐标又是以哪个点为原

43、点,那三个方向为x,y,z轴的?补充: 对这个问题的解答来自于和maxwellsdemon的讨论他的解释如下:rotation是两者的旋转角度的关系,但是你要把它矫正平行,也是需要translation matrix的。你可以设想,两个看似已经平行了的摄像头,但是深度上放置的有差距,那么在矫正的时候会议translation matrix所对应的角度或者直线为基准,二者旋转一个小角度,使得完全平行。摄像机标定总结【摄像机模型】摄像机模型中最简单为针孔模型,常用的为中心透视投影模型。以下公式推导均基于中心透视模型。【四个坐标系】世界坐标系、摄像机坐标系、图像坐标系、像素坐标系各坐标系的转换。【畸变模型】1、径向畸变:来自透镜形状。2、切向畸变:来自整个摄像机的组装过程。Opencv中所采用的畸变模型:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com