完整代码脚本如下:
from collections import defaultdict
import cv2
import numpy as np
from ultralytics import YOLO
# 加载YOLOv8模型
model = YOLO('yolov8x.pt')
# 打开视频文件
video_path = 0
cap = cv2.VideoCapture(video_path)
# 存储追踪历史和未检测到的连续帧数
track_history = defaultdict(lambda: {'track': [], 'missed_frames': 0})
max_missed_frames = 5 # 设置最大允许连续未检测到的帧数
# 循环遍历视频帧
while cap.isOpened():
# 从视频读取一帧
success, frame = cap.read()
if not success:
print("无法读取视频帧,可能已到达视频末尾或视频文件损坏。")
break
# 在帧上运行YOLOv8追踪,持续追踪帧间的物体
results = model.track(frame, persist=True)
# 获取框和追踪ID
if results[0].boxes.id is not None:
boxes = results[0].boxes.xywh.cpu()
track_ids = results[0].boxes.id.int().cpu().tolist()
else:
boxes = []
track_ids = []
# 维护一个活跃目标集合
active_track_ids = set(track_ids) # 当前帧中的活跃目标ID
# 更新活跃目标的历史记录,并重置未检测到的帧数
for box, track_id in zip(boxes, track_ids):