【问题标题】:OpenCV imshow window cannot be reused when called within a thread在线程内调用时,OpenCV imshow 窗口不能被重用
【发布时间】:2014-11-20 06:21:02
【问题描述】:

在单独的 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

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

【问题讨论】:

  • 试试 cv2.namedWindow("cam");在使用 imshow 之前
  • 在主程序和线程中都试过了,不幸的是没有帮助。
  • 您可以尝试将cv2.waitKey(1) 增加到cv2.waitKey(100)。我记得像 cvStartGuiThread 这样的东西,可能需要从主线程(C-Api)调用一次,但不确定正确的名称,也不确定它是否有帮助。
  • 它是cv2.startWindowThread()。但不确定它实际上有什么好处:D
  • 不,都没有用:(

标签: python multithreading opencv


【解决方案1】:

我没有找到保留对命名窗口的引用的方法,但是如果窗口被销毁,则可以在每次调用线程时重用它。我只是在线程函数的末尾添加了cv2.destroyAllWindows(),它就起作用了。很想知道究竟是为什么。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    相关资源
    最近更新 更多