转载请注明:http://blog.csdn.net/c602273091/article/details/54561299
从多个二维图片中重建3D影像是机器视觉必不可少的部分,这篇论文【1】提出的就是做3D重建的工作。这篇论文提出了一种巧妙的实时的方法做3D地图重建——使用稀疏特征和视觉里程计相结合的方法。这种方法包含了立体匹配和创建点云。用这种方法计算出来的视觉里程计是当年11年最好的。该法可以每秒执行25f,同时建立3~4fps的深度地图,可以用于实时3d重建(这个用的是11年的处理器)
本文的贡献在于:1、使用几千个特征匹配实时计算了场景流;2、简单但是又鲁棒的视觉里程计被提出;3、使用ego-motion,集合从LIBELAS的立体测量,解决了匹配连接问题。
整个流水线分成四个部分:特征匹配、ego-motion估计、稠密立体视觉匹配、3D重建。
如下图所示:
特征匹配、ego-motion估计用一个CPU,25fps;稠密立体视觉匹配、3D重建一个CPU,3~4fps。
使用blob和角点算子对输入的四幅图片(左右两个方向以及连续的)进行处理;然后使用NMinimumS和NMaximumM就可以得到blob max, blob min, corner max, corner min。然后对这四类进行匹配。进行两个特征点之间的匹配的时候,不是使用RANSAC这样乱匹配,而是假设摄像头平缓移动,然后在该特征点的11x11一个区域计算水平和垂直的Sobel算子计算(用水平再加垂直方向,可以使计算复杂度从O( n2 )变成O(n))。计算Sobel算子,然后计算这个区域的SSD。为了加快速度,使用了特殊位置的Sobel算子,并且只用了8bits精度。
这是指特征点的匹配计算,具体如何找到对应关系呢?
从当前帧左边的图片出发,把特征点与左边前一帧图片在MxM的范围比较。然后左边前一帧与右边前一帧,右边前一帧与右边当前帧,然后左右边当前帧。对这一圈都匹配的时候就是用对极几何计算,容错在一个像素。噪点会通过2d Delaunay triangulation剔除。保留至少有两个邻近匹配的特征点。
总结一下:libviso通过corner,chessboard两种kernel的响应以及非极大值抑制的方式提取特征,并用sobel算子与原图卷积的结果作为特征点的描述子。
使用刚才得到的循环特征来逆投影计算最小误差来得到摄像头的位姿以及用卡尔曼滤波计算速度。
1、使用桶排序减少特征点的数目,并且使特征点均匀分布,最后保留200~500个特征点;
2、接着把3d特征点投影到2d位置,使用摄像头内外参,然后最小化误差。
3d到2d的变换如下:
为了详细说明这个问题,我引用我的同学对此的介绍【2】或者看这篇论文【3】:
位姿的计算使用6个变量计算:3个选择分量+3个偏移分量。
分别代表左图、右图,当前时刻,上一时刻图像中的匹配点(这里用了与代码中相同的符号表示,1下标代表左图,2代表右图,c代表上一帧,p代表当前帧)。
是其对应的三维坐标,根据立体视觉的原理,三维坐标可以通过匹配点坐标结合相机内参数算出。输出是1中描述的6个变量。这6个变量是通过RANSAC迭代,在每次迭代中都从匹配点中随机抽取3个点,基于这3个点,通过高斯牛顿法的方式求出来的。计算出一次迭代中的参数之后,利用这个参数计算出局内点(inlier)的占比。最终取占比最高的参数,得到结果。下面将对每次迭代中进行的操作细节进行分析。
在每次迭代中,参数是通过梯度下降的方式求出来的。而高斯牛顿实质上也是一种通过迭代求解的方式。位姿解算的过程,可以看成是在RANSAC迭代中,再嵌套了一个迭代求解过程。高斯牛顿法计算的过程中,主要的计算工作包括两步:残差以及雅克比的计算,参数的迭代。
文中他详细地描述了在libviso中用到的位姿求解的过程。其主要思路是利用随机抽样,每次从匹配点中取出3组,进行高斯牛顿迭代,求出基于这3组点的位姿,再通过内点判断这个位姿的精确度,多次抽样——迭代后,得到一个准确的位姿。抽样能够能够加快高斯牛顿法的收敛速度,而RANSAC的思路则保证了这种抽样的鲁棒性,降低了动态点对算法的影响,是一种值得借鉴的思路。
我觉得这里的更新的r,t可以用来做上面计算r,t的初始化的值。
作者使用了ELAS计算稠密地图。这种方法做地图不需要全局优化,并且适合室外。同时在Middlebury 这个benchmark上有最好的结果。
data association的问题,使用BA就不合适在稠密地图上。这里使用的是一种贪婪算法。把前一帧建立的点云投影到当前帧,如果不是有效的分布,就计算这个3d点云的均值做一个融合。
主要集中在视觉里程计这里:
它说这个版本的比之前CVMLIB-based的更快。
全文看下来,作者做的工作很不错,算是这个领域做视觉里程计方面比较优秀的论文,介绍得比较全面。当然,这里还有很多问题没有解决,动态环境,抖动等等问题。
可以从作者的网站下载代码并跑你的程序,跑第二个版本,有单目、双目等等。
【1】StereoScan: Dense 3d Reconstruction in Real-time
【2】http://mp.weixin.qq.com/s/lCZ79-mZQPSWhTEypRIWjw
【3】Visual Odometry based on Stereo Image Sequences
with RANSAC-based Outlier Rejection Scheme
【4】http://www.cvlibs.net/software/libviso/