使用线程来处理I / O繁重操作(例如从网络摄像头读取帧)是一种经典的编程模型。自从使用访问网络摄像头/摄像头 cv2.VideoCapture().read() 是一个阻塞操作,我们的主程序停止,直到从相机设备读取帧并返回到我们的脚本。基本上这个想法是产生另一个线程来处理抓取框架 的 平行 强> 而不是依靠单个线程(我们的'主'线程)来抓取帧 的 顺序 强> 订购。这将允许从I / O线程连续读取帧,而我们的根线程处理当前帧。一旦根线程完成处理它的帧,它只需要从I / O线程中获取当前帧,而不必等待阻塞I / O操作。
cv2.VideoCapture().read()
因此,我们可以通过创建一个新线程来提高性能,当我们的主线程处理当前帧时,该线程除了轮询新帧之外什么都不做。
from threading import Thread import cv2, time class VideoStreamWidget(object): def __init__(self, src=0): self.capture = cv2.VideoCapture(src) # Start the thread to read frames from the video stream self.thread = Thread(target=self.update, args=()) self.thread.daemon = True self.thread.start() def update(self): # Read the next frame from the stream in a different thread while True: if self.capture.isOpened(): (self.status, self.frame) = self.capture.read() time.sleep(.01) def show_frame(self): # Display frames in main program cv2.imshow('frame', self.frame) key = cv2.waitKey(1) if key == ord('q'): self.capture.release() cv2.destroyAllWindows() exit(1) if __name__ == '__main__': video_stream_widget = VideoStreamWidget() while True: try: video_stream_widget.show_frame() except AttributeError: pass