Python 多视频捕获流Opencv

Python 多视频捕获流Opencv,python,opencv,webcam,Python,Opencv,Webcam,我有一套四个IP摄像头,通过RTSP传输。我试图通过创建四个独立的摄影机线程来读取所有四个摄影机,这些线程不断地从流中读取,然后显示在OpenCV窗口中。但到目前为止,我只能读取一张图像,而不会显示在窗口上。代码如下: import cv2 import threading class CameraThread(threading.Thread): def __init__(self, address, camera_id): super(CameraThread,

我有一套四个IP摄像头,通过RTSP传输。我试图通过创建四个独立的摄影机线程来读取所有四个摄影机,这些线程不断地从流中读取,然后显示在OpenCV窗口中。但到目前为止,我只能读取一张图像,而不会显示在窗口上。代码如下:

import cv2
import threading


class CameraThread(threading.Thread):
    def __init__(self, address, camera_id):
        super(CameraThread, self).__init__()
        self.camid = camera_id
        self.addr  = address
        self.cap   = cv2.VideoCapture(self.addr)
        self.win   = f'Camera {self.camid}'
        cv2.namedWindow(self.win, cv2.WINDOW_NORMAL)

    def show(self, im):
        cv2.imshow(self.win, im)
        key = cv2.waitKey(1)

        if key == ord('q'):
            self.finish()

    def finish(self):
        self.cap.release()
        cv2.destroyWindow(self.win)

    def capture(self):
        if self.cap.isOpened():
            ok, im = self.cap.read()
            print('captured')

        while True:
            #cv2.imshow(self.win, im)
            ok, im = self.cap.read()
            print('capped')
            self.show(im)

            if not ok:
                break

        print('done')
        self.finish()

    def run(self):
        self.capture()


def main():
    url = 'rtsp://user:pwd@host:port/defaultPrimary-2?streamType=u'

    t0 = CameraThread(url, '0')
    t0.start()

if __name__ == '__main__':
    main()
这段代码几乎是一字不差的

我尝试过不使用线程,我可以得到一个单独的视频流和显示。我还认为opencvgui可能不起作用,因为我正在主线程之外更新GUI


是否有人知道为什么这样做不起作用,并对更好的方法提出建议?

您想在4个不同的窗口或一个窗口中显示线程?我建议将用于捕获视频帧的代码与用于显示捕获帧的代码分开。我还注意到在第二条打印语句之前:您没有使用
self
关键字访问类variabls。是不是应该是self.cap.read()?@JoshSharkey才真正起作用。好主意。你能在回答中解释一下为什么吗?当然,你指的是哪一个建议?差不多。它现在至少进入了循环,但它仍然不会显示,而且imshow正在阻塞,所以我只得到两张图像。我认为最好制作一个环形缓冲区,并在主线程中进行显示。对吗?