Opencv中关于特征点匹配定位的问题(一)DMatch解析

news2024/11/24 10:46:08

Opencv中关于特征点匹配定位的问题

  • 回顾
  • 定位

回顾

在我们检测到特征点之后,通常进行特征点的匹配。
首先我们先回顾一下使用Brute-Force匹配器来进行匹配。

import cv2
import numpy as np
import matplotlib.pyplot as plt

#读取图片
img=cv2.imread('./newmm.png')
tem=cv2.imread('./templa.png')

#创建特征点检测器
orb=cv2.ORB_create()
#创建BF特征点匹配器
bf=cv2.BFMatcher_create()

#检测原图特征点
kp1,des1=orb.detectAndCompute(img,mask=None)
#检测模板图特征点
kp2,des2=orb.detectAndCompute(tem,mask=None)
#进行匹配
res=bf.match(des1,des2)
#将匹配点按照距离排序
res=sorted(res,key=lambda x:x.distance)
#将最相近的10个点绘画出来
newimg=cv2.drawMatches(img,kp1,tem,kp2,res[:10],None)
#绘制原图特征点
img=cv2.drawKeypoints(img,kp1,None,color=[0,0,255])
tem=cv2.drawKeypoints(tem,kp2,None,color=[0,255,0])
#显示图片
def imshow(img,axis,title=None):
    axis=str(axis[0])+str(axis[1])
    for i in range(len(img)):
        plt.subplot(int(axis + str(i+1)))
        if title:
            plt.title(title[i])
        i=cv2.cvtColor(img[i],cv2.COLOR_BGR2RGB)
        plt.imshow(i)
    plt.show()

all_img=[img,tem,newimg]
all_title=['img','tem','newimg']
imshow(all_img,[2,2],all_title)

然后效果如下:
在这里插入图片描述

定位

那么问题来了,如何对检测完成之后进行坐标定位呢。
首先我们要看bf.match生成的结果:

res=bf.match(des1,des2)
print(res)
(<DMatch 000001B9FFB81A50>, <DMatch 000001B9FFB81A70>, <DMatch 000001B9FFB81A30>, <DMatch 000001B9FFB819F0>.....<class 'cv2.DMatch'>

可以看见生成的是<DMatch 000001B9FFB81A50>迭代器,是<class 'cv2.DMatch'>类的对象。
那么我们依然可以通过dir(res[0])进行访问对象的属性。

['__class__',
 '__delattr__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'distance',
 'imgIdx',
 'queryIdx',
 'trainIdx']

然后把需要的'distance','imgIdx' 'queryIdx', 'trainIdx'打印出来:

print(res[0].distance)
print(res[0].imgIdx)
print(res[0].queryIdx)
print(res[0].trainIdx)
0.0
0
0
13

但是看着发现是一头雾水,只有res[0].distance知道说明含义。于是只能取opencv官网查阅
在这里插入图片描述
由于英语水平有限加上描述过于简单,只能凭借感觉来猜测。

项目Value
trainIdx匹配原图片对应的特征点索引
queryIdx匹配模板图片对应的特征点索引
imgIdx图片的索引

有了这个之后,便自己尝试了一下,由于匹配结果是进行排序后,也就是越前面准确度越高,所以直接拿前面进行尝试。
思路是这样,将两张图片(原图和模板图)前十个res进行获得最小值坐标和最大值坐标(也就是框的左上角和右上角),然后进行描绘出来,看两遍的图片框的位置是否一样。
代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt

#读取图片
img=cv2.imread('./newmm.png')
tem=cv2.imread('./templa.png')

#创建特征点检测器
orb=cv2.ORB_create()
#创建BF特征点匹配器
bf=cv2.BFMatcher_create()

#检测原图特征点
kp1,des1=orb.detectAndCompute(img,mask=None)
#检测模板图特征点
kp2,des2=orb.detectAndCompute(tem,mask=None)
#进行匹配
res=bf.match(des1,des2)

#将匹配点按照距离排序
res=sorted(res,key=lambda x:x.distance)

def get_rect(res,kp,idx=0):
    point_img=[]
    #获得前十res个对应的点
    for i in res[:10]:
        if idx==0:
            center=cv2.KeyPoint_convert(kp,keypointIndexes=[i.queryIdx])
        elif idx==1:
            center = cv2.KeyPoint_convert(kp, keypointIndexes=[i.trainIdx])
        center=[int(np.ravel(center)[0]),int(np.ravel(center)[1])]
        point_img.append(center)

    #获得框的左上角点和右下角点
    minres=np.argmin(point_img,axis=0)
    maxres=np.argmax(point_img,axis=0)
    minpoint=[point_img[minres[0]][0],point_img[minres[1]][1]]
    maxpoint=[point_img[maxres[0]][0],point_img[maxres[1]][1]]
    return minpoint,maxpoint

min1,max2=get_rect(res,kp1,0)
min3,max4=get_rect(res,kp2,1)

cv2.rectangle(tem,min3,max4,[255,0,0],4,16)
cv2.rectangle(img,min1,max2,[255,0,0],4,16)

#将最相近的10个点绘画出来
newimg=cv2.drawMatches(img,kp1,tem,kp2,res[:10],None)
#绘制原图特征点
img=cv2.drawKeypoints(img,kp1,None,color=[0,0,255])
tem=cv2.drawKeypoints(tem,kp2,None,color=[0,255,0])
#显示图片
def imshow(img,axis,title=None):
    axis=str(axis[0])+str(axis[1])
    for i in range(len(img)):
        plt.subplot(int(axis + str(i+1)))
        if title:
            plt.title(title[i])
        i=cv2.cvtColor(img[i],cv2.COLOR_BGR2RGB)
        plt.imshow(i)
    plt.show()

all_img=[img,tem,newimg]
all_title=['img','tem','newimg']
imshow(all_img,[2,2],all_title)

效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以发现完全匹配上了!!
我只需要绘制出原图的框就可以实现对目标的检测了

Opencv中关于特征点匹配定位的问题(二)单目标和多目标定位

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

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

相关文章

宝藏软件Obsidian知识体系搭建,免费的多端云同步

宝藏软件Obsidian知识体系搭建&#xff0c;免费的多端云同步。 为什么推荐Obsidian 人很奇怪,在关注短期目标的时候,会有成功失败之说,但是如果关注体系呢&#xff1f;就不那么会在乎短期收益了. 为什么呢&#xff1f;因为体系可能会创造强大的滚雪球效应. 使用笔记软件颇多…

如何针对时间片论法进行优化

前言 通过该篇学习了嵌入式的任务调度&#xff08;即时间片论法&#xff09;后&#xff0c;了解到通过以1ms为调度时间单位轮询判断是否需要执行函数任务&#xff0c;那么下面介绍如何基于时间片论法的任务调度模式充分利用MCU的资源&#xff0c;姑且先称这种方式为时间片差分…

一致性hash算法

目录 1.业务场景 2.传统hash算法 2.一致性hash算法 2.1.算法过程 2.1.一直性hash算法的优点 2.2.一致性hash算法的缺点 2.3.hash倾斜的解决办法 1.业务场景 假设有30000张图片需要存放到编号为1、2、3的3台服务器上。 2.传统hash算法 假设有30000张图片需要存到3台服务器…

【JavaWeb开发-Servlet】拾起海中的漂流瓶增强版

目录 原版&#xff1a; 1、前端样式 2、错误提示 3、实现id序列增长 完整项目代码&#xff1a; 原版&#xff1a; 【JavaWeb开发-Servlet】拾起海中的漂流瓶_代码骑士的博客-CSDN博客需求&#xff1a;点击网页按钮随机显示一句话&#xff1a;1、内容涵盖&#xff1a;老人…

PySpark大数据计算教程

PySpark大数据计算教程 了解如何将 Spark 与 Python 结合使用&#xff0c;包括 Spark Streaming、机器学习、Spark 2.0 DataFrames 等&#xff01; 课程英文名&#xff1a;Spark and Python for Big Data with PySpark 此视频教程共4.0小时&#xff0c;中英双语字幕&#xf…

多模态(红外,可见光)目标检测

【github】https://github.com/DocF/multispectral-object-detection 一.环境 1.1 环境 基本依赖和yolov5基本相同&#xff0c;当然也可以配置在虚拟环境中 git clone https://github.com/DocF/multispectral-object-detection cd multispectral-object-detection pip ins…

基于燃压缩空气储能系统的零碳微能源互联网优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f468;‍&#x1f4bb;做科研&#xff0c;涉及到一个深在的思想系统&#xff0c;需要科研者逻辑缜密&#xff0c;…

由美国火星照片细节,分析造假的疑点

穿帮都是细节。 除了阿波罗登月&#xff0c;你觉得美国还在哪些航天项目中有造假嫌疑&#xff1f; - 知乎 西红柿加醋 能走着游泳就好了 ​ 关注 无可靠信息来源 423 人赞同了该回答 除了登月&#xff0c;比较又争议的当然就数登火了&#xff0c;比如出自Nasa官方网站上的…

CSS布局-定位,相对,绝对,子绝父相,固定定位,层级关系。

CSS布局-定位&#xff0c;相对&#xff0c;绝对&#xff0c;子绝父相。 目录CSS布局-定位&#xff0c;相对&#xff0c;绝对&#xff0c;子绝父相。1、定位1.1 网页常见布局方式1.2 定位的常见应用场景2.1 定位初体验2.2 使用定位的步骤3.1 静态定位4.1 相对定位5.1 绝对定位5.…

矩阵理论复习(五)

2004年试题 Hermite矩阵酉相似于对角阵 验证相容矩阵范数 盖尔圆盘互不相交&#xff0c;则特征值都不相同&#xff0c;若盖尔圆盘全部出现在右半复平面上&#xff0c;则特征值全为实数。 矩阵二范数的计算 最大秩分解M-P广义逆矩阵方程是否有解 2005年试题 正定矩阵&a…

【秒杀购物商城业务服务】「分布式架构服务」盘点中间件服务的高可用模式及集群技术的方案分析

秒杀购物商城业务服务-分布式架构介绍 基于MySQL数据库集群技术实现服务的高可用基于Tomcat的集群负载机制实现Tomcat服务器的高可用基于Nginx负载均衡机制实现负载均衡&#xff08;介绍和配置&#xff09;基于Redis缓存服务实现数据缓存控制相关介绍和技术点分析 基于MySQL数…

RTC 时钟电路如何选择法拉电容的容量

理论依据&#xff1a; 公式 1&#xff1a;Q I * t 公式 2&#xff1a;Q CU 由此推导出→I * t CU →t CU/I(将根据这个计算时钟保留时长) 说明 Q&#xff1a; 电荷量 &#xff08;单位&#xff1a;库仑&#xff09;I&#xff1a; 电流 &#xff08;单位&#xff1a;安培&a…

QT/C语言 实现数据库sqlite3

QT/C语言 实现数据库sqlite3【1】引入数据库【2】下载移植sqlite31.移植sqlite32.使用sqlite33.sqlite3中的数据类型4.常用的SQL语句(全部都是分号结尾)(1)新建表格(2)往表格中插入数据(3)查询表格中的数据(4)删除表格中的数据(5)修改表格中的数据【3】C语言调用sqlite31.接口函…

第10部分 DHCP

目录 10.1 DHCP 概述 10.2 实验1&#xff1a;DHCP 基本配置 1.实验目的 2.拓扑结构 3.实验步骤 4.实验调试 &#xff08;1&#xff09;在客户端测试 &#xff08;2&#xff09;show ip dhcp pool &#xff08;3&#xff09;show ip dhcp binding 10.3 实验&#xff…

LeetCode 1827. 最少操作使数组递增

最少操作使数组递增 简单 46 相关企业 给你一个整数数组 nums &#xff08;下标从 0 开始&#xff09;。每一次操作中&#xff0c;你可以选择数组中一个元素&#xff0c;并将它增加 1 。 比方说&#xff0c;如果 nums [1,2,3] &#xff0c;你可以选择增加 nums[1] 得到 nums …

实战讲解Spring定时任务:@Scheduled(图+文+源码)

1 缘起 最近看到有些定时任务的项目&#xff0c; 使用了Spring自带的定时任务系统&#xff0c;通过添加Scheduled注解的方式实现&#xff0c; 并且&#xff0c;使用了不只cron表达式的方式实现定时执行&#xff0c; 恍然大悟&#xff0c;原来Scheduled还有其他的方式实现定时任…

《小猫猫大课堂》3之字符串,转义字符,注释,选择和循环语句,函数等小概括。

更新不易&#xff0c;麻烦多多点赞&#xff0c;欢迎你的提问&#xff0c;感谢你的转发&#xff0c; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我…

这十套练习,教你如何用Pandas做数据分析(01)

Pandas是入门Python做数据分析所必须要掌握的一个库。本文内容由和鲸社区翻译整理自Github&#xff0c;建议读者完成科赛网 从零上手Python关键代码 和 Pandas基础命令速查表 教程学习的之后&#xff0c;点击本篇Notebook右上角的 Fork 按钮对本教程代码进行调试学习。 转载本…

(附源码)SSM的KTV管理系统 毕业设计 291807

基于SSM的KTV管理系统 摘 要 随着社会的发展&#xff0c;人类的进步&#xff0c;21世纪人们的生活水平有所提高&#xff0c;为了满足人们对生活的需要&#xff0c;丰富业余生活&#xff0c;娱乐KTV等行业蓬勃发展&#xff0c;在数字化的今天&#xff0c;我们已离不开计算机&…

Redis的面试题

一、Redis支持的数据类型&#xff1f; Redis支持的数据类型主要有五种&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;列表&#xff09;&#xff0c;set&#xff08;集合&#xff09;及zset(sorte…