文章目录
- 物体跟踪
- 一、跟踪器
- 二、代码实现
- 1. 创建CSRT跟踪器实例
- 2. 打开视频文件
- 3. 主循环
- 3.1 读取每一帧
- 3.2 设置跟踪目标
- 3.3 更新跟踪器,获取对象位置
- 3.4 显示视频每一帧
- 4. 释放资源和关闭窗口
- 5. 完整代码展示
- 总结
物体跟踪
本篇我们来介绍,如何对移动的目标进行跟踪。
我们既然要对物体进行跟踪,当然要使用方法,什么方法能够对目标进行跟踪呢?
我们来介绍一下跟踪器:
一、跟踪器
CSRT跟踪器,全称为Channel and Spatial Reliability Tracker,是一种在视频序列中进行目标跟踪的算法实现。CSRT跟踪器能够实时跟踪视频中的目标对象,即使目标对象在视频序列中发生尺度变化、变形或受到遮挡,也能保持稳健的跟踪效果。
- 定义:CSRT跟踪器是一种基于判别类模型方法中的相关滤波器跟踪算法,它结合了判别相关滤波器(DCF)和通道与空间可靠性图,以提高跟踪的准确性和鲁棒性。
- 原理:CSRT跟踪器利用图像中的颜色和梯度特征,在空间和通道上进行可靠性估计。它首先通过深度卷积神经网络(CNN)提取图像特征,然后使用这些特征来训练一个分类器,该分类器能够区分目标对象和其他背景。在跟踪过程中,CSRT利用多通道特征(如颜色、纹理)和空间可靠性来提高跟踪的准确性和鲁棒性。此外,它还考虑了目标的尺度变化和变形,使得跟踪更加稳定。
二、代码实现
1. 创建CSRT跟踪器实例
import cv2
# 创建一个CSRT跟踪器实例
tracker = cv2.TrackerCSRT_create()
# 跟踪标志,默认为False
tracking = False
2. 打开视频文件
使用cv2.VideoCapture()函数打开视频文件:
cap = cv2.VideoCapture('video.wmv')
3. 主循环
3.1 读取每一帧
while True:ret, frame = cap.read() # 如果正确读取,ret为Trueif not ret:print("不能读取摄像头")breakframe = cv2.resize(frame,dsize=None,fx=0.5,fy=0.5)
3.2 设置跟踪目标
检查是否有按键被按下,如果是‘a’健,则设置跟踪标志为True,并选择ROI,然后可在视频中框选矩形区域,锁定目标:
# 检查是否有按键被按下,如果是‘a’健,则设置跟踪标志为True,并选择ROI
if cv2.waitKey(1) == ord('a'):tracking = True# 让用户在当前帧中选择一个矩形区域作为要跟踪的对象roi = cv2.selectROI('Tracking',frame,showCrosshair=False) # 是否显示十字准星# 初始化跟踪器,传入当前帧和选定的ROItracker.init(frame,roi)
3.3 更新跟踪器,获取对象位置
# 如果跟踪标志为True,则更新跟踪器
if tracking:success,box = tracker.update(frame)# 如果跟踪成功,获取对象的位置if success:x,y,w,h = [int(v) for v in box] # 确保所有坐标都是整数# 在frame上绘制矩形框以显示跟踪结果cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
3.4 显示视频每一帧
# 显示处理后的帧
cv2.imshow('Tracking',frame)
# 检查是否按下了Esc键(ASCII码27),如果按下则退出循环
if cv2.waitKey(100) == 27:break
- 展示跟踪效果:
4. 释放资源和关闭窗口
# 释放摄像头资源
cap.release()
# 关闭所有创建的窗口
cv2.destroyAllWindows()
5. 完整代码展示
import cv2
# 创建一个CSRT跟踪器实例
tracker = cv2.TrackerCSRT_create()
# 跟踪标志,默认为False
tracking = False"""-----打开默认摄像头-----"""
cap = cv2.VideoCapture('video.wmv')
while True:ret, frame = cap.read() # 如果正确读取,ret为Trueif not ret:print("不能读取摄像头")breakframe = cv2.resize(frame,dsize=None,fx=0.5,fy=0.5)# 检查是否有按键被按下,如果是‘a’健,则设置跟踪标志为True,并选择ROIif cv2.waitKey(1) == ord('a'):tracking = True# 让用户在当前帧中选择一个矩形区域作为要跟踪的对象roi = cv2.selectROI('Tracking',frame,showCrosshair=False) # 是否显示十字准星# 初始化跟踪器,传入当前帧和选定的ROItracker.init(frame,roi)# 如果跟踪标志为True,则更新跟踪器if tracking:success,box = tracker.update(frame)# 如果跟踪成功,获取对象的位置if success:x,y,w,h = [int(v) for v in box] # 确保所有坐标都是整数# 在frame上绘制矩形框以显示跟踪结果cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)# 显示处理后的帧cv2.imshow('Tracking',frame)# 检查是否按下了Esc键(ASCII码27),如果按下则退出循环if cv2.waitKey(100) == 27:break
# 释放摄像头资源
cap.release()
# 关闭所有创建的窗口
cv2.destroyAllWindows()
总结
本篇介绍了如何使用CSRT跟踪器对移动的目标进行跟踪。