传统CV算法——基于Opencv的多目标追踪算法
创作时间:
作者:
@小白创作中心
传统CV算法——基于Opencv的多目标追踪算法
引用
CSDN
1.
https://blog.csdn.net/weixin_42917352/article/details/137895902
基于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库,包括argparse
、time
、cv2
(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()
检测模型的跟踪
检测模型使用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()
代码地址:多目标追踪
热门推荐
最佳团队锦旗如何设计
酒后闹事会承担什么法律后果
个人养老金产品也能退税,退多少?这笔钱不能错过
俄乌军队超过1000天的战斗数据对比
木槿花的芳香之谜:探究木槿花气味的成分和特点
育儿知识 | 儿童四大气质类型大解析,你家宝宝属于哪种?
2025年初级会计考试大纲解析:《经济法基础》整体结构并未发生重大变化
专家提醒:这6种食物空腹食用需谨慎
安东尼戴维斯离队背后的真相
米与千米的换算与日常生活应用探讨
星际52区抽卡系统介绍:新手必看的卡池概率攻略
加州野火带来哪些启示?气候变化加剧,需增强气候韧性与风险管理!
杠杆风险是什么意思?如何防范和应对杠杆风险?
献血有益身体健康
Excel文件创建时间查看方法详解
商业租房税谁来承担
如何手动降低笔记本电脑的性能以降低功耗
央视权威报道:美发店以"学徒"为由拒付工资被判支付二倍工资差额
凉拌挂面怎么调汁好吃
马斯克为特朗普政府裁员出新招:要么交“周报”,要么被解雇
科兴生物新冠疫苗有效率,科兴疫苗保护率是多少?
摆脱儿童肥胖,三招有效应对!
如何快速诊断和解决异常咖啡机故障问题:咖啡机无法启动、水流不畅和声音异常怎么办
《盗梦空间》:揭秘诺兰的非线性叙事艺术
萨达姆脑子有多好使?留下400亿遗产,美国只能眼睁睁的看着!
防弹材料试验方法新标与纤维增强复合材料行业
上海六所基地校探索AI教育新模式:课程开发、空间拓展与师资培育三管齐下
再植牙的四种愈合方式包括
国标GB28181视频平台EasyGBS小知识:如何确保摄像机的网络连接稳定?
探秘华为智慧:“财报六看” 如何重塑企业财务分析思维?