这是写在前言前的前言:1个月前写的这篇总结,到现在来看已经没什么看头了,很多概念上的混淆、分类上面的混乱,而且还浅显还没什么干货。不过也证明了我这一个多月来确实进步了不少,得自我炫耀一下。只是这篇文章我本来的打算就是一篇入门性的各种概念的梳理,所以我也就修改一下明显的错误,而不作整体上的调整了。
前言
本来是打算初步学习一下SLAM的,结果没想到还没敲开SLAM大厦的大门,就被城堡外迷乱的丛密的绕晕,回头看看最近这段时间走过的迷路:从OpenCV到CMake,从图像特征到各种局部特征点算法,最后更是回头复习了一把线性代数和概率论。走着走着甚至连我自己都忘了我最初的目的只是SLAM,不由的感慨自己的基础知识实在是太差了。不过讲起来在自学新知识上,我也不是初来乍到的菜鸟,以前数次迷失在路上的经历,让我不再纠结于路边那些撤人心魄的未知的细节,不忘初心、坚持到底才是最重要的,所以这一次我很幸运的穿过了这迷雾丛丛的丛林。
稍稍卖弄了一下文艺,只是想说明,基础知识对现在我新知识学习的重要性。经过了这一路转下来,虽然对很多东西仍然是一知半解,但是也总算是对各种知识的网络关联有了一些了解,对我来说这些才是最重要的。今后再次遇到,我知道能知道它们的意义、与其他知识的相关性的联系和在实际应用中的作用。所以这里我就对前面这段时间的学习稍作总结一下(其实就是一个流水账)。
总结
从SLAM到图像匹配
总的来说,学了一大圈,但是实际的核心其他还是各种图像处理算法和应用。对于视觉SLAM,其前端本身就是各种图像处理的算法,不过在如今的研究中后端的优化才是关键,但是我对优化了解不多,就不提。以图像为主的视觉SLAM前端,大概有如下主要内容:相机的模型、空间坐标描叙和转化、图像匹配。
由于我手中没有相机,于是我就从图像匹配开始研究,在SLAM中图像的匹配一般都是通过特征点来比较的,所以第一步就是要找特征点以及特征点的描叙子。有了特征后,对比就很简单了,所以匹配的关键就是图像点特征的提取。
从图像特征到图像特征点
单说图像特征的时候我是茫然的,因为能够作为图像特征的方法太多了,各种方法各种用途,为什么SLAM中用的是图像的特征点呢?
这是由于SLAM以及其他的一些应用更关注动态的物体在图像中的表现,而局部特征就比较适合这种情况。在局部特征中,图像的特征点是当前使用最多的一类的局部特征。
各种特征点算法
虽然我将目标集中在图像的特征点上,但实际上各种不同的特征点算法也是层出不穷,对象我这样的初学者十分有必要将这些理一下。
基本上所有的特征点介绍资料都是从Harris角点开始讲解的,为什么呢?我个人觉得Harris角点的定义从图像上来,它更能够符合的我们对角点的日常认知。Harris特征点算法算是一种很经典的算法,但是他的缺点也是很明显:计算量大、参数不好配置。
相比起来FAST特征点算法,则是会更加简单易行的方法,正是由于其简单性快速,一些其他的算法就在它的基础改进而来的。
Harris和FAST算法我自认为还能看懂,但是进入到sift、surf算法我就力不从心了。这两个算法除了原理上一堆看不懂的数学推导让我印象深刻外,它们能够去除图片尺度的影响也让我感觉到很神奇。正是应为sift、surf对旋转、尺度、明亮都有很好的稳定性,所以它们在现在得到广泛的应用,从目前来看,这两个算法最大的问题可能就是计算量太大了。
部分数学基础
每种算法总会有严谨的数学推导做支撑,所以一旦要探明其原理,那相关数学知识就不可避免了,这里我就大致概括一下需要使用到的一些数学概念:矩阵、线性方程、自相关函数、卷积、矩阵的特征值和特征向量、行列式、方差与协方差等等,至于微积分中的一些知识我就不提了。
可以看到以上提到的大部分都是线性代数中的概念,所以线性代数真是很有用。
OpenCV、cmake——从理论到实践
对于前面提到的图像特征点检测与匹配的算法,即使在已经很熟悉的基础上,我想要以代码的形式实现也不是件容易的事情,不过好在我们有已经实现好的开源库——OpenCV。
在OpenCV中,常见的特征点查找、匹配都有现成的借口函数,而通过OpenCV的GUI模块有可以直观显示特征点的位置与图像点匹配的链接结果。而cmake则是项目编译管理的好工具,而实际上OpenCV的源码包,就使用cmake来管理的。