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

news2024/10/13 2:17:14

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

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

import cv2


def 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.coloradmin.cn/o/992678.html

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

相关文章

Kafka中Producer源码解读

Producer源码解读 在 Kafka 中, 我们把产生消息的一方称为 Producer 即 生产者, 它是 Kafka 的核心组件之一, 也是消息的来源所在。它的主要功能是将客户端的请求打包封装发送到 kafka 集群的某个 Topic 的某个分区上。那么这些生产者产生的消息是怎么传到 Kafka 服务端的呢&a…

如何使用Google Compute Engine入门指南快速创建和配置您的云虚拟机实例

文章目录 步骤1&#xff1a;创建 Google Cloud Platform&#xff08;GCP&#xff09;账户步骤2&#xff1a;设置 GCP 项目步骤3&#xff1a;启用 Google Compute Engine API步骤4&#xff1a;安装 Google Cloud SDK步骤5&#xff1a;创建虚拟机实例步骤6&#xff1a;连接到虚拟…

ADL200N单相逆流监测多功能仪表在光伏中的应用-安科瑞黄安南

安科瑞电气-黄安南 ,18/*76-150-/6237 随着光伏行业的发展&#xff0c;部分地区村级变压器及工业用电变压器容量与光伏项目的装机容量处于饱和。电网公司要求对后建的光伏并网系统为不可逆流发电系统&#xff0c;指光伏并网系统所发生的电由本地负载消耗&#xff0c;多余的电不…

100万级连接,爱奇艺WebSocket网关如何架构

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近&#xff0c;尼恩指导一个小伙伴简历&#xff0c;写了一个《高并发网关项目》&#xff0c;此项目帮这个小伙拿到 字节/阿里/微…

IDEFICS 简介: 最先进视觉语言模型的开源复现

我们很高兴发布 IDEFICS ( Image-aware Decoder Enhanced la Flamingo with Ininterleaved Cross-attention S ) 这一开放视觉语言模型。IDEFICS 基于 Flamingo&#xff0c;Flamingo 作为最先进的视觉语言模型&#xff0c;最初由 DeepMind 开发&#xff0c;但目前尚未公开发布…

【广州华锐互动】元宇宙技术如何赋能传统工业企业?

随着科技的飞速发展&#xff0c;我们正处于工业革命4.0的时代&#xff0c;数字化、网络化和智能化正在深刻地改变着我们的生活和工作方式。在这个变革的大潮中&#xff0c;工业元宇宙平台应运而生&#xff0c;为企业带来了前所未有的机遇和挑战。 广州华锐互动开发的工业元宇宙…

什么是“护网行动”?看完你就懂了

近几年&#xff0c;随着大数据、物联网、云计算的飞速发展&#xff0c;网络攻击触手已经从企业逐渐伸向国家&#xff0c;国家关键信息基础设施建设也面临着无形威胁。我们应当未雨绸缪&#xff0c;厉兵秣马&#xff0c;化被动为主动。 在这种严峻的网络安全态势之下&#xff0c…

第7节-PhotoShop基础课程-视图调整

文章目录 前言1.视图菜单1. 视图操作1.校样颜色 Ctrl Y2.色域警告 Ctrl Shift Y3.像素长宽比 2.显示操作1.大小调整1.Alt 滚轮2.放大选项3.按空格 出现抓手 2.按屏幕大小缩放 Ctrl 0(数字0)3.按实际大小缩放 Ctrl 11.标准屏幕模式2.带有菜单栏的全屏模式3.全屏模式4.只显…

【扩散模型】4、Improved DDPM | 引入可学习方差和余弦加噪机制来提升 DDPM

文章目录 一、背景二、Improved DDPM——提升 Log-likelihood2.1 可学习的方差2.2 改进 noise schedule2.3 降低梯度噪声 三、效果 论文&#xff1a;Improved Denoising Diffusion Probabilistic Models 代码&#xff1a;https://link.zhihu.com/?targethttps%3A//github.com…

浏览器原理-v8引擎

什么是MVVM呢? 口通常我们学习一个概念&#xff0c;最好的方式是去看维基百科(对&#xff0c;千万别看成了百度百科)https://zh.wikipedia.org/wiki/MVVM View层: 视图层 >在我们前端开发中&#xff0c;通常就是DOM层 > 主要的作用是给用户展示各种信息。 Model层: t&g…

AI大语言模型时代构建全新数据平台

在大语言模型的引领下&#xff0c;数据平台领军企业 Databricks 和 Snowflake 的未来重置&#xff0c;探讨了 Databricks 和 Snowflake 等知名平台&#xff0c; 存储领域的 Delta、udi、Iceberg&#xff0c;还是实时化数据处理领域的 Databricks、Snowflake 1、LLM 给大数据企…

如何为虚拟机添加磁盘,扩充原有分区的磁盘空间

如何为虚拟机添加磁盘&#xff0c;扩充原有分区的磁盘空间 关机新增磁盘 虚拟机关机的状态下&#xff0c;在 VMware 当中新增一块磁盘&#xff0c;选中左边要添加磁盘的虚拟机镜像&#xff0c;然后鼠标右键点击设置。 选中磁盘点击添加 点击下一步&#xff0c;悬着SCSI这个…

【数字IC/FPGA】Verilog中的force和release

在Verilog中&#xff0c;将force用于variable会覆盖掉过程赋值&#xff0c;或者assign引导的连续&#xff08;procedural assign&#xff09;赋值&#xff0c;直到release。 下面通过一个简单的例子展示其用法&#xff1a; 加法器代码 module adder ( input logic [31:0] a, …

ISYSTEM调试实践12-软件运行时间的优化

实际工程的运行要比上篇文章提到的例程复杂的多 ISYSTEM调试实践11-Profiler Timeline和软件运行时间分析 由于复杂的应用层模型和底层任务&#xff0c;假定应用层模型的运行周期是10ms&#xff0c;任务函数的执行时间往往超过1ms&#xff0c;这时候就必须要考虑函数执行本身的…

什么是护网行动?

护网&#xff0c;也称“网络保护”&#xff0c;是指网络安全人员对企业或组织的网络进行检查、维护和保护&#xff0c;以防止网络受到黑客攻击、病毒、木马或其它恶意程序的侵入和损害。护网工作包括&#xff1a;网络安全规划、网络配置和控制、漏洞发现和修复、入侵检测和防范…

ES6 拓展(下)

一、函数的拓展 1.1、默认参数 在ES5中设置默认参数&#xff1a; function func(words, name) {name name || "闷墩儿";console.log(words, name); } func("大家好&#xff01;我是"); func("大家好&#xff01;我是", "憨憨");func(…

使用React18+Ts创建项目

1. 创建项目 首先&#xff0c;使用create-react-app工具创建一个新的React项目&#xff1a; npx create-react-app 项目名 --template typescript2. 安装依赖项 使用脚手架创建项目后&#xff0c;自带react-dom等依赖项&#xff0c;但react中的所用的路由方法是react-router…

建站系列(八)--- 本地开发环境搭建(WNMP)

目录 相关系列文章前言一、准备工作二、Nginx安装三、MySQL安装四、PHP安装及Nginx配置五、总结 相关系列文章 建站系列&#xff08;一&#xff09;— 网站基本常识 建站系列&#xff08;二&#xff09;— 域名、IP地址、URL、端口详解 建站系列&#xff08;三&#xff09;— …

cookie、session、Token区别

1 HTTP无状态&#xff0c;什么是无状态&#xff1f; http 无法知道是哪个客户端发出的请求&#xff0c;也无法判断是否为已登录用户请求&#xff0c;这就导致了 http 无法记住用户的登录状态。 2 cookie和session的是什么&#xff1f;为什么session这么好还要用cookie? coo…

VR钢铁实训 | 铁前事业部虚拟仿真培训软件

随着科技的发展&#xff0c;虚拟现实技术在各个行业中的应用越来越广泛。在钢铁冶炼行业中&#xff0c;VR技术也逐渐得到了应用&#xff0c;其中铁前事业部虚拟仿真培训软件就是一项非常有优势的技术。 铁前事业部虚拟仿真培训软件是广州华锐互动打造的《钢铁生产VR虚拟培训系统…