怎么使用python OpenCV实现图像特征匹配
今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《怎么使用python OpenCV实现图像特征匹配》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!
Brute-Force匹配器的基础
暴力匹配器很简单。它使用第一组中一个特征的描述符,并使用一些距离计算将其与第二组中的所有其他特征匹配。并返回最接近的一个。 对于BF匹配器,首先必须使cv.BFMatcher() 创建BFMatcher对象。 它需要两个可选参数:
第一个参数是normType,它指定要使用的距离测量。默认情况下为
cv2.NORM_L2
。对于SIFT, SURF等(也有cv2.NORM_L1
)很有用。 对于基于二进制字符串的描述符,例如ORB,BRIEF,BRISK等,应使用cv2.NORM_HAMMING
,该函数使用汉明距离作为度量。如果ORB使用WTA_K == 3或 4
,则应使用 cv.NORM_HAMMING2。第二个参数是布尔变量,即
crossCheck
,默认情况下为false。如果为true,则Matcher仅返回具有值(i,j)(i,j)(i,j)的那些匹配项,以使集合A中的第i个描述符具有集合B中的第j个描述符为最佳匹配,反之亦然。即两组中的两个特征应彼此匹配。它提供了一致的结果,并且是D.Lowe在SIFT论文中提出的比率测试的良好替代方案。 创建之后,两个重要的方法是BFMatcher.match()
: 返回最佳匹配BFMatcher.knnMatch()
: 返回k个最佳匹配,其中k由用户指定。 当需要对此做其他工作时,它可能会很有用。 就像使用cv.drawKeypoints()绘制关键点一样,cv.drawMatches()
可以帮助绘制出匹配项。它水平堆叠两张图像,并绘制从第一张图像到第二张图像的线,以显示最佳匹配。还有
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
对象具有以下属性:
DMatch.distance
-描述符之间的距离,越低越好DMatch.trainIdx
-train描述符中的描述符索引DMatch.queryIdx
-query描述符中的描述符索引DMatch.imgIdx
-train 图像的索引。
带有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的匹配器,需要传递两个字典,这些字典指定要使用的算法,其相关参数等。
第一个是
IndexParams
。对于各种算法,要传递的信息在FLANN文档中进行了说明。概括来说,对于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, 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实现图像特征匹配》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

- 上一篇
- Golang函数指针和闭包:概念解析

- 下一篇
- 阿里巴巴蔡崇信:撤回菜鸟上市申请是基于集团战略和 IPO 进展阶段两方面考量
-
- 文章 · python教程 | 8分钟前 | Http请求
- Pythonrequests库入门教程
- 483浏览 收藏
-
- 文章 · python教程 | 21分钟前 | 字符串反转 中文处理
- Python字符串反转与中文处理技巧
- 264浏览 收藏
-
- 文章 · python教程 | 25分钟前 | Python
- @property的作用与使用技巧解析
- 394浏览 收藏
-
- 文章 · python教程 | 34分钟前 |
- PyCharm新手入门:零基础快速上手教程
- 204浏览 收藏
-
- 文章 · python教程 | 47分钟前 |
- 正则条件匹配怎么用?
- 389浏览 收藏
-
- 文章 · python教程 | 48分钟前 |
- Pythonif语句用法详解及示例
- 434浏览 收藏
-
- 文章 · python教程 | 54分钟前 |
- PyCharm入门到精通的实用技巧大全
- 214浏览 收藏
-
- 文章 · python教程 | 58分钟前 |
- Python项目结构如何合理规划?
- 162浏览 收藏
-
- 文章 · python教程 | 59分钟前 |
- 正则表达式中(?:)的作用与用法详解
- 320浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python中item是什么意思?常见用法解析
- 314浏览 收藏
-
- 文章 · python教程 | 1小时前 | 正则表达式 文本匹配
- Python正则表达式技巧与实战教程
- 174浏览 收藏
-
- 文章 · python教程 | 1小时前 |
- Python中%运算符用法及取模应用解析
- 129浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 茅茅虫AIGC检测
- 茅茅虫AIGC检测,湖南茅茅虫科技有限公司倾力打造,运用NLP技术精准识别AI生成文本,提供论文、专著等学术文本的AIGC检测服务。支持多种格式,生成可视化报告,保障您的学术诚信和内容质量。
- 133次使用
-
- 赛林匹克平台(Challympics)
- 探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。
- 154次使用
-
- 笔格AIPPT
- SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。
- 150次使用
-
- 稿定PPT
- 告别PPT制作难题!稿定PPT提供海量模板、AI智能生成、在线协作,助您轻松制作专业演示文稿。职场办公、教育学习、企业服务全覆盖,降本增效,释放创意!
- 135次使用
-
- Suno苏诺中文版
- 探索Suno苏诺中文版,一款颠覆传统音乐创作的AI平台。无需专业技能,轻松创作个性化音乐。智能词曲生成、风格迁移、海量音效,释放您的音乐灵感!
- 154次使用
-
- Flask框架安装技巧:让你的开发更高效
- 2024-01-03 501浏览
-
- Django框架中的并发处理技巧
- 2024-01-22 501浏览
-
- 提升Python包下载速度的方法——正确配置pip的国内源
- 2024-01-17 501浏览
-
- Python与C++:哪个编程语言更适合初学者?
- 2024-03-25 501浏览
-
- 品牌建设技巧
- 2024-04-06 501浏览