最近在清手机存储空间时想到一个问题,就是通过判断图片的重复性来删除不必要的文件,以节省空间,于是这两个月就一直在想应该怎么弄。由于灰度图像属于二维数据,所以判断图像整体的重复其实就是判断两个图像各自二维空间内的所有特征点是否在很大程度上重复,在二维数据点集匹配方面,OpenCV提供了一个非常好的模板库,那就是FLANN。
FLANN全称Fast Library for Approximate Nearest Neighbors,是一种用于近似最近邻搜索的库,而不是算法(很多人刚开始学这玩意的时候很容易混淆这个概念!)。它作为一个模板,包含了随机k-d树、优先搜索k-means树、k-medoids聚类树这几种近似数据结构,当使用FLANN进行匹配时它会根据数据规模自动选择最佳的数据结构,也可以手动指定。
FLANN工作时,首先将数据集划分为若干较小的子集,并使用这些子集来进行近似最近邻搜索,然后使用近似算法来计算每个子集中最近邻的近似距离。最后将所有子集的最近邻进行比较,并返回最小距离的最近邻。FLANN的算法更快,但是找到的是最近邻近似匹配而不是最佳的匹配,一般用于性能要求高但对错误容忍度较高的场景下。
与之对应的则是暴力匹配法,它需要先计算某一个特征点描述子与其他所有特征点描述子之间的距离,再将得到的距离进行排序,最后取距离最近的一个作为匹配点,这样一来算法复杂度就非常高,对于二维及以上高维特征,找到训练数据中的最近邻需要花费大量时间,占用大量系统资源。但其匹配精度和准确度高,用于要求苛刻但对时间不敏感的情况下。但实际生活中,大部分场景都是要求快速出结果的,因此一般采用FLANN法。
在OpenCV中,暴力匹配法使用的是BFMatcher模板类ÿ