代码之家  ›  专栏  ›  技术社区  ›  ailauli69

Opencv VideoWriter:如何获得与模型的实时推理具有相同“速率”的输出视频?

  •  0
  • ailauli69  · 技术社区  · 1 年前

    以下是一个代码,可以在mp4视频中“实时”了解YOLO模型的推断:

    import cv2
    from ultralytics import YOLO
    
    model = YOLO('yolov8n.pt')
    
    video_path = "path/to/your/video/file.mp4"
    cap = cv2.VideoCapture(video_path)
    
    while cap.isOpened():
        success, frame = cap.read()
        if success:
            results = model(frame)
            annotated_frame = results[0].plot()
            cv2.imshow("YOLOv8 Inference", annotated_frame)
            if cv2.waitKey(1) & 0xFF == ord("q"):
                break
        else:
            break
    cap.release()
    cv2.destroyAllWindows()
    

    当我运行上面的代码时,它会打开VLC并显示带有框等的视频。由于模型需要时间来进行预测,所以它相当滞后。

    我想要这个结果(滞后的视频),但是 已记录

    问题是,如果我这样做:

    import cv2
    from ultralytics import YOLO
    
    model = YOLO('yolov8n.pt')
    
    video_path = "path/to/your/video/file.mp4"
    cap = cv2.VideoCapture(video_path)
    
    frame_num = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    video_writer = cv2.VideoWriter('video_opencv.mp4',fourcc,30,(frame_width,frame_height))
    
    while cap.isOpened():
        success, frame = cap.read()
        if success:
            results = model(frame)
            annotated_frame = results[0].plot()
            #cv2.imshow("YOLOv8 Inference", annotated_frame)
            video_writer.write(annotated_frame)
            if cv2.waitKey(1) & 0xFF == ord("q"):
                break
        else:
            break
    cap.release()
    cv2.destroyAllWindows()
    

    这基本上是一样的,但我录制视频而不是简单地显示它,然后当我阅读视频时,它的速度和原始视频一样快(没有预测)

    我希望我是清白的。

    有什么解决办法吗?

    0 回复  |  直到 1 年前
    推荐文章