python - OpenCV imshow 窗口在线程内调用时不能重用

标签 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

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

最佳答案

我没有找到一种方法来保留对命名窗口的引用,但如果窗口被销毁,它可以在每次调用线程时重新使用。我只是将 cv2.destroyAllWindows() 添加到线程函数的末尾并且它起作用了。很想知道确切原因。

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

关于python - OpenCV imshow 窗口在线程内调用时不能重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27006462/

相关文章:

Python Pandas : convert a column to a string?

c# - 调用线程无法访问此对象,因为另一个线程拥有它

c - pthreads:使用多线程计算连续素数

python - OpenCV VideoCapture 可以接受类似 Python 文件的对象吗?

java - 致命异常 : main java. lang.RuntimeException

Python Regex 与第一行不匹配

python - 如何使用 read 方法在 Python 中将字符转换为行

python - 特定点的图像卷积

java - 为什么当我停止从按钮 Action 监听器播放音频时出现此错误(音频从 Thread 运行)整个代码都在里面

python - 如何通过在框架的指定区域中关联汽车质心来保持特定车道中的汽车数量