传统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库,包括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()
总结
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()
代码地址:多目标追踪