摘要
本文的重点并不是想介绍特征点检测的算法,Harris、shi-Tomas、SIFT、SURF这些算法网上已经有一大堆很精彩的科普文章了。
本文意在带大家快速的过一下特征点这一块的知识,让大家对流程还有API能有个印象和思路,我觉得理清思路绝对会帮助大家更好的更细节的学这部分知识。
零、本章学习的目的
上面很简单的几张图就可以让大家知道本章学习的重要意义,在学这一章之前学习过模板匹配,就是一个模板作为窗口在原图上滑动寻找能匹配的区域;大家应该能发现那个功能非常鸡肋,只有跟原图一模一样才能实别,也就是你这个模板必须是从原图上截下来的。一旦模板是发生旋转、大小不一、光照不一样的情况,其实都无法匹配。
这个时候特征点匹配功能就出现了,第一张图是通过专辑的照片找到桌子上放的一堆专辑中同一封面的专辑,我们发现桌子上的专辑有旋转,而且跟模板大小不一,甚至被遮挡的很严重。这个时候傻瓜式的模板匹配法肯定不能用了。
这就出现了我们要学的内容,特征点匹配。
第二第三张图实现了图片的拼接,也就是我们手机里就有的拍全景图的功能,拍摄了一张照片,然后移动摄像头又拍了另一张,这两张当中有重合的部分,于是可以通过算法将他们拼接成一张大图,其中最关键的问题就是关键点match的操作。也只有在关键点找到之后才能将两张图片拼接在一起。
壹、一个很重要的API,引出我们的学习思路
这里有个 drawMatches(iamge1,keypoints1,image2,keypoints2,matches,outputimage,matchColor,singlePoinColor,Mask,flags) 的API,他就是我们实现上面第一张图将对应的关键点连接在一起的API。
简要的介绍一下每个输入参数的功能,不要指望一次全听懂,我只能保证你看完这篇文章能懂;
- 前四个参数是输入和输出图像和它们的关键点,这个时候有一个疑问,关键点是什么?先简单说一句:就是每张图上能代表它区域特征的点,它是一种特殊的数据类型,存储的不只是横纵坐标;
- matches 是两张图关键点的匹配关系,匹配关系是什么?首先你要知道描述子,这里我知道你很急,因为新概念太多,还没掌握住第一个就来了第二个,但你先别急。听我一句:关键点你就把它先看成点,描述子是描述每个关键点跟周围像素点关系、特性的数据(那肯定1个keypoint对应1个descriptor),match是衡量来自不同两张图描述子之间匹配程度的数据。先知道这些就可以了。
- 第六个参数是输出图像、第七个参数是匹配点之间连线的颜色、第八个参数是未匹配的点自身圈的颜色,到这里突然简单起来了,尤其是7、8一般不填