Python OpenCV streaming from camera - multithreading, timestamps

后端 未结 1 2014
轻奢々
轻奢々 2020-11-22 13:26

I ran simple python script on RasbpberryPI 3. This script is resposible to open video device and stream data (800x600) to HTTP endpoint using MJPEG. When I recive this strea

相关标签:
1条回答
  • 2020-11-22 14:07

    Using threading to handle I/O heavy operations (such as reading frames from a webcam) is a classic programming model. Since accessing the webcam/camera using cv2.VideoCapture().read() is a blocking operation, our main program is stalled until the frame is read from the camera device and returned to our script. Essentially the idea is to spawn another thread to handle grabbing the frames in parallel instead of relying on a single thread (our 'main' thread) to grab the frames in sequential order. This will allow frames to be continuously read from the I/O thread, while our root thread processes the current frame. Once the root thread finishes processing its frame, it simply needs to grab the current frame from the I/O thread without having to wait for blocking I/O operations.

    Thus we can improve performance by creating a new thread that does nothing but poll for new frames while our main thread handles processing the current frame. For an implementation to handle multiple camera streams, take a look at capture multiple camera streams with OpenCV

    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
    
    0 讨论(0)
提交回复
热议问题