QT creador python transmite video utilizando opencv.
Llevo algunos días trabajando en ello, buscando en línea en la documentación pero no he podido encontrar ningún ejemplo :/.
Quiero transmitir video en una página usando opencv. Estoy usando QtCreator y una aplicación QtQuick con archivos qml.
MediaPlayer {
id: mediaplayer
source: "videoplayback.mp4"
}
VideoOutput {
anchors.fill: parent
source: mediaplayer
}
MouseArea {
id: playArea
anchors.fill: parent
onPressed: mediaplayer.play();
}
Ahora puedo reproducir el video. Pero prefiero que la fuente provenga de mi archivo de backend main.py para que pueda trabajar en él.
El archivo main.py ahora es:
”’
class MainWindow(QObject):
def __init__(self):
QObject.__init__(self)
#QTimer
self.timer = QTimer()
self.timer.timeout.connect(lambda: self.setTime())
self.timer.start(1000)
def setTime(self):
now = datetime.datetime.now()
formatDate = now.strftime("Time: %H:%M:%S %p of %Y/%m/%d")
#print(formatDate)
self.printTime.emit(formatDate)
if __name__ == "__main__":
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
#Get Context
main = MainWindow()
engine.rootContext().setContextProperty("backend", main)
engine.load(os.fspath(Path(__file__).resolve().parent / "qml/main.qml"))
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec_())
En el código anterior, básicamente esta línea:
engine.rootContext().setContextProperty("backend", main)
Es la que se conecta con los archivos qml utilizando:
Connections{
target: backend
function onPrintTime(time){
labelDate.text = time
}
}
Así que en el contexto quiero mostrar video en mi página usando la fuente de opencv. Básicamente es una aplicación de sistema de vigilancia, así que quiero mostrar varias transmisiones, pero si alguien pudiera ayudarme con una sola desde la cámara web, cómo transmitirla al reproductor de medios estaré muy agradecido.
Nota: estoy trabajando con archivos qml dentro de la aplicación QT Creator. Hay varias formas de hacer esto con archivos de UI, pero eso no me ayuda :/
davy.ai
Para transmitir video en una página usando OpenCV en una aplicación QtQuick con archivos QML, se puede utilizar el siguiente código:
En este código, creamos un elemento
VideoOutput
para mostrar el video, un elementoMediaPlayer
para controlar y reproducir el video, y un elementoMouseArea
para activar/desactivar la reproducción al hacer clic.Para establecer la fuente de video dinámicamente desde el archivo
main.py
del backend, se puede agregar una propiedad a la claseMainWindow
para mantener la ruta del video y actualizar la fuente delMediaPlayer
con ella:Luego, en el archivo QML, se puede vincular la fuente del
MediaPlayer
a la propiedadvideoPath
deMainWindow
:Para capturar video desde una cámara web con OpenCV y mostrarlo en la página QtQuick, se puede usar la clase
VideoCapture
de OpenCV para capturar imágenes de la cámara y convertirlas en una imagenQImage
de Qt utilizandocv2.cvtColor
yQImage.fromData
. Luego, se puede actualizar la fuente delMediaPlayer
con unaQUrl
a un archivo de video temporal que contiene las imágenes capturadas.Aquí hay un ejemplo de clase
MainWindow
que captura imágenes de una cámara web y actualiza la fuente delMediaPlayer
:En esta clase
MainWindow
, utilizamos unQTimer
para capturar imágenes desde la cámara web a 30 fps, convertirlas en unaQImage
y actualizar el video con el métodoupdateVideo
. Este método actualiza la fuente delMediaPlayer
con unaQUrl
a un archivo temporal de video que contiene las imágenes capturadas.Luego, en el archivo QML, se puede usar el elemento
MouseArea
para activar el métodoupdateMedia
y reproducir el video en la página.