Prechádzať zdrojové kódy

feat: 新增增加保存前后100帧的视频的功能

tuantuan 2 týždňov pred
rodič
commit
c09e08e75b
1 zmenil súbory, kde vykonal 22 pridanie a 3 odobranie
  1. 22 3
      liq_demo/person_speed.py

+ 22 - 3
liq_demo/person_speed.py

@@ -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],