使用Python高效捕获并处理最新的视频帧

问题描述 投票:0回答:0

我正在使用Python开发一个实时视频处理应用程序。我的目标是连续捕获视频帧,对其进行处理,并忽略处理期间捕获的帧,确保在每次处理任务之后,我始终处理最新的帧。

我当前的解决方案使用 OpenCV VideoCapture API 与多线程相结合。一个线程负责捕获帧,而另一个线程则处理它们。这是我的代码的简化版本:

import cv2
import threading

class FrameProcessor:
    def __init__(self):
        self.current_frame = None
        self.capture_flag = False

    def update_frame(self, cap):
        while self.capture_flag:
            ret, frame = cap.read()
            if ret:
                self.current_frame = frame

    def process_frame(self):
        while self.capture_flag:
            if self.current_frame is not None:
                # frame processing happens here
                pass

cap = cv2.VideoCapture(url)
processor = FrameProcessor()

threading.Thread(target=processor.update_frame, args=(cap,), daemon=True).start()
threading.Thread(target=processor.process_frame, daemon=True).start()

但是,该解决方案似乎维护了帧缓冲区,并且不能确保处理的帧始终是最新的帧,从而导致处理过程中潜在的延迟或不准确。

我不需要处理每一帧 - 只需处理处理时可用的最新一帧即可。如果在每个处理任务之间丢失帧,这在我的场景中是可以接受的。

我考虑过使用 set(cv2.CAP_PROP_BUFFERSIZE, 1),但这并没有解决问题,可能是因为我的相机或底层操作系统不支持它。

是否有任何替代解决方案或库可以更好地满足我的需求?我是否应该考虑使用不同的方法,例如异步或多处理?任何建议将不胜感激。

谢谢你。

python multithreading opencv real-time video-processing
© www.soinside.com 2019 - 2024. All rights reserved.