我正在使用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),但这并没有解决问题,可能是因为我的相机或底层操作系统不支持它。
是否有任何替代解决方案或库可以更好地满足我的需求?我是否应该考虑使用不同的方法,例如异步或多处理?任何建议将不胜感激。
谢谢你。