【发布时间】: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