Python 多视频捕获流Opencv
我有一套四个IP摄像头,通过RTSP传输。我试图通过创建四个独立的摄影机线程来读取所有四个摄影机,这些线程不断地从流中读取,然后显示在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,
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正在阻塞,所以我只得到两张图像。我认为最好制作一个环形缓冲区,并在主线程中进行显示。对吗?