cv2.imshow仅在第一个循环内有效

时间:2020-01-16 10:07:06

标签: python-3.x opencv

我正在从相机读取图像数据,并尝试使用openCV2显示它。
我的GUI执行以下操作:

  • 带有两个按钮的GUI:连接到摄像机并开始实时图像显示(在单独的线程中这样做)
  • 停止按钮以停止实时图像,加入线程并退出摄像头连接

不幸的是,只有第一次单击该按钮时,才会显示实际的“实时视频”(超过24fps)。此后,尽管未显示任何错误,但单击“开始”按钮后没有任何反应(即没有窗口打开,甚至没有一个空窗口或带有旧图像数据)。
我到目前为止所做的:

  • 检查程序是否正在通过所有必要步骤运行-确实如此!
  • 尝试从硬盘驱动器显示图像(并在显示图像之前立即调用它)-相同的行为
  • 尝试在不使用多线程的情况下显示图像-它可以工作!

这使我得出结论,cv2.imshow(...)和多线程技术必定存在一些问题。您有什么想法,这可能是什么问题?

以下是GUI的代码段(不包括.pack):

startLiveBtn = tk.Button(self, text = "start Live image", command = self.cam.startLiveImg)
stopBtn = tk.Button(self, text = "stop live img", command = self.cam.stopLiveImg)

实时图像显示的开始和结束:

def showLiveImg(self):
    while self.do_run:
        self.extractImg()
        self.showImg()
        if cv2.waitKey(1) & 0xFF == ord('q'):
            self.stopLiveImg()

def startLiveImg(self):
    self.do_run = True
    self.live_img_thread = threading.Thread(target = self.doLive, daemon = True)
    self.live_img_thread.start()

def stopLiveImg(self):
    self.do_run = False
    try:
        self.live_img_thread.join()
    except:
        print("could not join thread, assume you pressed q")
    self.freeImgMem()
    self.exitCam()

从摄像机获取数据并将其显示在openCV窗口中:

def extractImg(self):
    self.array = ueye.get_data(self.pcImageMemory, self.width, self.height, self.nBitsPerPixel, self.pitch, copy=False)
    self.frame = np.reshape(self.array,(self.height.value, self.width.value, self.bytes_per_pixel))
    self.frame = cv2.resize(self.frame, (0, 0), fx = self.windowSize, fy = self.windowSize)

def showImg(self):
    cv2.imshow("ueye camera", self.frame)

我不确定这段代码是否足以发现错误。如果您需要,我可以发布更多信息。

谢谢!

0 个答案:

没有答案