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