我有一组四个通过RTSP流式传输的IP摄像机。我正在尝试通过创建四个单独的摄像头线程来读取所有四个摄像头,这些线程继续从流中读取并显示在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()
该代码几乎是从this SO post开始的。
我尝试了不使用线程的方法,并且可以流式传输和显示单个视频。我还认为,也许OpenCV GUI无法正常工作,因为该工作是因为我正在主线程之外更新GUI。
有人知道为什么这行不通吗,并提出了更好的建议吗?