matlab双目相机标定过程与问题总结

 

        相机标定的内容在网上已经有大量的资料可以参考,我本以为很轻松就能完成,实际上仍遇到了不少问题,因此把自己的思考记录下来,如有错误还请指正。

        首先,我使用的是matlab标定工具箱进行双目标定。这个工具箱的使用方法和例程在官网有详细的介绍。

        http://www.vision.caltech.edu/bouguetj/calib_doc/index.html#parameters

        网上也有很多翻译版,标定的标准过程参考这个就够用了。双目标定主要有两个目标,即通过标定得到相机内参和外参。外参通常描述了世界坐标系到相机坐标系的转换关系,在标定过程中由于标定板和相机相对位置不断变化,会得到许多外参,但实际上我们的目标是得到左目与右目两个相机坐标系之间的转换关系,即在同一个世界坐标系下如果分别求得两个相机的外参,那么这两个相机坐标系之间的转换关系也就得到了,因此在双目标定中,工具箱最终得到的旋转向量om和平移向量T就是指这个。内参则描述了像素坐标系到相机坐标系的转换关系,在这里就不细说了。

        实际在操作双目标定的过程中有到底有哪些要注意的地方呢?又有哪些和例程操作不同的地方呢?

为了得到较好的标定结果需要关注的地方:

1.图像采集

       图像的采集大致有几个原则,首先要保证标定板图像的清晰度,否则不利于角点的提取;然后在采集多幅图像时要注意标定板与相机平面距离与角度的变化;最重要的一点是采集的图像,标定板需遍历整个图像区域。这个说的通俗一点就是一幅图标定板出现在左上角,另一幅图标定板出现在右上角,还需要出现在中心、下边缘等等。这个对于畸变系数标定正确与否十分关键。最后图像的多少也会对精度有影响,我一般会采集二十多对图像。

2.角点提取

        角点提取准确与否直接影响标定结果,因此在自动提取角点完成后,请务必使用manual_corner_extraction.m手动修改一遍。这里顺带说一下使用matlab标定工具箱时需要注意的问题吧。a. Extract grid corner的默认工作模式是根据用户选取的网格点在该点附近区域搜索角点并提取。wintx和winty指的便是这个“附近区域”的大小。默认值是5,根据需要调整。b. 首次划分的网格并不是最终提取的角点,我之前一直误以为那个就是提取的角点,导致很多不必要的工作量。划分网格后,通过一定的修正系数尽量使网格点与标定板的网格点匹配,由于有角点提取是在附近搜索的,所以不完全匹配也没有关系。c.这里有个小trick,每一幅图像自动提取完成后,可以先检查一遍角点提取是否准确,一般来说修正系数设置的较好且图像畸变不严重的话,自动提取还是相当准确的。对于提取不准确的图像,记录编号。这样一来在手动修改的时候只要重新针对这些图像序列进行修改。之前我都是不管自动提取的准不准确,都手动检查一遍,每一次都需要检查四五千个点。我的眼睛几乎是崩溃的 = =!d.关于toolbox中Recomp.corners功能。如果手动修正完成后角点提取已经较为准确,就没必要重新再次提取了,这个功能好像是根据现有参数修正图像,然后重新投影获得角点。实际上在参数不准的情况下重新提取反而效果更糟了。里面本来也有自动和手动两个参数选项,但是手动的一用就崩溃。 e.在做误差分析Analyze error时,可以点击误差点查看是哪副图像的哪个点误差较大,方便重新选取。这里一定要注意,右键单击退出而不要直接关闭,否则matlab直接崩溃。 f.结果及时保存。

3.标定结果选取

       做标定还是需要事先对各参数有一个相应的了解,最后得到的参数都有一个不确定度,多次标定后,可根据多次标定的结果灵活调整,toolbox给出的参数也不一定就是最好的。因此可根据实际验证程序显示的图像来做微调。如Cx、Cy影响成像位置,畸变参数k1主要纠正中心区域而k2主要纠正边缘区域等等。

——————————————我是可爱的分割线—————————————————

       写到这里好像做单目标定是够了,我曾经也这么认为。然而我还是太年轻了。实际给我的双目相机给我的标定过程带来巨大困扰。同样是把遇到的问题和可能的解决方法贴给大家。仅供参考。

        双目标定要求左右相机同时对标定板进行图像拍摄,这里面我遇到的最大的一个问题是没法满足上面图像采集中所说的最重要的一点——遍历整个图像区域。简单的说就是你要想左目遍历那么右目一定会有那么些图像标定板都看不全,左右目是有视差的。标定板看不全就没法做双目匹配计算外参,如果不遍历整个图像区域仅保证左右目图像标定板完整,那么将大大影响畸变系数的标定。事实上对于我所标定的相机,畸变的影响是比较大的,结果完全不能看。

        考虑如果对于畸变不是很大的相机,正常标定也许能行,这个我没有试过,大家可以自己做一做。对于畸变较大的相机,遍历图像区域是十分必要的,因为成像边缘畸变较大。综合考虑下来最终采取的解决方案是分开标定相机内参外参

        我的思路是这样的:分别标定左右目相机内参,这个过程保证标定板遍历图像,以获得较为准确的内参(主要是较为准确的畸变系数);内参确定之后,通过配对的图像确定两个相机坐标系之间的转换关系。

        在操作过程中,我先获取了前二十对配对图像,最后再分别为左目、右目补上遍历图像。理论上标定一次完成后就可获得左目内参、右目内参,并且取出配对图像的左目的20个外参、右目20个外参就可以直接计算左右目的相机坐标系转换om、T。可以通过优化问题进行求解,也可以去工具箱中找源程序看他是怎么计算om、T的,取出相应的函数来用。这是比较理想的情况。然而我啥也不会,只会用工具箱该咋办,工具箱中双目标定是利用单目标定的结果进行求解的,如果对该工具箱很了解的话,可以修改单目标定的结果.mat,把遍历图像的数据删除,用修改后的左右目.mat直接交给工具箱进行计算。如果这个也搞不定,还有一种办法是利用前二十对图像再做一次标定,最后直接把结果交给工具箱得到双目om、T。这种解决思路实际上默认了一件事情,就是边缘的畸变系数对外参影响不大。事实上中心的映射关系准确确实可以获得准确的外参,畸变只是像素坐标系到相机坐标系转换关系的修正。最理想的方法就是自己重写一个程序,可以单独完成外参标定,即输入左右目内参和配对图像输出om、T。

2017.04.21修改----------------------------------------------

关于修改单目标定的结果.mat,可以直接使用工具箱中添加/删除图片功能来实现。

        写了一堆字也没放图片有点说不过去的样子,不过关于标定过程的资料网上实在太多了,这里主要还是总结了一下自己的心得体会吧,希望对做标定的同学有所帮助。在相机标定方面我还是新手,有问题欢迎多多交流。最后贴两张左右目采集的图像意思意思吧。

 

matlab双目相机标定过程与问题总结_第1张图片matlab双目相机标定过程与问题总结_第2张图片

 

就到这里啦!Byebye~

 

 

 

 

 

 

————There's so much that I can't see.

 

 

        

        

你可能感兴趣的:(matlab双目相机标定过程与问题总结)