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

news2024/12/23 18:16:00

基于 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 = 600
    r = 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) & 0xFF
    if 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=600
	r = 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) & 0xFF

	if key == ord("s"):
		# 选择一个区域,按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()

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

检测模型的跟踪

检测模型 使用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.coloradmin.cn/o/2103508.html

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

相关文章

归并、计数排序(画图详解)

归并排序: 基本思想:先递归再回归,在回归的时候进行归并排序 归并排序: 适用于两个有序数组,合并成一个数组的时候,也就是先要递归,递归到最后就相当于一个元素,一个元素就是有序的。…

Unity数据持久化 之 二进制存储法

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ 前置知识:1 Byte 8 bit ,所以0000 00001 就是一个字节, 该串数字转为十进制代表1…

通过cmd命令的方式转码MP4为webp动图。附带命令解释。

zihao 通过cmd命令的方式转码MP4为webp动图: 均衡大小和z效果的配置(直接拷贝后需要改下路径): ffmpeg -i E:\steam\222.mp4 -vcodec libwebp -filter:v fpsfps24 -lossless 0 -compression_level 5 -q:v 35 -loop 1 -preset def…

深入浅出Promise,循序渐进掌握JavaScript异步编程

一. Promise基本用法 Promise 是 JavaScript 中处理异步操作的一种方式。它是一个对象,代表了一个异步操作的最终完成或失败的结果。 Promise 有三种状态: pending (进行中)、 fulfilled (已成功) 和 rej…

如何在SQL Server中恢复多个数据库?

一次性恢复多个 SQL数据库吗可以吗? "是的,可以一次性恢复多个 SQL 数据库。通常情况下,只要备份文件的名称与相应的数据库匹配,且没有附加的日期或时间信息,就可以通过有效的 T-SQL 脚本来完成恢复。如果你希望…

虚幻引擎VR游戏开发03| 键位映射

Enhanced input mapping 按键映射 在虚幻引擎(Unreal Engine)中,Enhanced Input Mapping 是一个用于管理和处理输入(例如键盘、鼠标、手柄等)的系统。它提供了一种更灵活、更强大的方式来定义和响应用户输入&#xff…

MMO移动同步(1)

多个客户端同时连入游戏 这篇会从以下五个部分讲解: 同步的基本概念 完善角色进入及离开处理 CharacterManager(C/S) EntityManager(C/S) 打包运行Win客户端 同步基本概念 同步:角色信息,位置,状态同步;客户端和…

神仙公司名单(北京篇)

欢迎来到小落科技每日分享频道 大家好,秋招已经火热进行中了,不知道大家准备得怎么样了?特别是咱们25届的小伙伴们,有没有找到心仪的目标? 想必大家最近和我一样,忙着在各种招聘平台上搜罗信息&#xff0c…

如何在 Cursor 中使用驭码CodeRider?

驭码CodeRider 是极狐GitLab 公司自研发布的 AIGC 产品,可以用来进行 AI 编程和 DevOps 流程处理。本文分享如何在 Cursor 中使用驭码CodeRider。 Cursor 是近期比较火爆的一款 AI 代码编辑器,通过将 AI 能力引入软件研发来提升软件研发效率。而驭码Cod…

水凝胶透镜是什么?能用来干啥?

大家好,今天我们来了解一项关于蛋白质驱动的水凝胶透镜的研究——《Toward Tunable Protein‐Driven Hydrogel Lens》发表于《Advanced Science》。我们的眼睛晶状体主要由蛋白质构成,在视觉中起重要作用。但人造光学系统要实现类似功能却不容易。近年来…

【设计文档】数据库设计说明书(Word实际项目案例参考)

一、 总述 (一) 编写目的 二、 外部设计 (一) 环境说明 (二) 指导 三、 物理实现 (一) 物理结构 (二) 安全设计 四、 表设计结构 (一&am…

【软件文档】软件系统试运行方案、试运行报告(Word项目实际原件)

一、 试运行目的 (一) 系统功能、性能与稳定性考核 (二) 系统在各种环境和工况条件下的工作稳定性和可靠性 (三) 检验系统实际应用效果和应用功能的完善 (四) 健全系统运行管理体制&…

【数字人】Facevid2vid:用于视频会议的一次性自由视图说话头合成

论文:https://arxiv.org/pdf/2011.15126 github:GitHub - zhanglonghao1992/One-Shot_Free-View_Neural_Talking_Head_Synthesis: Pytorch implementation of paper "One-Shot Free-View Neural Talking-Head Synthesis for Video Conferencing" 一种新颖…

ip地址的管理方法有哪些?是什么

IP地址的管理方法有哪些?随着互联网的快速发展,‌IP地址作为网络设备的唯一标识,‌其管理显得尤为重要。‌有效的IP地址管理不仅可以确保网络的稳定运行,‌还能提高网络资源的利用率。‌本文将深入探讨IP地址的管理方法&#xff0…

网银U盾:财务眼中钉,会计肉中刺!

随着网银U盾的广泛应用,虽然使得财务安全有了大幅提升,但企业财务管理效率却越来越低了。 近期,我们发现,高达85%的企业在采购我们的USB Server时,都是出于网银U盾反复插拔的繁琐、效率低下、管理困难等原因。 想象一…

sqli-labs靶场通关攻略(五十一到六十关)

sqli-labs-master靶场第五十一关 步骤一,尝试输入?sort1 我们发现这关可以报错注入 步骤二,爆库名 ?sort1 and updatexml(1,concat(0x7e,database(),0x7e),1)-- 步骤三,爆表名 ?sort1 and updatexml(1,concat(0x7e,(select group_conc…

CentOS 7 docker 部署遇到内网通,外网不通 问题

CentOS 7 docker 部署遇到内网通,外网不通 问题 [rootlocalhost ~]# systemctl status network ● network.service - LSB: Bring up/down networkingLoaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled)Active: failed (Result: exit-code) …

多角度解读WMS:探寻仓库管理系统的核心功能

多角度解读 WMS 仓库管理系统 1. 概述 WMS 在数字化工厂中具有举足轻重的地位,它不仅提高了仓储管理的效率与准确性,还能优化整个供应链的管理,支持灵活生产模式,并提供决策支持的关键数据。通过现代前后端技术的架构设计&#xf…

几十块的麦克风能用吗?一文看懂哪个牌子的麦克风好

无论是拍摄短视频、直播还是采访,说一款好的音频设备是非常重要的,它决定了音频质量的高低,如今市面上的麦克风种类也是各式各样的都有,价格上也是参差不齐,有些小伙伴问“几十块的麦克风能用吗”? 我觉得最…

Docker部署项目时的服务端口设置——给容器添加新端口映射

Docker给容器添加新端口映射 1 Docker安装Ubuntu22.042 创建新容器3 给容器添加端口映射3.1 查看运行的容器3.2 查看容器挂载目录3.3 停止容器3.4 停止docker服务3.5 进入容器挂载目录3.6 修改config.v2.json文件3.7 修改hostconfig.json文件3.8 启动docker3.9 启动容器 4 端口…