|
@@ -14,8 +14,9 @@ video_path = r"E:\desktop_file\速度标定\run.mp4"
|
|
|
cap = cv2.VideoCapture(video_path)
|
|
|
|
|
|
# 存储最近的200帧用于回溯
|
|
|
-frame_buffer = deque(maxlen=200) # 新增帧缓冲区
|
|
|
-
|
|
|
+frame_buffer = deque(maxlen=100) # 新增帧缓冲区
|
|
|
+# 后续帧收集任务列表,元素格式:(pre_buffer, post_buffer, 剩余帧数, 触发时间)
|
|
|
+active_tasks = []
|
|
|
# Store the track history
|
|
|
track_history = defaultdict(lambda: [])
|
|
|
# 用于存储每个 track_id 最近的时间戳
|
|
@@ -82,7 +83,7 @@ frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
|
|
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
|
|
out = cv2.VideoWriter(output_file, fourcc, fps, (frame_width, frame_height))
|
|
|
|
|
|
-speed_threshold = 30 # 速度阈值
|
|
|
+speed_threshold = 20 # 速度阈值
|
|
|
high_velocity_count_threshold = 20 # 高速度计数阈值
|
|
|
|
|
|
# Loop through the video frames
|
|
@@ -97,6 +98,18 @@ while cap.isOpened():
|
|
|
# 将当前帧加入缓冲区(深拷贝避免覆盖)
|
|
|
frame_buffer.append(frame.copy()) # 新增
|
|
|
|
|
|
+ # 处理后续帧收集任务
|
|
|
+ for i in reversed(range(len(active_tasks))):
|
|
|
+ pre_buffer, post_buffer, frames_left, trigger_time = active_tasks[i]
|
|
|
+ post_buffer.append(frame.copy())
|
|
|
+ frames_left -= 1
|
|
|
+ if frames_left <= 0:
|
|
|
+ combined = pre_buffer + list(post_buffer)
|
|
|
+ save_high_speed_video(combined, trigger_time)
|
|
|
+ del active_tasks[i]
|
|
|
+ else:
|
|
|
+ active_tasks[i] = (pre_buffer, post_buffer, frames_left, trigger_time)
|
|
|
+
|
|
|
# Run YOLO11 tracking on the frame, persisting tracks between frames
|
|
|
results = model.track(frame, persist=True, classes=0, conf=0.6)
|
|
|
|
|
@@ -165,6 +178,12 @@ while cap.isOpened():
|
|
|
# file_name = "high_speed_" + data_time + ".jpg"
|
|
|
# cv2.imwrite(file_name, frame)
|
|
|
|
|
|
+ # 触发保存逻辑
|
|
|
+ pre_buffer = list(frame_buffer) # 深拷贝前200帧
|
|
|
+ post_buffer = deque(maxlen=100)
|
|
|
+ trigger_time = datetime.datetime.now()
|
|
|
+ active_tasks.append((pre_buffer, post_buffer, 100, trigger_time))
|
|
|
+
|
|
|
# 新增逻辑:删除超过 speed_threshold 的瞬时速度
|
|
|
instantaneous_velocities[track_id] = deque(
|
|
|
[velocity for velocity in instantaneous_velocities[track_id] if velocity <= speed_threshold],
|