我正在从相机读取图像数据,并尝试使用openCV2显示它。
我的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)
我不确定这段代码是否足以发现错误。如果您需要,我可以发布更多信息。
谢谢!