opencv-python视频分析与目标跟踪

news/2024/3/29 16:53:05/文章来源:https://blog.csdn.net/mzl_18353516147/article/details/130342514

目录

光流

目标跟踪


一、光流

使用OpenCV光流分析,跟踪蚂蚁的轨迹:

代码实现: 

import numpy as np
import cv2if __name__ == '__main__':cap = cv2.VideoCapture('ant.mp4')# ShiTomasi 角点检测参数feature_params = dict(maxCorners=100,qualityLevel=0.5,minDistance=30,blockSize=10)# Lucas Kanada 光流检测参数lk_params = dict(winSize=(15, 15),maxLevel=2,criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))# 获取第一帧并发现角点ret, last_current_frame = cap.read()last_gray = cv2.cvtColor(last_current_frame, cv2.COLOR_BGR2GRAY)p0 = cv2.goodFeaturesToTrack(last_gray, mask=None, **feature_params)mask = np.zeros_like(last_current_frame)color = np.random.randint(0, 255, (100, 3))while (1):ret, current_frame = cap.read()if not ret:breakcurrent_gray = cv2.cvtColor(current_frame, cv2.COLOR_BGR2GRAY)# TODO(You): 请在此编写光流跟踪和绘制代码p1, st, err = cv2.calcOpticalFlowPyrLK(last_gray, current_gray, p0, None, **lk_params)good_new = p1[st == 1]good_old = p0[st == 1]for i, (new, old) in enumerate(zip(good_new, good_old)):a, b = new.ravel()c, d = old.ravel()a, b = int(a), int(b)c, d = int(c), int(d)mask = cv2.line(mask, (a, b), (c, d), color[i].tolist(), 2)current_frame = cv2.circle(current_frame, (a, b), 5, color[i].tolist(), -1)current_img = cv2.add(current_frame, mask)cv2.imshow('current_img', current_img)k = cv2.waitKey(30) & 0xffif k == 27:breaklast_gray = current_gray.copy()p0 = good_new.reshape(-1, 1, 2)cv2.destroyAllWindows()cap.release()

二、目标跟踪

在视频分析(或视频结构化)应用开发中,多目标跟踪是非常重要的一个环节。它能有效弥补上一个目标检测环节中算法的不足,如检测算法输出坐标不稳定、漏检等。与此同时,跟踪算法输出的目标轨迹(track-id)对于应用下阶段的行为分析环节也有着至关重要的作用。下面是常见视频分析类应用系统结构:

 

目标检测算法输出单帧检测结果,目标跟踪算法负责将前后2帧中的目标关联起来、给予唯一标识track-id。假设t帧中检测到了M个目标,t+1帧中检测到了N个目标,跟踪算法本质上是M->N的匹配关联过程。

 

 

匹配过程中,目标可以分为以下三大类:

  1. matched_tracks,t帧目标出现,t+1帧该目标仍然出现,算法匹配上。
  2. unmatched_tracks,t帧目标出现,t+1帧该目标消失,算法未匹配上。
  3. unmatched_detections,t帧目标不存在,t+1帧该目标出现,新增检测目标。

其中,对于2和3来说,跟踪算法需要考虑:

t帧目标出现,t+1帧目标其实仍然存在,但是检测算法出现短暂漏检,误认为其消失。此时的解决方案是: 某帧未被匹配到的tracks不要立即清除,而是做若干帧的缓存,等待若干帧后检测算法恢复检测
t帧目标不存在,t+1帧该目标仍然不存在,但是检测算法出现短暂误检,误认为其出现。此时的解决方案是:新增的检测目标不要立即生效,而是做若干帧的缓存,等检测算法连续检测超过若干帧、并且都能匹配关联上后再生效

之所以要考虑以上2点,主要原因是对于连续视频帧而言,大部分检测算法基本无法做到100%连续、稳定检测,出现短暂的误检、漏检非常正常。

代码实现如下:

# 定义跟踪算法类
class Tracker(object):# 初始化参数def __init__(self, max_age=1, min_hits=3, iou_threshold=0.3):self.max_age = max_ageself.min_hits = min_hitsself.iou_threshold = iou_thresholdself.trackers = []self.frame_count = 0# 跟踪函数,每帧检测结果返回后,调用一次updatedef update(self, dets=np.empty((0, 5))):self.frame_count += 1trks = np.zeros((len(self.trackers), 5))to_del = []ret = []for t, trk in enumerate(trks):pos = self.trackers[t].predict()[0]trk[:] = [pos[0], pos[1], pos[2], pos[3], 0]if np.any(np.isnan(pos)):to_del.append(t)trks = np.ma.compress_rows(np.ma.masked_invalid(trks))for t in reversed(to_del):self.trackers.pop(t)# 匹配关联matched, unmatched_dets, unmatched_trks = associate_detections_to_trackers(dets, trks, self.iou_threshold)# 后处理逻辑# TO-DO your code...# 更新matched_tracksfor m in matched:self.trackers[m[1]].update(dets[m[0], :])# 初始化unmatched_detections,假设是当前帧新出现的检测目标for i in unmatched_dets:trk = KalmanBoxTracker(dets[i,:])self.trackers.append(trk)i = len(self.trackers)for trk in reversed(self.trackers):d = trk.get_state()[0]# 输出满足条件的tracksif (trk.time_since_update <= self.max_age) and (trk.hit_streak >= self.min_hits or self.frame_count <= self.min_hits):ret.append(np.concatenate((d,[trk.id+1])).reshape(1,-1))i -= 1# 移除超过self.max_age次的漏检目标if(trk.time_since_update > self.max_age):self.trackers.pop(i)# 返回跟踪结果 [[left, top, right, bottom, track-id]...]if(len(ret) > 0):return np.concatenate(ret)return np.empty((0, 5))

代码相关说明:

  1. self.max_age代表跟踪算法允许出现的最大漏检帧数
  2. self.min_hints代表跟踪算法要求的最低连续匹配帧数
  3. self.trackers代表跟踪算法维持的目标集合(已生成track-id)
  4. update(self, dets)代表跟踪函数,其中参数dets代表t+1帧中目标检测结果list[[left, top, right, bottom, score]...],即t+1帧中待匹配的detections
  5. associate_detections_to_trackers(...) 代表IOU+卡尔曼滤波匹配算法,返回上面提到的matched_tracksunmatched_tracksunmatched_detections三个值
  6. time_since_update代表目标当前漏检帧数
  7. hit_streak代表目标当前连续匹配帧数

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

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

相关文章

Python边缘检测之prewitt, sobel, laplace算子

文章目录 滤波算子简介具体实现测试 滤波算子简介 ndimage中提供了卷积算法&#xff0c;并且建立在卷积之上&#xff0c;提供了三种边缘检测的滤波方案&#xff1a;prewitt, sobel以及laplace。 在convolve中列举了一个用于边缘检测的滤波算子&#xff0c;统一维度后&#xf…

3.微服务项目实战---Nacos Discovery--服务治理

3.1 服务治理介绍 先来思考一个问题 通过上一章的操作&#xff0c;我们已经可以实现微服务之间的调用。但是我们把服务提供者的网络地址 &#xff08; ip &#xff0c;端口&#xff09;等硬编码到了代码中&#xff0c;这种做法存在许多问题&#xff1a; 一旦服务提供者地址…

精进云原生 - Dubbo 3.2 正式发布

作者&#xff1a;Dubbo 社区 我们非常高兴地宣布&#xff0c;Dubbo 3.2 已经正式发布了&#xff01;这个版本带来了许多新功能和改进&#xff0c;这也是 Dubbo 在面对云原生化的当下的一次重要的尝试。 背景介绍 Apache Dubbo 是一款 RPC 服务开发框架&#xff0c;用于解决微…

虹科分享 | 如何主动保护个人信息 | 网络安全评级

网上报税和支付越来越流行&#xff0c;针对毫无防备的纳税人的税务欺诈也越来越频繁。以下是一些需要避免的常见网上税务骗局&#xff1a; 网络钓鱼诈骗 骗子利用电子邮件、短信或电话伪装成相关机构或报税软件提供商&#xff0c;诱骗人们提供他们的个人信息&#xff0c;或点击…

【云计算•云原生】1.什么是云计算?它为什么这么火?

文章目录 1.云计算基础什么是云计算云计算的分类开源软件、自由软件、免费软件 2.云计算机制云基础设施机制云管理机制云安全机制基本云架构 3.虚拟化技术服务器虚拟化服务器虚拟化技术CPU虚拟化内存虚拟化设备和I/O虚拟化存储虚拟化网络虚拟化桌面虚拟化 KVM 4.网络与存储基础…

实测有效!手把手带你将 Docker Image 体积减少 90%

Docker Image 体积越大,那部署要花的时间就越长;假如每个版本都有好几 GB,那并不是一个理想的状态;因此笔者开始动手实作,想看看到底能将 Docker Image 的体积缩小多少! 大纲 ㄧ、先初始化一个简易的 Node.js 专案 二、撰写 Dockefile,了解优化前体积有多大 三、使用 No…

通信算法之145:OFDM系统频偏(IFO/FFO)对频域信号影响

carrier frequency offset 1. 整数倍频偏IFO&#xff0c;频域数据相对发送端的数据出现了循环移位&#xff0c;子载波仍然正交。 2.小数倍频偏FFO&#xff0c;频域数据幅度和相位都发生变化&#xff0c;引入了ICI。 无频偏正常星座图 代码&#xff1a;待补充 读者1/2:

2023.4.23第五十次周报

目录 前言 文献阅读&#xff1a;基于ARIMA-WOA-LSTM模型的空气污染物预测 背景 ARIMA-WOA-LSTM模型 思路 主要贡献 积分移动平均自回归 &#xff08;ARIMA&#xff09; 鲸鱼优化算法 搜索超参数 CEEMDAN 结论 LSTM-Kriging 主要目标 理论猜想 问1&#xff1a…

Opencv+Python笔记(九)模板匹配

模板匹配 模板匹配常用于对象检测&#xff0c;且实现简单计算效率高。但如果输入图像中存在变化因素如旋转、缩放、视角变化等&#xff0c;模板匹配很容易失效 模板匹配原理&#xff1a; 1.匹配方式为模板 (a * b) 在原图像 (m * n) 上滑动 使用参数method中指定的方法&#…

IJKPLAYER源码分析-常用API

前言 本文简要介绍IJKPLAYER的几个常用API&#xff0c;以API使用的角度&#xff0c;来审视其内部运作原理。这里以iOS端直播API调用切入。 调用流程 init 创建播放器实例后&#xff0c;会先调用init方法进行初始化&#xff1a; - (IJKFFMediaPlayer *)init {self [super ini…

ChatGLM-6B 中文对话模型复现、调用模块、微调及部署实现(更新中)

ChatGLM-6B-PT 一、前言 近期&#xff0c;清华开源了其中文对话大模型的小参数量版本 ChatGLM-6B&#xff08;GitHub地址&#xff1a;https://github.com/THUDM/ChatGLM-6B&#xff09;。其不仅可以单卡部署在个人电脑上&#xff0c;甚至 INT4 量化还可以最低部署到 6G 显存的…

SLAM论文速递【SLAM—— RDS-SLAM:基于语义分割方法的实时动态SLAM—4.24(1)

论文信息 题目&#xff1a; RDS-SLAM:Real-Time Dynamic SLAM Using Semantic Segmentation Methods RDS-SLAM:基于语义分割方法的实时动态SLAM论文地址&#xff1a; https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber9318990发表期刊&#xff1a; IEEE Access ( Volum…

新手必看!ChatGPT常见问题总整理,你遇到了几个?

随着ChatGPT火爆全球,使用人数以指数型成长,许多使用上的问题呈现在网路上。 今天这篇文章会用实作的方式带大家了解ChatGPT有哪些常见问题,以此减少踩坑的机会。 并用简单的示例让大家感受GPT-3.5与GPT-4的能力差异,希望对大家有所帮助。 大家会有这些问题,其实就是希望…

SequoiaDB分布式数据库2023.3月刊

本月看点速览 赋能行业&#xff0c;参编《分布式数据库金融应用发展报告》 脱颖而出&#xff0c;入选2022专精特新黑马大赛年度十强 激烈角逐&#xff0c;成功晋级全国信创优秀解决方案决赛 新穗新彩&#xff0c;多家权威媒体走进巨杉 青杉计划2023持续进行&#xff0c;一起…

从源码全面解析 ArrayBlockingQueue 的来龙去脉

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…

安卓手机(微信小程序)抓蓝牙通信数据包

前言 因为公司需要......所以我就弄了一下,参考了很多别人的文章。 成果:它可以抓取微信小程序、安卓APP的蓝牙数据通信包。 开始 我是小米手机,所以我以我自己手机为例 通信过程操作 第一步 打开开发者选项,打开蓝牙调试日志和蓝牙数据包日志开关(如果两者只有其中…

MAVEN环境变量配置(Windows 11)

1、直接在搜索框中搜&#xff1a;编辑系统环境变量 2、点击环境变量 3、 在系统变量里面新建系统变量 变量名&#xff1a;MAVEN_HOME 变量值&#xff1a;路径一定要写到maven的bin目录下 以下这种写法是错误的 4、新建系统变量完成 5、 往下滑 找到path&#xff0c;可以双击…

什么是gpt一4-如何用上gpt-4

怎么使用gpt-4 目前GPT-4还未正式发布或公开&#xff0c;因此也没有详细的对接说明。但是我们可以根据GPT-4的前身GPT-3的应用经验&#xff0c;以及GPT-4的预期功能推测一些可能的使用步骤&#xff1a; 选择适合的GPT-4实现技术&#xff1a;GPT-4可能有不同的实现技术&#xff…

Opencv+Python笔记(八)轮廓检测

目录 一、轮廓的检测和绘制1.读入图像2.将读入图像转化为灰度图3.对灰度图进行二值化 [图像的阈值化处理](https://blog.csdn.net/Ggs5s_/article/details/130301816?spm1001.2014.3001.5501)4.进行轮廓检测5.在原图中显示轮廓 二、轮廓层级关系1.RET_LIST2.RETR_EXTERNAL3. R…

慈航公益·高莞乡情行

2023年4月9日&#xff0c;慈航公益高莞乡情行---高村陈屋第二届“敬老睦宗情暖乡土”活动日暨“英华教育奖学基金”成立大会在高村陈屋如期举行。 高村陈屋位于河源市连平县境内&#xff0c;为了赶上10点开始的活动&#xff0c;清晨六点半&#xff0c;志愿者们便从慈航出发&am…