图像处理(十七)SURF,SIFT,ORB总结

官方文档:https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_matcher/py_matcher.html

计算速度: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)

效果图如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值