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

传统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()

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

代码地址:多目标追踪

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【盖世汽车-注册安全分析报告】
  • 亿发:中小型制造企业数字化转型典型场景、痛点、解决方案
  • 2024 数学建模高教社杯 国赛(A题)| “板凳龙”舞龙队 | 建模秘籍文章代码思路大全
  • 理解Sigmoid激活函数原理和实现
  • 【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(二十六)
  • Kafka Broker处于高负载状态(例如消息处理量大或系统资源不足),无法及时响应消费者的请求
  • 【C++高阶】深入理解C++智能指针:掌握RAII与内存安全的利器
  • 个股场外期权怎么交易?场外期权交易流程是怎样的?
  • 【秋招笔试】9.05小米秋招改编题(算法岗)-三语言题解
  • 【Unity小技巧】URP管线遮挡高亮效果
  • 局域网一套键鼠控制两台电脑(台式机和笔记本)
  • pikachu文件包含漏洞靶场攻略
  • ansible+awx搭建
  • C++复习day05
  • 使用 POST 方法与 JSON 格式进行 HTTP 请求的最佳实践
  • 【comparator, comparable】小总结
  • 08.Android之View事件问题
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • linux学习笔记
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • 闭包,sync使用细节
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 用jQuery怎么做到前后端分离
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​马来语翻译中文去哪比较好?
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # wps必须要登录激活才能使用吗?
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (+4)2.2UML建模图
  • (Python第六天)文件处理
  • (八)Spring源码解析:Spring MVC
  • (笔记)M1使用hombrew安装qemu
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)创业家杂志:UCWEB天使第一步
  • .Net Redis的秒杀Dome和异步执行
  • .NET 读取 JSON格式的数据
  • .NET6实现破解Modbus poll点表配置文件
  • .NET的微型Web框架 Nancy
  • [AIGC] 深入浅出 Python中的`enumerate`函数
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码
  • [CQOI 2010]扑克牌
  • [Deepin] 简单使用 RustDesk 实现远程访问Deepin
  • [echarts] y轴不显示0
  • [EFI]Dell Latitude-7400电脑 Hackintosh 黑苹果efi引导文件
  • [FBCTF2019]RCEService1
  • [Go WebSocket] 多房间的聊天室(三)自动清理无人房间
  • [Google Guava] 2.1-不可变集合
  • [HJ73 计算日期到天数转换]
  • [JavaScript]_[初级]_[关于forof或者for...of循环语句的用法]
  • [LeeCode]—Wildcard Matching 通配符匹配问题