在单独的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
线程完成后窗口消失。有没有办法在线程完成后保持对窗口的引用?
答案 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()