Я читаю данные изображения с камеры и пытаюсь отобразить их с помощью openCV2.
My GUI выполняет следующие действия:
- GUI с двумя кнопками: подключается к камере и запускает отображение живого изображения (в отдельном потоке)
- кнопка остановки, чтобы остановить живое изображение, присоединиться к потоку и выйти из соединения с камерой
К сожалению, только при первом нажатии кнопки отображается фактическое «живое видео» (более 24 кадров в секунду). После этого при нажатии кнопки «Пуск» ничего не происходит (т. Е. Не открывается ни одно окно, даже пустое или со старыми данными изображения), хотя ошибки не отображаются.
То, что я сделал до сих пор:
- проверка, выполняет ли программа все необходимые шаги - она делает!
- пытается отобразить изображение с жесткого диска (и вызывая его прямо перед отображением) - такое же поведение
- пытается отобразить изображения без многопоточности - это работает!
Это приводит меня к выводу, что должно быть какое-то проблема с 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)
Я не уверен, что этого кода достаточно, чтобы найти ошибку. Я могу опубликовать больше, если вам нужно.
Спасибо!