赞
踩
import cv2 import json from collections import defaultdict from collections import deque from pynput import keyboard frame_objects = defaultdict(list) frame_buffer = deque(maxlen=300) queue_index = -1 load_new_frame = True frame_index = -1 def read_log_file(log_file_path): global frame_objects with open(log_file_path, 'r') as f: for line in f: data = json.loads(line) frame_index = int(data["imagePath"]) shapes = data["shapes"] frame_objects[frame_index] = shapes def on_press(key): global queue_index, load_new_frame if key == keyboard.Key.right or key == keyboard.Key.down or key == keyboard.Key.space: # Right arrow key, Down arrow key, Space if queue_index < len(frame_buffer) - 1: queue_index += 1 else: load_new_frame = True elif key == keyboard.Key.left or key == keyboard.Key.up: # Left arrow key, Up arrow key if queue_index > 0: queue_index -= 1 load_new_frame = False elif str(key) == "'q'": # Press 'q' to exit return False def play_video_with_annotation(log_file_path, video_file_path): global frame_objects, frame_buffer, queue_index, load_new_frame, frame_index read_log_file(log_file_path) cap = cv2.VideoCapture(video_file_path) # 启动键盘监听器 listener = keyboard.Listener(on_press=on_press) listener.start() while cap.isOpened(): if load_new_frame: ret, frame = cap.read() if not ret: print('video end') break frame_index += 1 cv2.putText(frame, str(frame_index), (20, 70), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2) frame_buffer.append(frame) queue_index = len(frame_buffer) - 1 load_new_frame = False if len(frame_buffer) > 0: view_index = frame_index - len(frame_buffer) + queue_index + 1 imshow = frame_buffer[queue_index] if max(imshow.shape[:2]) > 1280: imshow = cv2.resize(imshow, (1280, 720)) if view_index in frame_objects: shapes = frame_objects[view_index] for shape in shapes: label = shape.get("label", "") points = shape.get("points") if points: cv2.rectangle(imshow, tuple(points[0]), tuple(points[1]), (0, 255, 0), 2) cv2.putText(imshow, label, (points[0][0], points[0][1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2) cv2.imshow('Video', imshow) key = cv2.waitKey(1) if key == ord('q'): break cap.release() cv2.destroyAllWindows() def main(): log_file_path = r'D:\GZ_renti\output.log' video_file_path = r'D:\GZ_renti\output.mp4' play_video_with_annotation(log_file_path, video_file_path) if __name__ == "__main__": main()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。