【双目备课】OpenCV例程_stereo_calib.cpp解析

stereo_calib是OpenCV官方代码中提供的最正统的双目demo,无论数据集还是代码都有很好实现。
一、代码效果:
相关的内容包括28张图片,1个xml和stereo_calib.cpp的代码
508489-20190308135915423-1897954881.png
直接引入的代码不能给正常运行,我们需要进行一些修改。
508489-20190308135915786-306464894.png
报了4个错误,主要是定义和引入问题,都可以解决。
包括定义:
#define  INTER_LINEAR_EXACT 1
以及
508489-20190308135916030-442861004.png
主要目的,就是确保输入的参数正确,图片能够被读到。
由于原始代码很贴心地将参数都设置正确了(可以参考下图,长为9、宽为6),所以可以放心实用。
508489-20190308135916251-1302043489.jpg
但是,目前代码还是无法完全运行,其原因是因为在以上代码中,调用了.xml,我们看看它是什么样子的:
508489-20190308135916511-907718467.png
这是一个序列化的文件,保存的是我们需要处理的图片的位置。这里都是相对地址,而我们的图片要么和当前运行的程序放到一个目录下面;要么修改代码;或者,修改这个配置xml文件,将其全部改成绝对地址。
508489-20190308135916764-940896401.png
大概是这个样子,当然你放的位置不一样,这里的xml肯定不一样;或者你认为这种方法比较麻烦,采用其他的方法也没有问题。
508489-20190308135917089-376247.jpg
确保标定的图片能够正确地读入进去。
508489-20190308135917530-82300097.jpg
成功的话,经过较长时间晕死,就会绘制这样的结果图片。按下键盘任意按键,就会切换下一帧。
如果我们自己有采集的图片,进行替换后可以用在这里。
二、代码解析
在能正确运行的基础上,我们来分析这段代码是如何产生作用的。
1)main函数
main函数是整个程序的入口,一般从这个函数开始分析。
508489-20190308135917898-1217968349.png
这个例程的main函数非常简单,蓝色框图部分,都是对输入参数进行准备;而在绿色部分,是程序本体。
2)StereoCalib
StereoCalib(const vector<string>& imagelist,
 Size boardSize
 float squareSize,
 bool displayCorners = false,
 bool useCalibrated=true,
 bool showRectified=true)
第一个参数是输入的图片序列,我们只要将图片地址输入即可;在前面的设定下,这个参数为:
508489-20190308135918400-899592852.png
第二个参数是标定板的尺寸;
508489-20190308135918671-1330603313.png
至于为什么是9*6,之前已经说明了;
后面4个参数都是和显示相关的,保持不变即可。如果你感兴趣,可以变换看效果,最好先看这些参数的英文名称。
这个函数很长,我们拣重要的来讲:
508489-20190308135918927-857586605.png
从这个嵌套循环开始,程序进入主体。由于我们做的是一个左右对比的程序,所以一个二维的循环肯定是必须的。
值得注意的是,这里的二维循环并非先循环左边的图片,对应右边的图片,而是采取了另一种方式。
508489-20190308135919239-1854233349.png
绿色框图部分,比较输入的图片是否为同样大小。这里不考虑非同样大小的情况。
508489-20190308135919483-1841663868.png
在这个循环中,最核心也是最消耗时间的就是findchessboardcorners函数,它的目的是分析当前图像,找到棋盘图片的角点。
508489-20190308135919780-1530211806.png
最后,对于识别效果比较好的情况,全部推入goodImageList中去。对于官方提供的例子,13对图像全部为gooImageList,我们也可以根据这里入选的情况,判断当前采集图像的质量。
这里,OpenCV代码提供了一个很好的技巧,用于处理当前图像由于缩放可能带来的问题:
508489-20190308135920113-1813020585.png

默认情况下是在原始大小下进行寻找,如果没有找到,则放大一次寻找,一旦找到,直接跳出循环。
508489-20190308135921391-65065877.png
根据得到角点结果,计算相机参数矩阵。正如我们知道的一样,是3*3矩阵。
508489-20190308135921726-1770622442.png
调用stereoCalibrate函数,这个函数参数好多呀。
508489-20190308135922117-15770379.png
这段是采用拟合的方法,计算误差。
508489-20190308135922642-168485108.png
这里是将标定的结果,序列化地保存下来。
三、如何应用
这个函数很长,却代表了标定的完整过程。在使用的过程中,肯定还是要将其分解成各个函数,而后再单独地进行处理。
标定应该只是一个过程,标定成功后的结果可以反复使用,所以这个操作消耗一些时间应该也是没有问题的。





转载于:https://www.cnblogs.com/jsxyhelu/p/10495439.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值