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

传统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 = 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.kler.cn/news/293648.html

相关文章:

  • 大型视觉语言模型的有效性评估
  • [已更新问题一二python+matlab代码]2024数学建模国赛高教社杯B题:生产过程中的决策问题 思路代码文章助攻手把手保姆级
  • K8s系列之:Operator 和 Operator Framework
  • 【卡码网C++基础课 19.洗盘子】
  • 9月6号的学习
  • Java队列详细解释
  • Java题集(由入门到精通)03
  • 【区块链 + 人才服务】链学汇教育区块链平台 | FISCO BCOS应用案例
  • 国际化产品经理的挑战与机遇:跨文化产品管理的探索
  • [Unity3D]胡闹厨房复刻笔记
  • mysql笔记3(数据库、表和数据的基础操作)
  • C++——入门基础(下)
  • [C#学习笔记]注释
  • 168套Android项目源码和120多套各类别小程序模板源码
  • KADAL | Kriging代理模型Python工具箱推荐
  • StarRocks Lakehouse 快速入门——Apache Iceberg
  • 应用层协议HTTP
  • Flask中实现WebSocket需要什么组件
  • 泛微E9 Ecology9-JS应用高级进阶视频教程(重磅)
  • linux autofs配置
  • [数据集][目标检测]鲜花检测数据集VOC+YOLO格式25215张106类别
  • Oracle中关于not in的替代方案
  • kafka及异步通知文章上下架
  • Jenkins构建CI/CD
  • VSC++: 括号对称比较
  • 使用Cskin时候 遇到按钮有默认阴影问题解决
  • Java语法全解析:掌握基本规则,打造稳固编程基础!
  • 企业级Ansible自动化运维项目案例:实战与技巧
  • 集成 Logrus 到 Gin:打造高效的 Go Web 日志系统
  • 【python因果推断库10】工具变量回归与使用 pymc 验证工具变量3