Я пытаюсь совместить доступ к веб-камере OpenCV и функции отображения изображений с возможностями Qt Network (консольное приложение Qt 4.8.1 C ++ с использованием OpenCV 2.4.2 highgui).
В настоящее время я пытаюсь избежать преобразования cv :: Mat в формат Qt и отображать его с помощью пользовательского графического интерфейса Qt для простоты.
Для этого я создаю класс-оболочку, который управляет всеми элементами OpenCV (cap = new VideoCapture (), namedWindow (), cap-> read (), imshow (), destroyAllWindows (), cap-> release ()) с помощью QTimer переместить его в QThread.
Это в основном работает (до сих пор мусорные символы в заголовке окна) но иногда OpenCV создает новое окно, когда родительский класс потока получает сигналы от своего QTCPServer.
Это приводит к появлению «мертвых» окон изображений, которые больше не обновляются.
Порядок создания (поток OpenCV / QTcpServer), кажется, не имеет значения — однако, если клиент не подключается, я вижу, что OpenCV сначала создает небольшое окно, которое, следовательно, увеличивается в соответствии с размером видеоизображения.
Если клиент подключается, то в большинстве случаев остается меньшее окно (мусор заголовка окна, например, «ét»), более новое окно получает данные изображения должным образом (мусор заголовка окна, например, «, ét»).
Также не работает перемещение объекта-оболочки OpenCV в поток, но возникает та же проблема (что еще хуже, создаются два мертвых окна, второе из которых уже получило кадр изображения).
Что я вообще могу делать неправильно, чтобы вызвать такое поведение?
Я подозреваю, что проблема может быть вызвана тем, что именованное окно было создано и доступно в двух разных методах моего класса-оболочки QOBject (конструктор и слот).
Или QTCPServer блокирует цикл событий Qt? Или что дескриптор окна OpenCV по какой-то причине «сборщик мусора», когда механизм Signal-Slot запускается событиями QTCPServer, а затем imshow создает новое окно?
Не существует очевидного способа доступа к окну по указателю, поэтому это должно быть причиной. Удаление начального namedWindow () устраняет маленькое пустое окно, но, тем не менее, создаются два окна.
Кажется, мне все-таки нужно конвертировать и отображать изображения — или есть другой способ?
Я думаю, что проблема здесь заключается в инкапсуляции, насколько я понимаю, вы пытаетесь отобразить изображение в одном и том же окне из двух разных потоков, это неправильно. Вы должны отображать изображение из одного потока, и, возможно, вы можете создать буфер изображения в этом потоке, а другие ваши потоки помещают изображения в этот буфер, и вы можете использовать этот буфер для отображения изображений. Если я понял это неправильно, вы можете объяснить свою проблему яснее?
Других решений пока нет …