подружить qml и opencv
Доброго времени суток.
Пытаюсь сделать отображение с веб-камеры в графическом интерфейсе написанном на qml.
Код программы:
- #системные библиотеки
- import cv2
- import numpy as np
- import sys
- import threading
- #PyQt библиотеки
- from PyQt5.QtCore import *
- from PyQt5.QtGui import *
- from PyQt5.QtQml import *
- from PyQt5.QtQuick import *
- class MyImageProvider(QQuickImageProvider):
- def __init__(self):
- super(MyImageProvider, self).__init__(QQuickImageProvider.Image)
- def requestImage(self, p_str, size):
- cap = cv2.VideoCapture(0)
- while True:
- ret, frame = cap.read()
- #image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
- height, width, channel = frame.shape
- #step = channel * width
- img = QImage(frame, width, height, QImage.Format_RGB888)
- #img.fill(Qt.green)
- return img, img.size()
- cv2.waitKey(1)
- if __name__ == '__main__':
- app = QGuiApplication(sys.argv)
- MyImageProvider()
- engine = QQmlApplicationEngine()
- engine.addImageProvider("myprovider", MyImageProvider())
- engine.load(QUrl.fromLocalFile("tst.qml"))
- if len(engine.rootObjects()) == -1:
- sys.exit(-1)
- sys.exit(app.exec_())
Вот код формы:
- import QtQuick 2.12
- import QtQuick.Window 2.12
- Window{
- visible: true
- width: 800
- height: 600
- title: ("QML OPENCV")
- color: "green"
- Image
- {
- //anchors.fill : parent
- source: "image://myprovider/test.png"
- }
- }
Читал статью про
слоты и сигналы в python
, но пока не могу сообразить, как это всё складывается воедино.
Представленный код отображает окно с веб-камерой и окно qml интерфейста.
Есть на C++ образец... Я в нём не силён, подсобите перевести на python3. :)
Утечка памяти (OpenCV + QML)
Нашёл пример с изображением:
QQuickImageProvider PyQt5
С помощью этого примера почти получилось добиться желаемого результата. Получается, что отображается только последний снятый кадр веб-камерой, а не поток. Есть идеи, как сделать поток из кадров в форму qml?
Спасибо!
Вот такой набросок пока что получился.
Do you like it? Share on social networks!
- Last comments
- AKApril 1, 2025, 11:41 a.m.Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VPMarch 9, 2025, 4:14 p.m.Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМNov. 22, 2024, 9:51 p.m.Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Now discuss on the forum
- МАApril 1, 2025, 4:21 p.m.0ff763fe-4e50-455d-a3a6-5699c243b1a5_17_44_22_1.xml
- fFeb. 15, 2025, 1:46 p.m.Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
Добрый день.
Да... OpenCV, конечно, интересная тема. Но вот я от неё далёк.
QQuickImageProvider использутеся для предоставления изображений, но точно не для потока этих самых изображений. В каком-то смысле все те примеры выглядят как костыли, поскольку QQuickImageProvider используется не по своему прямому назначению. Но тем не менее это должно работать.
Обратите своё внимание на то, что в примере с утечкой памяти имеется сигнал, который сообщает об изменении изображения на каждый новый кадр. Вам нужно сделать тоже самое. Вам нуэно использовать сигналы и слоты для этого. Не помню, вы уже кажется смотрели ту статью по сигналам и слотам PyQt5 - Урок 007. Работаем с QML QtQuick (Сигналы и слоты)
Добрый.
Да, я пытался связаться через сигналы и слоты, но у меня не выходит перевести программу с плюсов на питон. Если не затруднит помочь в переводе, то есть вероятность, что получится написать конечный результат. :)
Думаю, что в QQuickImageProvider следует добавить сигнал, что-то вроде такого
А потом как минимум подключить к этому сигналу обработчик в QML и посмотреть, сыпется ли что-то нибудь в консоль QML
Тогда уже можно будет пытаться сообразить что-нибудь дальше
А через "console.log" Вы куда выводите сообщения? В PyCharm? Я работаю в основном в стандартной IDLE Python. Такое не срабатывает в стандартной IDLE. PyCharm у меня стоит.
вообще - это тоже должно сыпаться в консоль и без разницы, какую IDE использовать. К IDE это не должно иметь никакого отношения. Если вывода нет, то скорее всего не работает.
А да, ещё этот сигнал нужно вызывать
И кстати сам запрос изображения у вас как-то странно написан
Вы сейчас разбираете некий костыль, посоветовали с сигналами и слотами поработать, вот и хочу с ними разобраться, если так имеет место быть более правильное решение.) Я могу по-новому написать, чтобы было понятнее работать.
что предоставлено, с тем и работаю. не писать же мне с нуля ваш проект ))
Это понятное дело.)
Я сделал вот так, чтобы проверить, работает ли счётчик.
Код программы:
Код формы:
Не хочет работать.
Я сделал простой вывод текста по испусканию сигнала...
Чего не хватает программе?)
Python:
QML:
Есть на qml что-то типа window.onload? Чтобы при загрузке формы срабатывал сигнал. По нажатию кнопки всё прекрасно работает... А вот при загрузке формы нет...
Да, с console.log() я разобрался, счётчик ничего не показывает
У всех компонентов есть встраиваемый обработчик Component.onCompleted, который выполняется, когда объект полностью создан
Наверное сигнал всё-таки не вызывается правильно
А не подскажете, как вызвать правильно? :)
Сделал вот такой вариант и он работает, только мне непонятно, почему в консоли пишется undefined...
Форма:
Скрипт:
undefined пишет потому, что метод сам по себе ничего не возвращает, то есть void, напишите так
Вернул код инструкции, если я правильно понял.

Вернулся указатель на ваш объект. Ну слот срабатывает. Вам теперь нужно дальше развить вашу задачу. У меня к сожалению нет времени разбираться с opencv, поэтому не могу ответить на некоторые вопросы.
С opencv я разберусь. :) У меня пока только вопросы по сигналам и слотам.)
На сколько мне известно в opencv с камеры подпются картинки через определенное время и так выходит видео. По идее можно по получении этой картинки передавать ее в qml. Прикрепить сигнал к получению картинки или таймеру и так подовать сигнал в qml об необходимости обновления.
Если смотреть глубже, то там подаётся массив байтов(bytes в питоне). Ну, а по простому, то да. Я пока не разобрался как переменную передавать в qml форму. В этой самой переменной, пускай будет frame, как раз хранится поток с веб-камеры. Как только я передам её на форму, то по идее, элемент в котором будет "отображаться" данная переменная, нужно же перерисовывать, чтобы кадры обновлялись.