实现在一张图片中寻找另一张图片的目标

OpenCV库中的SIFT特征检测算法和FLANN(快速最近邻搜索库)匹配算法来找到一个图片中的元素在另一个图片中的位置,并在源图片中标出它们的位置。

以下是一个简单的例子,使用OpenCV库,利用SIFT特征检测算法,在一张图片中找到另外一张图片中的目标,这其中目标图片中的元素被识别为“模板”,被查找的图片中的元素被识别为“源”,代码示例如下:

import cv2def fetch_match():template = cv2.imread("tmp.jpg")source = cv2.imread("source.jpg")template_gray = cv2.cvtColor(template, cv2.COLOR_BGRA2GRAY)source_gray = cv2.cvtColor(source, cv2.COLOR_BGRA2GRAY)try:  #  OpenCV 库到版本3.0及更高版本支持调用此方法sift = cv2.xfeatures2d.SIFT_create()except Exception as e:sift = cv2.SIFT_create()  # 低版本会调用此方法kp1, des1 = sift.detectAndCompute(template_gray, None)kp2, des2 = sift.detectAndCompute(source_gray, None)flann = cv2.FlannBasedMatcher({"algorithm": 0, "trees": 5}, {"checks": 50})matches = flann.knnMatch(des1, des2, k=2)good_matches = []for m, n in matches:if m.distance < 0.7 * n.distance:good_matches.append(m)result = cv2.drawMatches(template, kp1, source, kp2, good_matches, None)cv2.imshow("Result", result)cv2.waitKey(0)cv2.destroyAllWindows()fetch_match()

效果如下:
在这里插入图片描述具体方法介绍
sift.detectAndCompute():是SIFT算法中的一个方法,用于检测关键点并计算描述符。该方法需要传入一幅图像,并返回检测到的关键点和对应的描述符

img = cv2.imread("img.png")
# 创建sift对象
try:sift = cv2.xfeatures2d.SIFT_create()
except Exception as e:sift = cv2.SIFT_create()
# 检测关键点并计算描述符
kp, des = sift.detectAndCompute(img, None)

cv2.FlannBasedMatcher():是OpenCV中的一个匹配器,基于FLANN算法进行匹配。FLANN是快速最近邻搜索库的缩写。该方法需要一个参数字典以设置FLANN算法的参数,并且需要一个检索器参数和一个搜索参数。示例代码如下:

# 创建FlannBasedMatcher 对象flann = cv2.FlannBasedMatcher({"algorithm": 0, "trees": 5}, {"checks": 50})

flann.knnMatch(): 是OpenCV中的一个FLANN最近邻算法匹配函数,用于在两组描述符之间进行最近邻搜索。该方法接受两组描述符作为输入,并返回描述符的匹配。示例代码如下

# 创建FlannBasedMatcher 对象
flann = cv2.FlannBasedMatcher({"algorithm": 0, "trees": 5}, {"checks": 50})
# 应用knnMatch来找到好的匹配
matches = flann.knnMatch(des1, des2, k=2)

cv2.drawMatches():是OpenCV中的一个绘图函数,用于绘制两幅图像之间的匹配。该方法需要传入两幅图像、描述符和匹配。示例代码如下:

img1 = cv2.imread("img.png")
img2 = cv2.imread("img_1.png")
# 创建SIFT对象
try:sift = cv2.xfeatures2d.SIFT_create()
except Exception as e:sift = cv2.SIFT_create()
# 找到关键点和描述符
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
# 创建FlannBasedMatcher对象
flann = cv2.FlannBasedMatcher({'algorithm': 0, 'trees': 5}, {'checks': 50})
# 查找匹配数据
matches = flann.knnMatch(des1, des2, k=2)
good_matches = []
for  m, n in matches:if m.distance < 0.7 * n.distance:good_matches.append(m)
result_img = cv2.drawMatches(img1, kp1, img2, kp2, good_matches, None, flags=2)

SIFT算法的主要思想
通过连续的图像滤波和关键点检测来提取描述图像中稳定的局部特征。SIFT算法对图像进行多次高斯平滑滤波,并计算不同尺度和方向上的梯度幅值和方向,得出图像中的局部特征。然后,通过Oriented Histogram描述符来描述这些特征。

以下是关键步骤:

  1. 构建高斯金字塔
    先对图像进行高斯模糊操作,通过不断降采样得到一个二维高斯金字塔,每一层都是前一层的1/4 大小。通过这个金字塔,可以表示不同的变化尺度。

  2. 检测极值点
    在高斯金字塔中找到那些在空间和尺度上都是极大值或极小值的点。这些点通常称为关键点,因为它们在各个尺度上都是稳定的。

  3. 精确定位关键点
    对于检测到的关键点,使用一个偏导数的Hessian矩阵来获取关键点的精确位置和尺度。

  4. 确定关键点的主方向
    根据关键点周围像素的梯度方向,计算出关键点的主方向。然后将关键点描述符旋转至该方向,以提高描述符的不变性。

  5. 描述符生成
    将关键点附近的像素划分成小块,并计算每个块内像素的梯度幅值和方向。然后利用一个128维特征向量来描述关键点。这个描述符具有旋转不变性、缩放不变性和视角不变性。

img = cv2.imread("img.png")
try:sift = cv2.xfeatures2d.SIFT_create()except Exception as e:sift = cv2.SIFT_create()kp, des = sift.detectAndCompute(img, None)# 在图像上绘制关键点result = cv2.drawKeypoints(img, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# 窗口显示图像
cv2.imshow("Result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无涯教程-JavaScript - IMABS函数

描述 IMABS函数以x yi或x yj文本格式返回复数的绝对值(模)。 Excel中的复数 复数简单地以文本形式存储在Excel中。 当将格式为" a bi"或" a bj"的文本字符串提供给Excel的内置复数函数之一时,这被解释为复数。 复数函数可以接受简单数值,因为它等效…

PostgreSQL 数据库使用 psql 导入 SQL

最近我们有一个 SQL 需要导入到 PostgreSQL &#xff0c;但数据格式使用的是用&#xff1a; -- -- TOC entry 7877 (class 0 OID 21961) -- Dependencies: 904 -- Data for Name: upload_references; Type: TABLE DATA; Schema: public; Owner: - --COPY public.upload_refere…

持续集成/技术交付全流程流水线工具的设计与落地

文章目录 持续集成/技术交付全流程流水线工具的设计与落地概述工具架构设计主要功能模块代码库Jenkins 流水线代码构建自动化测试产品部署监控报警 使用方法步骤一&#xff1a;安装 Jenkins步骤二&#xff1a;创建 Jenkins 流水线步骤三&#xff1a;配置监控报警步骤四&#xf…

【2023集创赛】加速科技杯二等奖作品:基于ATE的电源芯片测试设计与性能分析

本文为2023年第七届全国大学生集成电路创新创业大赛&#xff08;“集创赛”&#xff09;加速科技杯二等奖作品分享&#xff0c;参加极术社区的【有奖征集】分享你的2023集创赛作品&#xff0c;秀出作品风采&#xff0c;分享2023集创赛作品扩大影响力&#xff0c;更有丰富电子礼…

Linux文件操作

目录 复制文件、目录 cp 移动 重命名文件或目录 mv 创建删除文件 touch rm(remove) 创建删除目录 mkdir(make directory) rmdir(remove directory) 复制文件、目录 cp cp(copy) 同一个目录下复制&#xff0c;所以重命名了一下&#xff1b;把它复制到linuxcast.net/目录下可以…

方案:TSINGSEE青犀AI智能分析网关森林防火智慧监管平台方案

一、方案背景 森林是地球上最重要的生态系统之一&#xff0c;对环境、气候、水循环和空气质量具有重要影响。森林火灾会造成巨大的经济损失&#xff0c;具有发生面广、突发性强、破坏性大、危险性高、处置扑救特别困难等特点&#xff0c;严重危及人民生命财产和森林资源安全&a…

69、配置AWS服务,接收来自RTSP流的推送

基本思想:在上一篇的基础和视频教程之后,进行简单的aws服务,进行RTSP流的接收 第一步: 第二步:配置video_stream,记得选择香港节点 同时记录这个信息,后面的策略需要填充 第三步:进行策略设置 第四步:策略设置,选中右上角的创建策略 第五步、进行json填充 第六步:填…

骨传导耳机十大品牌有哪个,骨传导耳机十大品牌排行榜分享

在这个信息爆炸的时代&#xff0c;确实很容易在市场上找到各种各样的骨传导耳机品牌和型号&#xff0c;对于没有相关经验的消费者来说&#xff0c;他们很难判断哪些产品是真正值得信赖的&#xff0c;哪些可能有质量问题或者不适合自己的需求&#xff0c;现如今骨传导耳机的市场…

通过starrocks jdbc外表查询sqlserver

1.sqlserver环境准备&#xff0c;使用docker环境&#xff0c;可以参考使用flink sqlserver cdc 同步数据到StarRocks_gongxiucheng的博客-CSDN博客 部署获得sqlserver环境&#xff1b; 2.获取starrocks环境&#xff0c;也可以通过docker部署&#xff0c;参考&#xff1a;使用…

【VSCode】文件模板创建及使用.md

背景 最近使用VSCode学习Vue项目比较频繁&#xff0c;每次创建Vue文件都要手动写重复代码&#xff0c;特别麻烦&#xff0c;就上网查找自动生成代码的说明&#xff0c;结果发现VSCode有代码模板&#xff0c;怪怪&#xff0c;感觉发现新大陆了(low!)。 配置 打开配置 方式一&a…

基于SSM的物流管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

ansible 使用roles简单部署LAMP平台

目录 一、了解roles目录 二、基于构建LAMP平台创建roles目录 1、在192.168.115.148创建目录 2、书写php的测试页面 3、编写httpd角色的main.yml文件 4、编写mysql角色的main.yml文件 6、编写lamp的playbook 7、启动剧本 8、访问 一、了解roles目录 在Ansible中&#…

第 2 章 线性表 (设立尾指针的单循环链表(链式存储结构)实现)

1. 背景说明 循环链表(circular linked list)&#xff0c;是另一种形式的链式存储结构。它的特点是表中最后一个结点的指针域指向头结点&#xff0c; 整个链表形成一个环。由此&#xff0c;从表中任一结点出发均可找到表中其他结点 。 2. 示例代码 1) status.h /* DataStruct…

Visual Studio 新建类从默认internal改为public

前言 之前一直用的Resharp辅助编写C#代码&#xff0c;Resharp用起来的确方便不少&#xff0c;但是太消耗开发机内存了。重装电脑后&#xff0c;还是决定使用Visual Studio内置的功能。 默认情况下&#xff0c;Visual Studio 中生成一个类或接口是internal类型的&#xff0c;而…

大学大创项目:手机室内AR导航APP项目思路

文章目录 一、最初的项目思路二、建图和定位分离的项目思路1、建图2、定位 个人见解&#xff0c;如有错误&#xff0c;请多包涵 一、最初的项目思路 在大创项目的开始&#xff0c;将手机确定为应用设备&#xff0c;传感器确定为相机。 由于知识储备的原因&#xff0c;在头一次…

Shell常用的几个正则表达式:[:alnum:], [:alpha:], [:upper:], [:lower:], [:digit:] 认知

一&#xff1a;通配符命令简介&#xff1a; 匹配符合相关条件的符号&#xff0c;匹配文件名查找。 通配符类型&#xff1a; *&#xff1a;匹配任意长度的任意字符 &#xff1f;&#xff1a;匹配任意单个字符 []&#xff1a;匹配指定范围内的任意单个字符 [^]&#xff1a;匹配指…

解决deepspeed框架的bug:不保存调度器状态,模型训练重启时学习率从头开始

deepspeed存在一个bug&#xff0c;即在训练时不保存调度器状态&#xff0c;因此如果训练中断后再重新开始训练&#xff0c;调度器还是会从头开始而不是接着上一个checkpoint的调度器状态来训练。这个bug在deepspeed的github中也有其他人提出&#xff1a;https://github.com/mic…

ResNet 09

一、发展 1989年&#xff0c;Yann LeCun提出了一种用反向传导进行更新的卷积神经网络&#xff0c;称为LeNet。 1998年&#xff0c;Yann LeCun提出了一种用反向传导进行更新的卷积神经网络&#xff0c;称为LeNet-5 AlexNet是2012年ISLVRC 2012&#xff08;ImageNet Large Sca…

MySQL——备份和还原

备份 热备 即MySQL服务在运行的时候进行的备份 mysqldump命令 mysqldump --databases db1 db2 db3 > dump.sql mysqldump -uroot -pSanchuang1234# --all-databases >all_db.sql mysqldump -uroot -pSanchuang123# --databases TENNIS >/backup/tennis.sql mysq…

Always On 数据库无法自动同步的问题

问题&#xff1a; 在给客户的SQL Server 2019 配置好Always On 之后&#xff0c;不久就出现高可用组里的一个库无法正常同步。 第一次出现&#xff0c;以为是偶发性问题&#xff0c;直接右键点击恢复数据同步&#xff0c;没一会就同步好了&#xff1b;过了一个月问题又出现了…