QMainWindow не отвечает, когда процесс OpenCV запущен

StackOverflow https://stackoverflow.com/questions/8828679

  •  27-10-2019
  •  | 
  •  

Вопрос

Я использую собственный класс OpenCV VideoProcessor-Class в своем приложении QtGui.Мой MainWindow имеет 2 ViewerWidgets для отображения кадров ввода и вывода, созданных объектом VideoProcessor.VideoProcessor-Object принимает указатели на эти ViewerWidgets для отображения обработанных кадров в этих виджетах.

Когда я запускаю приложение, все в графическом интерфейсе пользователя реагирует на ввод пользователя.Но когда я запускаю Обработку, он перестает отвечать.Я даже не могу закрыть окно или выбрать что-нибудь в меню приложения.Обработка показывает правильный результат и продолжает работать, но окно больше не отвечает.

Это слот MainWindow, который запускает обработку:

родовое слово

А это Видеопроцессор.Файл взят из Поваренной книги OpenCV, и я изменил его, чтобы он использовал указатели на мои ViewerWidgets в функции run () в конце приведенного ниже кода.

родовое слово
Это было полезно?

Решение

Хотя я не мог понять, в чем была конкретная причина моей проблемы, я наконец нашел решение, которое работает для меня:

Как вы предложили, я избавился от этого класса VideoProcessor-Utility и реализовал Processing-Loop для обработки последовательностей кадров внутри MainWindow, используя QTimer для задержки между каждым кадром.

Вместо VideoProcessor-Class я сделал ProcessorWidget. Этот виджет GUI предоставляет все элементы управления вводом для параметризации каждой функции процессора, которую я реализовал до сих пор.

Весь код OpenCV теперь находится в классе ProcessorWidget, и у него есть общедоступный слот процесса cv :: Mat (ввод cv :: Mat), который просто принимает кадр ввода, а затем анализирует все параметры ввода пользователя из Графический интерфейс пользователя и внутренне обрабатывает выбор нужного процессора и параметров.

MainWindow теперь создает ViewerWidgets и ProcessorWidget и владеет элементами управления и времени.

Обработка и отображение кадра теперь просто:

родовое слово

И если я хочу добавить больше возможностей OpenCV, мне не нужно менять MainWindow или графический интерфейс. Все это делается в классе ProcessorWidget.

Другие советы

Окно highgui openCV обрабатывает собственный цикл событий - вы не можете (легко) смешать его с циклом событий QMainWindows.

Самый простой способ - захватить изображение в openCV и отобразить в Qt с помощью Qimage и QPainter - 24-битный формат RGB888 QImage совместим с opencv CV_8UC3

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top