在线程内调用时,OpenCV imshow窗口无法重用

时间:2014-11-18 23:55:32

标签: python multithreading opencv

在单独的python线程中运行时,我在使用cv2 imshow时遇到了麻烦。

以下代码适用于start_cam的第一次调用,但第二次调用失败 - cv2相机窗口不再出现。这似乎与线程有关,阻止该窗口被重用,因为:

如果给cv2窗口一个随机名称,那么它无限期地工作,虽然窗口没有被重用,因为每个窗口当然是新的。

如果在没有线程化的情况下调用_cam_loop(),它也可以工作,并且可以无限期地重复使用相同的窗口。

def start_cam(self):
    self.cam_live = True
    threading.Thread(target = self._cam_loop).start()

def stop_cam(self):
    self.cam_live = False

def _cam_loop(self):
    while self.cam_live:
        img = self.cam.get_image()
        cv2.imshow("cam", img)
        cv2.waitKey(1)

self.start_cam()   # live image window appears
self.stop_cam()    # image window disappears (as thread is killed)
self.start_cam()   # window fails to reappear

线程完成后窗口消失。有没有办法在线程完成后保持对窗口的引用?

1 个答案:

答案 0 :(得分:0)

我没有找到保持对命名窗口的引用的方法,但是如果窗口被销毁,则每次调用线程时都可以重用它。我只是将cv2.destroyAllWindows()添加到线程函数的末尾并且它有效。很想知道为什么。

def _cam_loop(self):
    while self.cam_live:
        img = self.cam.get_image()
        cv2.imshow("cam", img)
        cv2.waitKey(1)
        cv2.destroyAllWindows()