pythonopencv特征匹配_特征匹配(Brute-Force和FLANN匹配) (O。。。

更新时间:2023-05-07 16:22:27 阅读: 评论:0

pythonopencv特征匹配_特征匹配(Brute-Force和FLANN匹
配) (O。。。
本⽂内容是对Opencv官⽅⽂档的学习笔记
蛮⼒(Brute0Force)匹配
原理
蛮⼒匹配很简单,⾸先在第⼀幅图像中选取⼀个关键点,然后依次与第⼆幅图像的每⼀个关键点进⾏(描述符)距离测试,最后返回距离最近的关键点。
相关函数介绍
在这⾥由于有不同版本的OpenCV,下⾯将要涉及到的函数也会有差别,在这⾥先列出作者的OpenCV版本为3.4.1。
对于BF匹配器,我们需要⽤ cv2.BFMatcher()函数创建⼀个BFMatcher对象,他有两个可选参数:
normType:它是⽤来指定要使⽤的距离测试类型。
默认值为 cv2.NORM_L2。这很适合SIFT和SURF等(cv2.NORM_L1也可以)。2.对于使⽤⼆进制描述符的ORB,BRIEF,BRISK等算法,要使⽤ cv2.NORM_HAMMING,这样就会返回两个测试对象之间的汉明距离,如果ORB算法的参数设置为VTA_K==3或者4,normType就应该设置为cv2.NORM_HAMMING2
crossCheck:为布尔变量,默认值为Fal。如果设置为True,匹配条件就会更加严格,假设A和B是两幅图像,只有当A中的第i个特征点与B中的第j个特征点距离最近,并且B中的第j个特征点到A中的第i个特征点也是最近(A中没有其他点到j的距离更近)时才会返回最佳匹配(i,j),也就是说这两个特征点要互相匹配才可以。
BFMatcher对象具有两个⽅法:
BFMatcher.match():返回最佳匹配。
BFMatcher.knnMatch():为每个关键点返回k个最佳匹配(将序排列之后取前k个),其中k是⽤户⾃⼰设定的。
匹配器对象:
截取下⾯的⼀段代码作为解释:
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
#匹配描述符
matches = bf.match(des1,des2)
在这⾥,matches就是⼀个bf.match(des1,des2)返回的DMatch对象,它具有以下属性:
DMatch.distance :描述符之间的距离。越⼩越好。
DMatch.queryIdx :查询图像中描述符的索引。
DMatch.imgIdx:⽬标图像的索引。
⽤cv2.drawMatches()和cv2.drawMatchesKnn()来绘制匹配的点,cv2.drawMatches()会将两幅图像先⽔平排列,然后在最佳匹配的点之间绘制直线(从原图像到⽬标图像)。假如前⾯使⽤的是BFMatcher.knnMatch(),现在我们可以使⽤函数 cv2.drawMatchsKnn()为每个关键点和它的 k 个最佳匹配点绘制匹配线。如果 k 等于 2,就会为每个关键点绘制两条最佳匹配直线。
代码⽰例
对ORB描述符进⾏蛮⼒匹配(⼀对⼀匹配)
import numpy as np
import cv2
from matplotlib import pyplot as plt
img1=cv2.imread('box.jpeg',0)
img2=cv2.imread('box_in_scene.png',0)
orb = cv2.ORB_create()
#寻找关键点并计算描述符
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)
#创建BFMatcher对象,因为使⽤的是ORB,距离计算设置为cv2.NORM_HAMMING bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
#匹配描述符
matches = bf.match(des1,des2)
#按距离排序
matches = sorted(matches, key = lambda x:x.distance)
### 绘制匹配的点(在这⾥选取的前⼗个最佳匹配点)
img3=cv2.drawMatches(img1,kp1,img2,kp2,matches[:10],None,flags=2) cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
看⼀下效果:
img1
img2
img3
对SIFT描述符进⾏蛮⼒匹配(k对最佳匹配)
代码展⽰:
import numpy as np
import cv2
from matplotlib import pyplot as plt
img1 = cv2.imread('box.jpeg',0) # 读取图⽚
img2 = cv2.imread('box_in_scene.png',0)# 读取图⽚
sift = cv2.xfeatures2d.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1,None)#寻找关键点并计算描述符
kp2, des2 = sift.detectAndCompute(img2,None)#寻找关键点并计算描述符
bf = cv2.BFMatcher()#创建BFMatcher对象
matches = bf.knnMatch(des1,des2, k=2)#匹配描述符
good = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good.append([m])
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good[:10],None,flags=2)
plt.imshow(img3),plt.show()
结果展⽰:
img3
FLANN匹配器
FLANN是近似最近邻的快速库。它包含⼀组算法,这些算法针对⼤型数据集中的快速最近邻搜索和⾼维特征进⾏了优化。对于⼤型数据集,它的运⾏速度⽐BFMatcher快。
对于基于FLANN的匹配器,我们需要传递两个字典,这些字典指定要使⽤的算法,其相关参数等。第⼀个是IndexParams。
对于SIFT,SURF等算法
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
使⽤ORB时,你可以参考下⾯。根据⽂档建议使⽤带注释的值,但在某些情况下未提供必需的参数。其他值也可以正常⼯作。
FLANN_INDEX_LSH = 6
index_params= dict(algorithm = FLANN_INDEX_LSH,
table_number = 6, # 12
key_size = 12, # 20
multi_probe_level = 1) #2
第⼆个字典是SearchParams。它指定索引中的树应递归遍历的次数。较⾼的值可提供更好的精度,但也需要更多时间。例如:
arch_params = dict(checks=50) # 或传递⼀个空字典
代码⽰例
import numpy as np
import cv2
from matplotlib import pyplot as plt
img1=cv2.imread('box.jpeg',0)
img2=cv2.imread('box_in_scene.png',0)
sift=cv2.xfeatures2d.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)
#FLANN参数
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
arch_params = dict(checks=50)
flann = cv2.FlannBadMatcher(index_params,arch_params)
flann = cv2.FlannBadMatcher(index_params,arch_params)
matches = flann.knnMatch(des1,des2,k=2)
matchesMask = [[0,0] for i in range(len(matches))]
for i,(m,n) in enumerate(matches):
if m.distance < 0.7*n.distance:
matchesMask[i]=[1,0]
draw_params = dict(matchColor = (0,255,0),
singlePointColor = (255,0,0),
matchesMask = matchesMask,flags = 0)
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,**draw_params) plt.imshow(img3,),plt.show()
结果如下:
img3

本文发布于:2023-05-07 16:22:27,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/549470.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:匹配   描述符   距离   算法   关键点
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图