当前位置: 首页 > news >正文

使用 OpenCV 通过 SIFT 算法进行对象跟踪

本文介绍如何使用 SIFT 算法跟踪对象

在当今世界,当涉及到对象检测和跟踪时,深度学习模型是最常用的,但有时传统的计算机视觉技术也可能有效。在本文中,我将尝试使用 SIFT 算法创建一个对象跟踪器。

为什么人们会选择使用传统的计算机视觉技术而不是深度学习?

深度学习确实很强大,但它也有一些要求。首先,必须有可用的数据。有时,为您的特定目的找到合适的数据集可能具有挑战性。获取数据后,需要对模型进行训练,这既消耗时间又消耗计算资源

当谈到使用传统的计算机视觉技术时,您不需要数据集或模型训练。此外,在许多情况下,不需要GPU 。这些技术甚至可以在计算能力有限的小型设备上高效运行。

因此,如果您不想花时间在数据集收集和模型训练上,或者您缺乏训练资源,或者您根本无法访问足够的数据,那么您可以在深入研究之前考虑使用计算机视觉技术学习

在开始编码之前,我将简要解释一下SIFT 算法是什么。

什么是 SIFT 算法?

尺度不变特征变换(SIFT)是一种强大的计算机视觉算法。

  • SIFT 旨在检测描述匹配图像中的局部特征。
  • 它通过识别不随比例、旋转和照明变化而变化的独特关键点(兴趣点)来进行操作。
  • 这些关键点可以作为识别对象和模式的强大描述符。SIFT 的应用:对象识别、图像拼接、3D 建模、视频跟踪……。

SIFT 的应用:对象识别、图像拼接、3D 建模、视频跟踪……。

现在我将开始使用 OpenCV 使用 SIFT 算法创建一个对象跟踪器.

使用 SIFT 进行对象跟踪

该程序将非常简单。首先,用户将在视频的第一帧上绘制一个矩形,目标图像将放置在该矩形内。之后,SIFT算法将从该矩形中提取特征并保存。

然后视频将显示在屏幕上,SIFT 算法将应用于每一帧。对于每一帧,将比较第一帧的特征和从当前帧提取的特征,如果匹配,程序将在该公共点处画一个圆。此过程将应用于每一帧。

因此,当用户观看视频时,他们会看到每一帧中的目标对象上出现圆圈。所以它将是一个简单且相对强大的对象跟踪器

1. 创建用于跟踪的目标图像

要在目标对象周围绘制矩形,请单击鼠标右键。(将被跟踪的图像)。您可以修改代码以允许从任何帧中选择对象,而不仅仅是从第一帧中。我只是重用了以前项目中的代码,不想对其进行更改。

# 导入必要的库
import cv2 
import numpy as np 
import matplotlib.pyplot as plt# 视频路径  
video_path= "resources/plane (1).mp4" video = cv2.VideoCapture(video_path) # 只读第一帧以绘制所需对象的矩形
ret,frame = video.read() # 我给出大随机数x_min 和 y_min 的数字,因为如果将它们初始化为零,则无论最小坐标都将为零
x_min,y_min,x_max,y_max= 36000 , 36000 , 0 , 0 def  coordinat_chooser ( event,x,y,flags,param ): global go , x_min , y_min, x_max , y_max # 当你点击右键时,它将提供变量的坐标if event==cv2.EVENT_RBUTTONDOWN: # 如果 x 的当前坐标低于 x_min 它将是新的 x_min ,同样的规则适用for y_minx_min= min (x,x_min) y_min= min (y,y_min) # 如果 x 的当前坐标高于 x_max 则为新的 x_max ,同样的规则适用于 y_maxx_max= max (x,x_max) y_max= max (y,y_max) # 绘制矩形cv2.rectangle(frame,(x_min,y_min),(x_max,y_max),( 0 , 255 , 0 ), 1 ) """如果你不喜欢你的矩形(也许你喜欢一些misscliks),用鼠标中键重置坐标,如果您按下鼠标中键,您的鼠标坐标将重置,您可以为矩形“””提供新的2点对if event==cv2.EVENT_MBUTTONDOWN: print ( "重置坐标data" ) x_min,y_min,x_max,y_max= 36000 , 36000 , 0 , 0cv2.namedWindow( 'coefficient_screen' ) 
# 设置指定窗口的鼠标处理程序,在本例中为“coefficient_screen”窗口
cv2.setMouseCallback( 'coefficient_screen' , coordinat_chooser) while  True : cv2.imshow( "coefficient_screen" ,frame) # 仅显示第一帧k = cv2.waitKey( 5 ) & 0xFF  # 绘制矩形后按 esc    if k == 27 : cv2.destroyAllWindows() break
  • 下面,我用鼠标右键为目标对象绘制了一个矩形

# 获取感兴趣区域(取矩形内部)roi_image=frame[y_min:y_max,x_min:x_max] # 将 roi 转换为灰度,SIFT 算法适用于灰度图像
roi_gray=cv2.cvtColor(roi_image,cv2.COLOR_BGR2GRAY)

roi_image:简单来说就是在其周围画一个矩形得到的目标图像。

2. 寻找ROI(目标图像)的关键点

# 创建 SIFT 算法对象
sift = cv2.SIFT_create() # 查找 roi 的关键点和描述符
keypoints_1,descriptors_1 = sift.detectAndCompute(roi_gray, None ) roi_keypoint_image=cv2.drawKeypoints(roi_gray,keypoints_1,roi_gray)# 可视化关键点
plt.subplot( 121 ) 
plt.imshow(roi_gray,cmap= "gray" ) plt.subplot( 122 ) 
plt.imshow(roi_keypoint_image,cmap= "gray" )

3. 跟踪视频中的目标物体

# 视频路径  
video_path= "resources/plane (1).mp4"  video = cv2.VideoCapture(video_path) # 匹配器对象
bf = cv2.BFMatcher() while  True : # 读取视频ret,frame=video.read() #将帧转换为灰度frame_gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) # 查找当前帧关键点和描述符keypoints_2,descriptors_2 = sift.detectAndCompute(frame_gray, None ) """比较从    第一帧提取的关键点/描述符(
来自目标对象)与从当前帧中提取的内容。“””匹配 =bf。match (descriptors_1,descriptors_2) for  match  in matches: # .queryIdx 和 .trainIdx 给出关键点的索引# .queryIdx 给出目标图像的关键点索引 query_idx = match .queryIdx # .trainIdx 给出当前帧的关键点索引 train_idx = match .trainIdx #取匹配的坐标pt1 = keypoints_1[query_idx].pt # 当前帧关键点坐标pt2 = keypoints_2[train_idx].pt # 将圆绘制到 pt2 坐标,因为 pt2 给出当前帧坐标cv2.circle(frame,( int (pt2[ 0 ]), int (pt2[ 1 ])), 2 ,( 255 , 0 , 0 ), 2 ) # 将帧显示到屏幕cv2.imshow( "coordinate_screen" ,frame) k = cv2.waitKey( 5 ) & 0xFF  #绘制矩形后按 esc    if k == 27 : cv2.destroyAllWindows() breakcv2.destroyAllWindows()

相关文章:

使用 OpenCV 通过 SIFT 算法进行对象跟踪

本文介绍如何使用 SIFT 算法跟踪对象 在当今世界,当涉及到对象检测和跟踪时,深度学习模型是最常用的,但有时传统的计算机视觉技术也可能有效。在本文中,我将尝试使用 SIFT 算法创建一个对象跟踪器。 为什么人们会选择使用传统的计…...

SHELL 脚本: 导出NEO4j DUMP并上传SFTP

前提 开通sftp账号 安装expect 示例 NEO4J_HOME/path/to/neo4j # neo4j 安装目录 DUMP_PATH/data/dump # DUMP本地保存目录 DUMP_FILEneo4j_$(date %F).dump #导出文件名称 UPLOAD_DIR/path/to/stfp/dump/ #上传目录 $NEO4J_HOME/bin/neo4j-admin dump --databaseneo4j --t…...

Vue 封装一个函数,小球原始高度不固定,弹起比例不固定、计算谈几次后,高度低于1米

## 简介 本文将介绍如何使用Vue封装一个函数&#xff0c;计算小球弹跳的次数&#xff0c;直到高度低于1米。函数的参数包括小球的原始高度和弹起比例。通过代码案例演示了如何使用Vue进行封装和调用。 ## 函数封装 vue <template> <div> <label for&qu…...

外地人能申请天津公租房吗?2024天津积分落户租房积分怎么加?

相关推荐&#xff1a;在天津工作的外地人可以申请天津公共租赁住房吗&#xff1f; 外地人可以申请天津公共租赁住房吗&#xff1f; 2024年定居天津租房如何加分&#xff1f; 根据《天津居住证积分指标及积分表》的规定&#xff0c;在天津租房也可以参加积分结算&#xff0c;每…...

毕业设计——基于springboot的聊天系统设计与实现(服务端 + 客户端 + web端)

整个工程包含三个部分&#xff1a; 1、聊天服务器 聊天服务器的职责一句话解释&#xff1a;负责接收所有用户发送的消息&#xff0c;并将消息转发给目标用户。 聊天服务器没有任何界面&#xff0c;但是却是IM中最重要的角色&#xff0c;为表达敬意&#xff0c;必须要给它放个…...

公告栏功能:自动弹出提醒,重要通知不再错过

发布查询时&#xff0c;您是否遇到这样的困扰&#xff1a; 1、查询发布时间未到&#xff0c;学生进入查询主页后发现未发布任何查询&#xff0c;不断进行咨询。 2、有些重要事项需要进入查询主页就进行强提醒&#xff0c;确保人人可见&#xff0c;用户需要反馈“我知道了”才能…...

网络编程学习

思维导图 代码练习 TCP实现通信 服务器端代码 #include <myhead.h> #define SER_IP "192.168.152.135" #define SER_PORT 8910 int main(int argc, const char *argv[]) {//&#xff11;创建用于监听的套接字int sfd -1;sfd socket(AF_INET,SOCK_STREAM,0)…...

centos物理电脑安装过程(2024年1月)

开机时&#xff1a;CtrlAltDelete键重启电脑 重启开始时&#xff1a;按F11&#xff0c;桌面弹出蓝色框&#xff0c;选择第二个SSK SFD142 1.00&#xff0c;回车 选择install centos7安装 选择后弹出选择安装选项&#xff0c;选择语言 连接无线网络 安装设置&#xff0c;选择磁…...

Web自动化测试平台开发---Automated_platform

一、项目简介 历时一个假期&#xff0c;Automated_platform 第一版完工&#xff0c;是一款基于po模式的自动化测试平台,采用后端技术为DjangoceleryRabbitMQmysql 配置mysql数据库&#xff0c;进行数据迁移后&#xff0c;运行项目后&#xff0c;即可成功访问http://127.0.0.1:8…...

mybatis-plus: 多租户隔离机制

文章目录 一、TenantLineHandler1、介绍2、包含的方法 二、简单实例三、实践1、实现TenantLineHandler接口 一、TenantLineHandler 1、介绍 TenantLineHandler 是 Mybatis-Plus 中用于处理多租户的接口&#xff0c;用于实现多租户数据隔离的具体逻辑。通过实现这个接口&#…...

用Socks5代理游戏,绕过“网络海关”去探险

1. 出海大冒险的开始 在游戏世界&#xff0c;就像在现实生活中一样&#xff0c;有时我们需要越过海洋去探索未知的世界。但是&#xff0c;网络上也有一些“海关”&#xff0c;限制我们访问某些网站或游戏服务器。这就是我们今天要克服的挑战&#xff01; 2. Socks5代理&#xf…...

SpringBoot整合rabbitmq-直连队列,没有交换机(一)

说明&#xff1a;本文章只是springboot和rabbitmq的直连整合&#xff0c;只使用队列生产和消费消息&#xff0c;最简单整合&#xff01; 工程图&#xff1a; A.总体pom.xml <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://…...

CUDA C:查看GPU设备信息

相关阅读 CUDA Chttps://blog.csdn.net/weixin_45791458/category_12530616.html?spm1001.2014.3001.5482 了解自己设备的性能是很有必要的&#xff0c;为此CUDA 运行时(runtime)API给用户也提供了一些查询设备信息的函数&#xff0c;下面的函数用于查看GPU设备的一切信息。 …...

深度学习如何入门?——从“小白”到“大牛”的深度学习之旅

大家好&#xff0c;今天我要和大家分享的主题是“深度学习如何入门”。深度学习作为人工智能领域的重要分支&#xff0c;已经取得了许多令人瞩目的成果。然而&#xff0c;对于初学者来说&#xff0c;深度学习可能显得有些神秘和难以入手。那么&#xff0c;如何才能快速入门深度…...

编译 qsqlmysql.dll QMYSQL driver not loaded

Qt 连接MySQL数据库&#xff0c;没有匹配的qsqlmysql.dll, 需要我们跟进自己Mysql 以及QT版本自行编译的。异常如下图&#xff1a; 安装环境为 VS2019 Qt5.12.12&#xff08;msvc2017_64、以及源码&#xff09; 我的安装地址&#xff1a;D:\Qt\Qt5.12.12 Mysql 8.1.0 默认安…...

Android日历提醒增删改查事件、添加天数不对问题

Android日历提醒是非常好的提醒功能&#xff0c;笔者在做的过程中&#xff0c;遇到的一些问题&#xff0c;现整理出来&#xff0c;以供参考。 一、申请日历的读写权限 <uses-permission android:name"android.permission.WRITE_CALENDAR" /> <uses-permiss…...

【力扣hot100】刷题笔记Day15

前言 今天要刷的是图论&#xff0c;还没学过&#xff0c;先看看《代码随想录》这部分的基础 深搜DFS理论基础 深搜三部曲 确认递归函数、参数确认终止条件处理目前搜索节点出发的路径 代码框架 void dfs(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本节点…...

vue-显示数据

​ v-text和v-html专门用来展示数据, 其作用和插值表达式类似。v-text和v-html可以避免插值闪烁问题. ​ 当网速比较慢时, 使用{{}}来展示数据, 有可能会产生插值闪烁问题。 ​ 插值闪烁: 在数据未加载完成时&#xff0c;页面会显示出原始的{{}}, 过一会才会展示正常数据.语法…...

kali linux常用命令

1. 网络扫描 功能&#xff1a;网络扫描是用来发现网络中的设备、服务和开放端口的过程。 命令&#xff1a;nmap 例子&#xff1a;nmap -sP 192.168.1.0/24 这个命令使用 Nmap 进行网络扫描&#xff0c;列出 192.168.1.0/24 网段中的所有活跃主机。 2. 密码破解 功能&#xf…...

HTML5:七天学会基础动画网页4

backgorund-size 值与说明 length(单位像素):设置背景图片高度和宽度&#xff0c;第一个值设置宽度&#xff0c;第二个值设置高度&#xff0c;如果只给出一个值&#xff0c;第二个是设置为auto。 percentage(百分比):以父元素的百分比来设置背景图像的宽度和高度&#xff0c…...

从理论到实践:经济订货批量模型(EOQ)在现代供应链管理中的应用与优化

1. EOQ模型的前世今生&#xff1a;从仓库管理员的小本本到智能算法 记得我刚入行供应链管理那会儿&#xff0c;第一次听说EOQ&#xff08;经济订货批量&#xff09;这个词&#xff0c;还以为是什么高深莫测的黑科技。后来才发现&#xff0c;这其实就是仓库管理员用了上百年的老…...

SAM 3图像视频分割:小白友好,快速部署体验AI黑科技

SAM 3图像视频分割&#xff1a;小白友好&#xff0c;快速部署体验AI黑科技 1. SAM 3是什么&#xff1f;它能做什么&#xff1f; SAM 3是Facebook推出的一个强大的AI模型&#xff0c;专门用于图像和视频中的物体分割。简单来说&#xff0c;它就像一个"智能剪刀"&…...

10:机台常用传感器与执行器(EAP现场必认)

10&#xff1a;机台常用传感器与执行器&#xff08;EAP现场必认&#xff09; 一、本课学习目标 认识机台常用传感器&#xff0c;知道安装位置与检测对象分清执行器功能及与PLC、EAP的对应关系明确机台状态对应的传感器来源初步判断机台异常是传感器问题还是执行器问题二、传感器…...

广度优先搜索(Breadth-First Search, BFS)是一种基于队列的图遍历算法,因其逐层探索的特性,在解决最短路径问题(特别是无权图或权值相同的图)时具有天然优势

广度优先搜索(Breadth-First Search, BFS)是一种基于队列的图遍历算法,因其逐层探索的特性,在解决最短路径问题(特别是无权图或权值相同的图)时具有天然优势。 本文将深度剖析如何用 BFS 解决最短路径问题,涵盖核心思想、算法步骤、代码实现、适用场景、优化技巧及常见…...

Golang colly爬虫框架如何用_Golang colly教程【进阶】

c.Visit()未触发OnHTML最常见原因是请求被目标站拦截导致403&#xff0c;因Colly默认UA易被拒绝&#xff1b;需设自定义UserAgent、加OnResponse打印状态码、处理重定向、传完整URL、用Limit()控并发、解压gzip、避开JS渲染页、选稳定选择器、用连接池channel安全存库。为什么 …...

从实验室到日常生活:马吕斯定律在LCD屏幕和太阳镜中的神奇应用

偏振光的魔法&#xff1a;马吕斯定律如何塑造现代科技产品 清晨的阳光透过窗帘缝隙洒进房间&#xff0c;你伸手摸到床头的手机&#xff0c;屏幕瞬间亮起——这个再普通不过的动作背后&#xff0c;隐藏着一个200多年前发现的物理定律。当我们戴上太阳镜在户外活动&#xff0c;或…...

ComfyUI-Manager终极加速指南:3个技巧让AI模型下载快300%

ComfyUI-Manager终极加速指南&#xff1a;3个技巧让AI模型下载快300% 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various cu…...

深入解析RK3588 ADC按键驱动实现与设备树配置

1. RK3588 ADC按键驱动概述 在嵌入式Linux开发中&#xff0c;ADC按键是一种常见的输入方式。RK3588作为瑞芯微旗舰级处理器&#xff0c;其内置的SARADC模块可以方便地实现按键检测功能。相比传统的GPIO按键&#xff0c;ADC按键有以下优势&#xff1a; 节省GPIO资源&#xff1a;…...

如何扩展FossFLOW功能:自定义元素与交互的完整指南

如何扩展FossFLOW功能&#xff1a;自定义元素与交互的完整指南 【免费下载链接】FossFLOW Make beautiful isometric infrastructure diagrams 项目地址: https://gitcode.com/GitHub_Trending/openflow1/FossFLOW FossFLOW是一款强大的等距基础设施图表创建工具&#x…...

告别抢码焦虑:3步掌握MHY_Scanner的智能扫码登录技巧

告别抢码焦虑&#xff1a;3步掌握MHY_Scanner的智能扫码登录技巧 【免费下载链接】MHY_Scanner MHY扫码登录器&#xff0c;支持从直播流抢码。 项目地址: https://gitcode.com/gh_mirrors/mh/MHY_Scanner 你是否曾在米哈游游戏登录时&#xff0c;面对转瞬即逝的二维码感…...