opencv特征匹配中match与KnnMatch返回数据类型

news/2024/9/20 9:04:11

1、match

    # 初始化 BFMatcherbf = cv.BFMatcher()# 对描述子进行匹配# des1/des2分别是两幅图片特征点的特征向量matches = bf.match(des1, des2)# 打印match返回数据的类型print(type(matches[0]))

match匹配的返回结果是DMatch类型。

DMatch数据结构包含三个非常重要的数据分别是queryIdx,trainIdx,distance;
queryIdx:某一特征点在本帧图像的索引;
trainIdx:trainIdx是该特征点在另一张图像中相匹配的特征点的索引;

distance:代表这一对匹配的特征点描述符的欧式距离,数值越小也就说明俩个特征点越相近。

    print("queryIdx=%d"%matches[0].queryIdx)print("trainIdx=%d"%matches[0].trainIdx)print("distance=%d"%matches[0].distance)输出:queryIdx=0trainIdx=105distance=68

 2、Knnmatch

bf = cv2.BFMatcher()
matches1 = bf.knnMatch(des1, des2, k=2)
# 打印match返回数据的类型
print(type(matches1[0]))
<class 'tuple'>

knnMatch匹配的返回结果是一个元组:说明结果不能改变;

对元组内元素进行类型查询: 所以Knnmatch与match的返回值类型一样,只不过一组返回的2个DMatch类型。

bf = cv2.BFMatcher()
matches1 = bf.knnMatch(des1, des2, k=2)for x in matches1[0]:print(type(x))

3、总结 

综上所知:

(1)match匹配的返回结果是DMatch类型。distance:代表这一对匹配的特征点描述符的欧式距离,数值越小也就说明俩个特征点越相近。

(2)Knnmatch与match的返回值类型一样,只不过一组返回的2个DMatch类型。这2个DMatch数据类型是2个与原图像特征点最接近的2个特征点(match返回的是最匹配的),只有这2个特征点的欧式距离小于一定值的时候才会认为匹配成功。(可以理解为:2个与原图像特征点最接近和次接近的特征点,一般第一个是最接近匹配点,第二个是次接近匹配点)

4、匹配优化 

(1)对于match类型(注意显示匹配结果:cv.drawMatches

 # 初始化 BFMatcherbf = cv.BFMatcher()# 对描述子进行匹配# des1/des2分别是两幅图片特征点的特征向量matches = bf.match(des1, des2)# 计算最大距离和最小距离min_distance = matches[0].distancemax_distance = matches[0].distancefor x in matches:if x.distance < min_distance:min_distance = x.distanceif x.distance > max_distance:max_distance = x.distance# 筛选匹配点'''当描述子之间的距离大于两倍的最小距离时,认为匹配有误。但有时候最小距离会非常小,所以设置一个经验值30作为下限。'''good_match = []for x in matches:if x.distance <= max(2 * min_distance, 30):good_match.append(x)# 绘制匹配结果outimage = cv.drawMatches(img1, kp1, img2, kp2, match, outImg=None)

(2)对于Knnmatch类型(注意显示匹配结果:cv.drawMatchesKnn

# 调整ratio
# ratio=0.4:对于准确度要求高的匹配;
# ratio=0.6:对于匹配点数目要求比较多的匹配;
# ratio=0.5:一般情况下。
ratio1 = 0.3
good1 = []for m1, n1 in matches1:
# 如果最接近和次接近的比值小于一个既定的值,那么我们保留这个最接近的值,认为它和其匹配的点为good_matchif m1.distance < ratio1 * n1.distance:good1.append([m1])
match_result1 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good1, None, flags=2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pgtn.cn/news/18626.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

和12岁小同志搞创客开发:Mind+编程软件简介、安装及使用

机缘巧合在网上认识一位12岁小同志&#xff0c;从零开始系统辅导其创客开发思维和技巧。 ​项目专栏&#xff1a;https://blog.csdn.net/m0_38106923/category_11097422.html 本期本打算写一篇关于Mind编程软件安装和基础操作的详细博文&#xff0c;奈何官网说明文档非常详实…

毕业设计So Easy:基于Java Web学生选课系统

目录 1、选题背景 2、选课系统分析与设计 2.1、系统功能说明 2.2、总体功能结构 很多计算机专业大学生经常和我交流&#xff1a;毕业设计没思路、不会做、论文不会写、太难了...... 针对这些问题&#xff0c;决定分享一些软、硬件项目的设计思路和实施方法&#xff0c;希望…

机器学习中的数学基础:(2)矩阵的奇异值分解(SVD)及其应用

在机器学习领域&#xff0c;有相当多的应用与奇异值都可以扯上关系&#xff0c;比如做feature reduction的PCA&#xff0c;做数据压缩&#xff08;以图像压缩为代表&#xff09;的算法&#xff0c;还有做搜索引擎语义层次检索的LSI&#xff08;Latent Semantic Indexing&#x…

基于传感器的人体生命体征监控技术

目录 1、简介 2、测量生命体征的技术 2.1、光学测量 2.2、生物电势测量 2.3、阻抗测量 2.4、MEMS传感器测量 1、简介 生命体征监测已经超出医疗实践的范围&#xff0c;进入我们日常生活的多个领域。最初&#xff0c;生命体征监测是在严格的医疗监督下&#xff0c;在医院和…

安装部署中的数据库打包和快捷方式启动浏览器

前一段时间&#xff0c;因为工作的需要&#xff0c;学习了一些.net的部署。在打包的过程中遇到了几个问题&#xff1a;<?XML:NAMESPACE PREFIX O />1、 数据库脚本打包&#xff0c;如何修改Web.config文件中的数据联接2、 数据库脚本中的方法和视图打包时要注意的问题…

机器学习中的数学基础(4.1):支持向量机Support Vector Machine(SVM)

SVM可以说是一个很经典的二分类问题&#xff0c;属于有监督学习算法的一种。看过那么多的博客知乎解释SVM我一定要自己总结一篇&#xff0c;加深一下自己的理解。 带着问题去读文章会发现&#xff0c;柳暗花明又一村&#xff0c;瞬间李敏浩出现在眼前的感觉 &#xff08;1&am…

液体测量技术:从水到血液

目录 1、医疗领域的液体测量 2、不同的阻抗测量原理 2.1、恒电势器 2.2、电流测量 2.3、循环伏安法 2.4、pH值测量 2.5、电化学阻抗分析 对于许多应用而言&#xff0c;确定液体的成分和质量至关重要。最主要的例子是水&#xff0c;水是世界上最珍贵的原生资源。净水和水…

和12岁小同志搞创客开发:如何选择合适的控制器?

目录 1、满足驱动要求 2、方便开发、维护 3、权衡性价比 4、外型工装美观 机缘巧合在网上认识一位12岁小同志&#xff0c;从零开始系统辅导其创客开发思维和技巧。 ​​项目专栏&#xff1a;https://blog.csdn.net/m0_38106923/category_11097422.html 如果说传感器是眼、…