传统CV算法——基于Opencv的多目标追踪算法

基于 OpenCV 的跟踪算法有多种,每种算法都有其特定的应用场景和优缺点。以下是一些常见的基于 OpenCV 的目标跟踪算法:

1. BOOSTING 跟踪器

  • 描述:基于 AdaBoost 算法的跟踪器。它是一种早期的跟踪算法,使用的是基于弱分类器的强分类器方法。
  • 优点:适用于初学者,易于理解和实现。
  • 缺点:对目标的外观变化不够鲁棒,容易受到遮挡的影响。
  • 使用cv2.TrackerBoosting_create()

2. MIL (Multiple Instance Learning) 跟踪器

  • 描述:基于多实例学习的跟踪算法。通过考虑正负样本的集合来提高跟踪的鲁棒性。
  • 优点:比 BOOSTING 更鲁棒,尤其是在目标部分遮挡的情况下。
  • 缺点:计算开销较大,速度较慢。
  • 使用cv2.TrackerMIL_create()

3. KCF (Kernelized Correlation Filters) 跟踪器

  • 描述:基于核相关滤波的跟踪算法。KCF 通过使用循环结构和傅里叶变换,极大地提高了跟踪速度。
  • 优点:跟踪速度快,适合实时应用。
  • 缺点:对尺度变化不够敏感,对长时间的遮挡不鲁棒。
  • 使用cv2.TrackerKCF_create()

4. TLD (Tracking-Learning-Detection) 跟踪器

  • 描述:一种综合了跟踪、学习和检测的算法。TLD 可以检测失败,并自动重新定位目标。
  • 优点:适合处理长时间跟踪和目标重新检测。
  • 缺点:计算复杂度高,可能较慢。
  • 使用cv2.TrackerTLD_create()

5. MEDIANFLOW 跟踪器

  • 描述:基于光流的方法,通过对前后向运动估计进行检查,确保跟踪的可靠性。
  • 优点:在目标平滑运动的情况下非常可靠,对失败检测敏感。
  • 缺点:对快速运动或突然的运动变化不鲁棒。
  • 使用cv2.TrackerMedianFlow_create()

6. GOTURN 跟踪器

  • 描述:基于深度学习的目标跟踪算法。使用一个预训练的神经网络来预测目标的运动。
  • 优点:可以处理大范围的目标外观变化。
  • 缺点:需要在使用前下载预训练模型,并且依赖于模型的质量。
  • 使用cv2.TrackerGOTURN_create()

7. MOSSE (Minimum Output Sum of Squared Error) 跟踪器

  • 描述:基于相关滤波的快速跟踪算法,使用最小化输出误差平方和的滤波器。
  • 优点:速度非常快,适合实时应用,特别是在低算力设备上。
  • 缺点:对尺度变化和外观变化敏感,鲁棒性一般。
  • 使用cv2.TrackerMOSSE_create()

8. CSRT (Discriminative Correlation Filter with Channel and Spatial Reliability) 跟踪器

  • 描述:基于相关滤波器的高级跟踪算法,通过考虑通道和空间可靠性来增强跟踪效果。
  • 优点:对尺度变化和旋转更加鲁棒,跟踪精度较高。
  • 缺点:相比 KCF,速度稍慢,但在大多数情况下仍能保持实时性能。
  • 使用cv2.TrackerCSRT_create()

不同的跟踪算法各有优劣,选择合适的算法取决于应用场景和需求。例如,KCF 和 MOSSE 适合实时性要求高的应用,而 CSRT 和 GOTURN 在目标外观变化较大时表现更好。OpenCV 提供了一个易于使用的接口,可以根据实际需求轻松切换不同的跟踪算法。

基于原生的追踪

使用OpenCV库实现基于视频的对象追踪。通过以下步骤和Python代码,您将能够选择不同的追踪器,并对视频中的对象进行实时追踪。

步骤 1: 导入必要的库

首先,我们需要导入一些必要的Python库,包括argparsetimecv2 (OpenCV) 和 numpy

import argparse
import time
import cv2
import numpy as np

步骤 2: 设置参数解析

使用argparse库来解析命令行参数。我们将指定输入视频文件的路径以及选择的追踪器类型。

ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video", type=str, help="path to input video file")
ap.add_argument("-t", "--tracker", type=str, default="kcf", help="OpenCV object tracker type")
args = vars(ap.parse_args())

步骤 3: 定义支持的追踪器

在OpenCV中,有多种对象追踪器可用。我们将它们存储在一个字典中,便于后续使用。

OPENCV_OBJECT_TRACKERS = {"csrt": cv2.TrackerCSRT_create,"kcf": cv2.TrackerKCF_create,"boosting": cv2.TrackerBoosting_create,"mil": cv2.TrackerMIL_create,"tld": cv2.TrackerTLD_create,"medianflow": cv2.TrackerMedianFlow_create,"mosse": cv2.TrackerMOSSE_create
}

步骤 4: 初始化追踪器和视频流

我们初始化一个多对象追踪器并打开视频文件。

trackers = cv2.MultiTracker_create()
vs = cv2.VideoCapture(args["video"])

步骤 5: 处理视频帧

接下来,我们读取视频中的每一帧,并对其进行缩放处理,然后使用追踪器更新追踪状态,并绘制追踪的边框。

while True:frame = vs.read()frame = frame[1]if frame is None:break(h, w) = frame.shape[:2]width = 600r = width / float(w)dim = (width, int(h * r))frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)(success, boxes) = trackers.update(frame)for box in boxes:(x, y, w, h) = [int(v) for v in box]cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)cv2.imshow("Frame", frame)key = cv2.waitKey(100) & 0xFFif key == ord("s"):box = cv2.selectROI("Frame", frame, fromCenter=False, showCrosshair=True)tracker = OPENCV_OBJECT_TRACKERS[args["tracker"]]()trackers.add(tracker, frame, box)elif key == 27:break
vs.release()
cv2.destroyAllWindows()

总结

import argparse
import time
import cv2
import numpy as np# 配置参数
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video", type=str,help="path to input video file")
ap.add_argument("-t", "--tracker", type=str, default="kcf",help="OpenCV object tracker type")
args = vars(ap.parse_args())# opencv已经实现了的追踪算法OPENCV_OBJECT_TRACKERS = {"csrt": cv2.TrackerCSRT_create,"kcf": cv2.TrackerKCF_create,"boosting": cv2.TrackerBoosting_create,"mil": cv2.TrackerMIL_create,"tld": cv2.TrackerTLD_create,"medianflow": cv2.TrackerMedianFlow_create,"mosse": cv2.TrackerMOSSE_create
}# 实例化OpenCV's multi-object tracker
trackers = cv2.MultiTracker_create()
vs = cv2.VideoCapture(args["video"])# 视频流
while True:# 取当前帧frame = vs.read()# (true, data)frame = frame[1]# 到头了就结束if frame is None:break# resize每一帧(h, w) = frame.shape[:2]width=600r = width / float(w)dim = (width, int(h * r))frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)# 追踪结果(success, boxes) = trackers.update(frame)# 绘制区域for box in boxes:(x, y, w, h) = [int(v) for v in box]cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)# 显示cv2.imshow("Frame", frame)key = cv2.waitKey(100) & 0xFFif key == ord("s"):# 选择一个区域,按sbox = cv2.selectROI("Frame", frame, fromCenter=False,showCrosshair=True)# 创建一个新的追踪器tracker = OPENCV_OBJECT_TRACKERS[args["tracker"]]()trackers.add(tracker, frame, box)# 退出elif key == 27:break
vs.release()
cv2.destroyAllWindows()

通过上述步骤和代码,可以实现一个简单的视频对象追踪应用,该应用支持多种追踪算法,并允许用户实时选择和追踪视频中的对象。这种技术在许多领域都有广泛的应用,包括安全监控、人机交互和自动驾驶车辆等。

检测模型的跟踪

检测模型 使用Python、OpenCV、dlib和多进程处理视频中的实时对象跟踪。以下是具体步骤及相关代码片段:

1. 设置和参数解析

  • 导入必要的库,并设置参数解析,处理输入如视频文件路径和模型配置。
from utils import FPS
import multiprocessing
import numpy as np
import argparse
import dlib
import cv2

2. 初始化深度学习模型

  • 加载预训练的Caffe模型进行对象检测。
net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])

3. 视频流处理

  • 从指定的文件开始视频捕捉,并准备处理帧。
vs = cv2.VideoCapture(args["video"])

4. 帧处理

  • 调整帧大小并转换为RGB格式进行处理。
  • 如果检测到的对象置信度高于阈值,则初始化对象跟踪。
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

5. 对象检测和跟踪

  • 对初次检测到的对象创建跟踪器,并使用多进程处理。
p = multiprocessing.Process(target=start_tracker, args=(bb, label, rgb, iq, oq))
p.daemon = True
p.start()

6. 追踪器更新和结果输出

  • 每个跟踪器获取新的帧,更新位置并输出跟踪结果。
outputQueue.put((label, (startX, startY, endX, endY)))

7. 视频输出和显示

  • 如果指定了输出文件,将处理后的帧写入视频文件。
  • 显示处理后的帧并在用户按下ESC键时停止。
writer.write(frame)
key = cv2.waitKey(1) & 0xFF
if key == 27:break

8. 清理和资源释放

  • 停止FPS计时,释放视频文件和窗口资源。
fps.stop()
writer.release()
cv2.destroyAllWindows()
vs.release()

在这里插入图片描述
在这里插入图片描述

代码地址:多目标追踪

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

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

相关文章

【数据结构篇】~链表算法题2

链表算法题2 1.返回倒数第k个节点思路解析 2.链表的回文结构​思路解析1(空间复杂度不符合)解析2 3.相交链表​思路解析 1.返回倒数第k个节点 OJ链接 思路 有点像高中学的相对位移 利用快慢指针,开始时都指向头节点,然后让快指…

VMware虚拟机安装的Ubuntu,桥接方式静态ip,内网可以访问,ping外网不可用

1.环境说明 系统:Ubuntu 24.04 环境:VMware下桥接静态IP设置 2.问题:ping www.baidu.com报错 [~] ping www.baidu.com ping: www.baidu.com: Temporary failure in name resolutio…

php邮箱服务器怎么搭建?如何构建服务器?

php邮箱服务器配置教程指南?php邮件服务器如何搭建? 搭建一个稳定高效的php邮箱服务器,不仅可以提升邮件传输的效率,还能增强数据的安全性。那么,如何着手搭建这样一个服务器呢?AokSend将详细探讨php邮箱服…

【Go - 每日一小问 ,const 变量存储在哪里,堆还是栈上?】

答:都不是 , 在bss(未初始化数据区) 和 data(初始化数据区)上。 在内存布局上遵循一定规律,Go 进程的内存空间布局由高地址到低地址大致可分为以下几段: 栈(stack): 用户态的栈,栈的大小是固定的,其大小可以使用ulimi…

云服务器中查看Nginx报错日志及解决思路

目录 前言 一、查看nginx日志信息 二、我的解决思路 前言 线上报错不可怕,能找到对应日志,那这个报错就解决一大半了。 默认情况下,nginx日志文件存储在 /var/log/nginx/ 目录中,cd /var/log/nginx/ 一、查看nginx日志信息 …

【hot100篇-python刷题记录】【跳跃游戏 II】

R7-贪心算法 目录 方法1: 方法2: 很贪心啊,局部最优解就是全局最优解,要求到达nums[n-1]的最小步数,我们每一步都走最远。 方法1: class Solution:def jump(self, nums: List[int]) -> int:nlen(n…

畅游5G高速网络:联发科集成Wi-Fi6E与蓝牙5.2的系统级单芯片MT7922

这周末,除非外面下钞票,否则谁也拦不住我玩《黑神话悟空》(附:两款可以玩转悟空的显卡推荐) IPBrain平台君 集成电路大数据平台 2024年09月03日 17:28 北京 联发科一直以创新技术追赶市场需求…… “不努力向前游就会被海浪拍回岸边…” 芯片设计公司产品层出不穷,想要站…

vue3+ts 实现模板表格文件下载~

1、效果图&#xff1a; 2、创建点击事件&#xff0c;并发起请求&#xff0c;获取模板表格文件下载url地址。 //组件 <a-button class"btn btn_width" click"download"> 下载模板 </a-button>// 文件模板下载 import { getTemplate } from /ap…

Linux【1】基础

目录 cd ​编辑 Linux的粘贴是Ctrlshiftv&#xff0c;复制、剪切&#xff1a; pwd打印当前路径 cat 文件目录 读取 ↑ 可以调取之间输过的命令 mv A B 把文件名A改成B #掐头%去尾 touch 文件名 mkdir创建目录​编辑 删除rm 只能删除文件 终端命令格式 帮助 man命…

RK3588 13.0去掉SystemUI快速设置选项

Android13.0的SystemUI下拉菜单有很多快速设置选项&#xff0c;有些选项对我们设备来说是多余的&#xff0c;用户要求去掉无用的选项&#xff0c;只保留Internet Bluetooth Screen record 去掉之前&#xff1a; 去掉之后&#xff1a; 为了去掉这些快速设置选项&#xff0c;试…

大零售时代:开源 AI 智能名片、2+1 链动与 O2O 商城小程序引领融合新趋势

摘要&#xff1a;本文深入探讨了当今零售业态的发展趋势&#xff0c;指出在数据匹配的时代&#xff0c;人依然在零售中发挥着重要作用。通过对大零售理念的阐述&#xff0c;分析了跨行业跨业态融合的必然性&#xff0c;强调了业态融合的指导思想以及实现方式。同时&#xff0c;…

List 的介绍

目录 1. 什么是List 2. 常见接口介绍 3. List的使用 1. 什么是List 在集合框架中&#xff0c; List 是一个接口&#xff0c;继承自 Collection 。 Collection 也是一个接口 &#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下所示&#xff1a; Iterab…

【电源时序测量】

安捷伦示波器电源时序测量 电源时序测量可以表征电源的启动、关闭、负载瞬态响应和纹波等关键参数。 1. 时序测量工具 安捷伦示波器配备了各种时序测量工具&#xff0c;包括&#xff1a; 测量光标&#xff1a;用于手动测量时间间隔和幅度。 自动测量&#xff1a;自动测量特定…

Golang | Leetcode Golang题解之第394题字符串解码

题目&#xff1a; 题解&#xff1a; var (src stringptr int )func decodeString(s string) string {src sptr 0return getString() }func getString() string {if ptr len(src) || src[ptr] ] {return ""}cur : src[ptr]repTime : 1ret : ""if cur &…

python学习之路 - PySpark快速入门

目录 一、PySpark实战1、前言介绍2、基础准备a、pySpark库的安装b、构建pySpark执行环境入口对象c、pySpark编程模型 3、数据输入a、python数据容器转RDD对象b、读取文件内容转RDD对象 4、数据计算a、map算子b、flatMap算子c、reduceByKey算子d、综合案例e、filter算子f、disti…

Flutter修改Android包名

一、前言 我在将Android打包上传到google商店的时候提示我“com.example”已受到限制&#xff0c;请换一个软件包名称。“的错误。因此我们需要去修改flutter的Android包名。 二、操作流程 1.修改路径 android ——> app ——> src ——> debug ——> AndroidMa…

K12智慧校园云平台源码,智慧校园小程序源码,支持PC+小程序,提供丰富的API接口,支持和其他系统的融合对接

智慧校园平台是目前教育信息化领域的热点之一。随着数字化转型的加速&#xff0c;越来越多的学校开始寻求解决方案&#xff0c;以提高教育管理的效率和质量。 智慧校园电子班牌系统是一种集成信息化技术、物联网、智能化的教育管理解决方案&#xff0c;它在校园内实现了信息共…

信捷 XD PLC 双精度浮点数的初始化及传输

在用信捷XDH PLC进行运动控制时&#xff0c;加减速时间是个64位的双精度的浮点数&#xff0c;那么如果不在人机界面写到PLC&#xff0c;PLC自身也是可以初始化的&#xff0c;比如0.005,怎么办呢。 用FLT指令把 整数出单精度浮点数&#xff0c;然后EDIV指令把两个单精度浮点数相…

冲击大厂算法面试=>链表专题【链表反转之局部反转升级版】

目录标题 多重局部反转之K 个一组翻转链表上代码题解呀实在不会的时候记住 多重局部反转之K 个一组翻转链表 上代码 整个函数通过不断地检查剩余节点数量和进行局部反转&#xff0c;实现了链表的分组反转&#xff0c;最后返回反转后的链表。这种方法有效地利用了额外的 pre 和…

idea插件【1】Smart Tomcat

一、简介 在开发过程中除了springboot项目支持jar运行&#xff0c;很多场景下需要使用到tomcat外置服务部署&#xff0c;此时我们可以使用idea插件Smart Tomcat &#xff08;Smart Tomcat 插件是一个用于简化与 Tomcat 服务器交互的工具&#xff0c;它提供了一些额外的功能来增…