cv2.imshow работает только в первом цикле - PullRequest
0 голосов
/ 16 января 2020

Я читаю данные изображения с камеры и пытаюсь отобразить их с помощью 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)

Я не уверен, что этого кода достаточно, чтобы найти ошибку. Я могу опубликовать больше, если вам нужно.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...