怎么使用python OpenCV实现图像特征匹配

发布时间:2023-04-25 11:43:27 作者:zzz
来源:亿速云 阅读:113

这篇文章主要讲解了“怎么使用python OpenCV实现图像特征匹配”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用python OpenCV实现图像特征匹配”吧!

Brute-Force匹配器的基础

暴力匹配器很简单。它使用第一组中一个特征的描述符,并使用一些距离计算将其与第二组中的所有其他特征匹配。并返回最接近的一个。 对于BF匹配器,首先必须使cv.BFMatcher() 创建BFMatcher对象。 它需要两个可选参数:

cv.drawMatchesKnn绘制所有k个最佳匹配。如果 k=2 ,它将为每个关键点绘制两条匹配线。 因此,如果要选择性地绘制,则必须通过掩码。 下面来看一个SIFT和ORB的示例(两者都使用不同的距离测量)。

使用ORB描述符进行Brute-Force匹配

下面将看到一个有关如何在两个图像之间匹配特征的简单示例。在这种情况下,有一 个queryImage和trainImage。将尝试使用特征匹配在trainImage中找到queryImage。(图像 是/samples/data/box.png和/samples/data/box_in_scene.png) 

使用ORB描述符来匹配特征。因此,从加载图像,查找描述符等开始。之后创建一个距离测量值为cv2.NORM_HAMMING的BFMatcher对象(因为使用的是ORB),并且启用了CrossCheck以获得更好的结果。然后,使用Matcher.match()方法来获取两个图像中的最佳匹配。按照距离的升序对它们进行排序,以使最佳匹配(低距离) 排在前面。然后我们只抽出前10的匹配(只是为了提高可见度。您可以根据需要增加它)

# create bfmatcher object
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# match descriptors
matches = bf.match(des1, des2)
# sort them in the order of their distance
matches = sorted(matches, key=lambda x: x.distance)
# draw first 10 matches
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
plt.imshow(img3)
plt.show()

什么是Matcher对象?

matchs = bf.match(des1,des2) 的结果DMatch对象的列表。该DMatch对象具有以下属性:

带有SIFT描述符和比例测试的Brute-Force匹配

这次,将使用BFMatcher.knnMatch()获得k个最佳匹配。在此示例中,将k = 2,以便可以应用D.Lowe在他的论文中阐述的比例测试。

import cv2
import numpy as np
from matplotlib import pyplot as plt
img1 = cv2.imread('box2.png', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('box_in_scene.png', cv2.IMREAD_GRAYSCALE)
# initate sift detector
sift = cv2.xfeatures2d.SIFT_create()
# find teh keypoints and descriptors with sift
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
# BFMatcher with default params
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)
# apply ratio test
good = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good.append([m])
# cv.drawMatchsKnn expects list of lists as matches.
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
plt.imshow(img3)
plt.show()

基于匹配器的FLANN

FLANN是近似最近邻的快速库。它包含一组算法,这些算法针对大型数据集中的快速最近邻搜索和高维特征进行了优化。 对于大型数据集,它的运行速度比BFMatcher快。我们将看到第二个基于FLANN的匹配器示例。 对于基于FLANN的匹配器,需要传递两个字典,这些字典指定要使用的算法,其相关参数等。

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,
 	key_size=12,
 	multi_probe_level=1)

第二个字典是SearchParams,它指定索引中的树应递归遍历的次数。 较高的值可提供更好的精度,但也需要更多时间。如果要更改值,请传递 search_params = dict(checks = 100) 有了这些信息,就很容易。

import cv2
import numpy as np
from matplotlib import pyplot as plt
img1 = cv2.imread('box2.png', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('box_in_scene.png', cv2.IMREAD_GRAYSCALE)
# initiate sift detector
sift = cv2.xfeatures2d.SIFT_create()
# find the keypoints and descriptors with sift
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
# FLANN params
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1, des2, k=2)
# need to draw only good matches, so create a mask
matchesMask = [[0,0] for i in range(len(matches))]
# ratio test as per low's papre
for i, (m, n) in enumerate(matches):
    if m.distance < 0.7*n.distance:
        matchesMask[i] = [1, 0]
# draw
darw_params = dict(
    matchColor=(0, 255, 0),
    singlePointColor=(255, 0, 0),
    matchesMask=matchesMask,
    flags=cv2.DrawMatchesFlags_DEFAULT)
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, matches, None, **darw_params)
plt.imshow(img3)
plt.show()

感谢各位的阅读,以上就是“怎么使用python OpenCV实现图像特征匹配”的内容了,经过本文的学习后,相信大家对怎么使用python OpenCV实现图像特征匹配这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. python如何利用opencv实现SIFT特征提取与匹配
  2. Python实现某论坛自动签到功能

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python opencv

上一篇:JavaScript中p元素的含义是什么

下一篇:python  OpenCV怎么使用背景分离方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》