opencv中match与KnnMatch返回值解释

match与KnnMatch返回值解释:

之前一直不明白match与knnmatch的返回值到底是什么,查阅了一些资料才理解。

其实二者都是返回的DMatch类型的数据结构。

先说一下.match():

bf = cv.BFMatcher_create()
matches = bf.match(des1, des2)
for matche in matches:
    print(matche)

输出为:

<DMatch 0x7fcf509b90b0>
<DMatch 0x7fcf509b90d0>
<DMatch 0x7fcf509b90f0>
<DMatch 0x7fcf509b9110>

那么这个这个DMatch数据结构究竟是什么呢?
它包含三个非常重要的数据分别是queryIdx,trainIdx,distance
先说一下这三个分别是什么在演示其用途:
queryIdx:测试图像的特征点描述符的下标(第几个特征点描述符),同时也是描述符对应特征点的下标。
trainIdx:样本图像的特征点描述符下标,同时也是描述符对应特征点的下标。
distance:代表这怡翠匹配的特征点描述符的欧式距离,数值越小也就说明俩个特征点越相近。
演示如下:

bf = cv.BFMatcher_create()
matches = bf.match(des1, des2)
for matche in matches:
    print(matche)
    print(matche.queryIdx)
    print(matche.trainIdx)
    print(matche.distance)

输出结果为:

<DMatch 0x7f47e3aa6f50>
4220
588
149.05032348632812
<DMatch 0x7f47e3aa6f70>
4221
3089
303.5638427734375

每个特征点本身也具有以下属性:.pt:关键点坐标,.angle:表示关键点方向,.response表示响应强度,.size:标书该点的直径大小。
演示一下.pt:

def match_demo(image1, image2):
gray1 = cv.cvtColor(image1, cv.COLOR_BGR2GRAY)
gray2 = cv.cvtColor(image2, cv.COLOR_BGR2GRAY)
sift = cv.xfeatures2d.SIFT_create()
key1, des1 = sift.detectAndCompute(gray1, None)
key2, des2 = sift.detectAndCompute(gray2, None)

bf = cv.BFMatcher_create()
matches = bf.match(des1, des2)
for matche in matches:
   print(key1[matche.queryIdx].pt)#表示第(matche.queryIdx)个特征点的坐标

Knnmatch与match的返回值类型一样,只不过一组返回的俩个DMatch类型:

matches = flann.knnMatch(des1, des2, k=2)
# matchesMask = [[0, 0] for i in range(len(matches))]
for i, matche in enumerate(matches):
    print(matche)

返回值是:

[<DMatch 0x7f117af995f0>, <DMatch 0x7f117af99610>]
[<DMatch 0x7f117af99630>, <DMatch 0x7f117af99650>]

这俩个DMatch数据类型是俩个与原图像特征点最接近的俩个特征点(match返回的是最匹配的)只有这俩个特征点的欧式距离小于一定值的时候才会认为匹配成功。列入:原图像特征点与俩个绿色苹果相匹配,那么就会认为这个特征点是lv苹果,但若与原图像最接近的匹配分别是一个绿苹果和一个红苹果,那么就会认为匹配是失败的,即没有相匹配的特征点。

下面解释一段特征点匹配缩小优化的方法:
flann = cv.FlannBasedMatcher(indexpara, checkpara)

matches = flann.knnMatch(des1, des2, k=2)
matchesMask = [[1, 0] for i in range(len(matches))]
for i, (m, n) in enumerate(matches):
    if m.distance < 0.4*n.distance:
        matchesMask[i] = [1, 0]
drawpara = dict(singlePointColor=(0, 255, 0), matchColor=(255, 0, 0), matchesMask=matchesMask, flags=2)
image3 = cv.drawMatchesKnn(image1, key1, image2, key2, matches, None, **drawpara)
cv.imshow("flann_match_demo", image3)

我们已经知道m,n分别是俩个与原图像最相邻的俩个匹配,就如俩个都是绿苹果(即匹配是成功的)。
那么

 if m.distance < 0.4*n.distance:
      	  matchesMask[i] = [1, 0]

代表当两个绿苹果一个大一个小且大小差距太大的时候匹配还是不成功的,而两个都是小苹果的时候,原图像特征点就被认为是一个小的绿苹果。matcheMask就是特征掩膜,对应值为0的时候不会被“画”在对比图像上。不在做具体介绍了,睡觉觉啦,拜拜。

  • 95
    点赞
  • 270
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值