QMainWindow не отвечает, когда процесс OpenCV запущен
Вопрос
Я использую собственный класс 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