计算速度:ORB>>SURF>>SIFT(各差一个量级)
旋转鲁棒性:SURF>ORB~SIFT(表示差不多)
模糊鲁棒性:SURF>ORB~SIFT
尺度变换鲁棒性: SURF>SIFT>ORB(ORB并不具备尺度变换性)
代码都差不多,值得注意的可能是因为版本关系,SIFT,SURF和ORB匹配特征向量时传入的参数不同,ORB用4.1能跑的代码用3.4就跑不了,SIFT,SURF目前我还用不了4.1,直接上代码:
import cv2
import numpy as np
path = 'test1.png'
image = cv2.imread(path,0)
img = cv2.imread('test2.jpg',0)
#img = cv2.resize(img,(image.shape[1],image.shape[0]))
#创建检测器
detector = cv2.xfeatures2d.SIFT_create()
#提取特征点、特征向量
kp_point1,des1 = detector.detectAndCompute(image,None)
kp_point2,des2 = detector.detectAndCompute(img,None)
#创建匹配器参数
index_params = dict (algorithm = 0 , trees = 5 )
search_params = dict(checks=100)
#创建匹配器
matcher = cv2.FlannBasedMatcher(index_params,search_params)
#匹配特征向量
match = matcher.match(des2,des1)
#对匹配成功的特征向量进行排序,第二个参数是第一个参数列表里的某个元素
match = sorted(match,key = lambda x:x.distance)
print(len(match))
#画出图像
image1 = cv2.drawMatches(img,kp_point2,image,kp_point1,match[:50],img,flags=2)
cv2.imshow('test',image1)
cv2.waitKey(5000)
cv2.destroyWindows()
对于opencv3.4.2版本我只能用FlannBasedMatcher匹配器!!
FLANN代表近似最近邻居的快速图书馆。它包含一系列算法,这些算法针对大型数据集中的快速最近邻搜索和高维特征进行了优化。对于大型数据集,它比BFMatcher更快。我们将看到基于FLANN的匹配器的第二个示例。
SIFT和SURF只需要换检测器,但与ORB切换时需要换检测器和匹配器,同时匹配器的参数也要换。
匹配器中
SIFT,SURF参数index_params = dict (algorithm = FLANN_INDEX_KDTREE , trees = 5 )
ORB参数index_params = dict (algorithm = FLANN_INDEX_LSH ,
table_number = 6 , #12
key_size = 12 , #20
multi_probe_level = 1 ) #2
FLANN_INDEX_KDTREE参数一般设置为0
第二个字典是SearchParams。它指定应递归遍历索引中的树的次数。值越高,精度越高,但也需要更多时间。如果要更改值,请传递
search_params = dict(checks=100)
效果图如下: