本文所有代码,只使用
C++
实现,Python类似,甚至更加简单,暂不做实现。
特征检测
特征检测常用的算法有:
- SIFT(尺度不变特征变换)
- SURF(加速鲁棒特征)
- ORB
SIFT
和SURF
已经申请了专利,在OpenCV中使用需要付费,所以不做讨论。
以下为ORB的基本用法:
1 |
Mat src = imread("./img/blox.jpg"), gray; |
以上几乎为固定写法,如果是多图,
detect
和compute
可以传多个数据进行匹配。得到多个keyPoints
和desc
特征匹配之BFMatcher
Brute-Force Matcher(BF Matcher)可以翻译成野蛮匹配器,它的步骤是先选取第一个图片特征集合的一个特征描述符,然后匹配另一个集合的所有特征,通过一些距离算法得到一个最近的距离distance。
查找特征点和描述符
1 |
Mat img1 = imread("./img/box.png"), gray1; |
创建并使用BFMatcher
1 |
// 创建 BFMatcher,开启crossCheck获取更精确的结果 |
DMatch
类的一些参数
distance
:描述符之间的距离,值越小越好trainIdx
:描述符在train
图片中的索引queryIdx
:描述符在query
图片中的索引imgIdx
:train
图片的索引
特征匹配之FLANN
FLANN是Fast Library for Approximate Nearest Neighbors.的缩写。快速近似最近邻搜索库。 它包含一组算法,这些算法针对大型数据集中的快速最近邻搜索和高维特征进行了优化。对于大型数据集,它的运行速度比BFMatcher更快。
查找特征点和描述符
1 |
Mat img1 = imread("./img/box.png"), gray1; |
创建并使用FLANN
1 |
// 创建 indexPar 和 searchPar |