El método básico de usar QT para realizar videovigilancia en el sistema Linux

     Hola a todos, hoy principalmente compartiré con ustedes cómo usar QT para realizar el funcionamiento básico de la videovigilancia.

Tabla de contenido

Primero: Introducción básica a la videovigilancia

Segundo: Diagrama de flujo experimental

Tercero: Servidor de Video Vigilancia

Cuarto: Implementación del cliente de video vigilancia.


 

Primero: Introducción básica a la videovigilancia

      La videovigilancia común y la transmisión de video en vivo utilizan los protocolos de transmisión de medios RTMP y RTSP.

     RTSP (Protocolo de transmisión en tiempo real) es un protocolo de control de reproducción multimedia basado en texto propuesto conjuntamente por Real Networks y Netscape. RTSP define el formato de transmisión y los datos de transmisión se transmiten a través de RTP; RTSP tiene muy buenos efectos en tiempo real y es adecuado para video chat, monitoreo de video, etc.

     RTMP (Protocolo de mensajes en tiempo real) fue propuesto por Adobe para resolver los problemas de multiplexación (Multiplexing) y paquetización (multiplexación) de flujos de transmisión de datos multimedia. Sus ventajas radican en la baja latencia, la alta estabilidad y el soporte para todos los formatos de cámara. El navegador puede cargar el complemento flash y reproducirlo directamente.

     Habiendo dicho tanto anteriormente, es para que todos entiendan los protocolos de transmisión de medios populares actuales. En general, este protocolo debe usarse con servidores como el servidor Nginx y las herramientas ffmpeg. Por supuesto, no podemos escribir una herramienta poderosa como ffmpeg. Esta poderosa herramienta ha sido desarrollada muy bien y está especialmente diseñada para soluciones de procesamiento de audio y video.

      Si no queremos utilizar este método para la videovigilancia, ¿existe alguna solución sencilla que pueda utilizarse en Qt? La respuesta es sí. Vea el esquema a continuación.

     En este tutorial de Qt, ya hemos estudiado la programación de redes en el Capítulo 11. Ahora que aprendí a programar redes, use UDP o TCP para la transmisión y use Qt para encapsular el protocolo TCP/IP Interfaz de capa abstracta de socket para la comunicación. Entonces también podemos usarlos para enviar datos de imágenes. De esta forma, podemos usar Qt para escribir el servidor y el cliente. De hecho, tanto el protocolo RTSP como el protocolo RTMP usan el protocolo TCP/IP, y UDP o TCP se usan en la capa de transporte, por lo que los protocolos RTSP y RTMP son protocolos de nivel superior.

Segundo: Diagrama de flujo experimental

      Diagrama de flujo del principio de transmisión de datos.

 Las tareas que debemos completar son las siguientes.

(1) El servidor recopila datos de la cámara.

(2) Procese los datos de video y transfiéralos a Socket para su transmisión por TCP/UDP.

(3) El cliente recibe datos de video.

El diagrama de flujo del proyecto de este capítulo.

     Este proyecto usa una cámara OV5640 (5 megapíxeles), esta vez usamos QUdpSocket de Qt para la transmisión, de modo que varios clientes puedan recibir datos de imágenes sin conectarse. El servidor es la placa de desarrollo I.MX6U de Zhengdian Atom, y el cliente puede ser una computadora u otras placas de desarrollo I.MX6U u otras placas de desarrollo ARM que puedan ejecutar Qt.

Tercero: Servidor de Video Vigilancia

     La estructura del proyecto del servidor es la siguiente:

 Se explica el contenido de la carpeta del proyecto y el código fuente se ve en el proyecto, con notas detalladas. En el proyecto video_server:

1. capture_thread.h Este es el archivo de encabezado del hilo de captura de la cámara. La cámara recopila datos y comenzamos un hilo para obtenerlos.

2. capture_thread.cpp es el programa principal del hilo de la cámara. Otros archivos son archivos de interfaz, no es necesario introducirlos. El contenido de capture_thread.h es el siguiente.

1 #ifndef CAPTURE_THREAD_H
2 #define CAPTURE_THREAD_H
3
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7 #include <stdio.h>
8 #include <unistd.h>
9 #include <string.h>
10 #include <pthread.h>
11 #ifdef linux
12 #include <linux/fb.h>
13 #include <sys/ioctl.h>
14 #include <sys/mman.h>
15 #include <linux/videodev2.h>
16 #include <linux/input.h>
17 #endif
18
19 #include <QThread>
20 #include <QDebug>
21 #include <QPushButton>
22 #include <QImage>
23 #include <QByteArray>
24 #include <QBuffer>
25 #include <QTime>
26 #include <QUdpSocket>
27
28 #define VIDEO_DEV "/dev/video1"
29 #define FB_DEV "/dev/fb0"
30 #define VIDEO_BUFFER_COUNT 3
31
32 struct buffer_info {
33 void *start;
34 unsigned int length;
35 };
36
37 class CaptureThread : public QThread
38 {
39 Q_OBJECT
40
41 signals:
42 /* 准备图片 */
43 void imageReady(QImage);
44 void sendImage(QImage);
45
46 private:
47 /* 线程开启 flag */
48 bool startFlag = false;
49
50 /* 开启广播 flag */
51 bool startBroadcast = false;
52
53 /* 本地显示 flag */
54 bool startLocalDisplay = false;
55 void run() override;
56
57 public:
58 CaptureThread(QObject *parent = nullptr) {
59 Q_UNUSED(parent);
60 }
61
62 public slots:
63 /* 设置线程 */
64 void setThreadStart(bool start) {
65 startFlag = start;
66 if (start) {
67 if (!this->isRunning())
68 this->start();
69 } else {
70 this->quit();
71 }
72 }
73
74 /* 设置广播 */
75 void setBroadcast(bool start) {
76 startBroadcast = start;
77 }
78
79 /* 设置本地显示 */
80 void setLocalDisplay(bool start) {
81 startLocalDisplay = start;
82 }
83 };
84
85 #endif // CAPTURE_THREAD_H

Análisis: se puede ver que el servidor ha abierto un subproceso para recopilar datos, por lo que la interfaz y la lógica de datos están separadas y la interfaz no se congelará.

Cuarto: Implementación del cliente de video vigilancia.

La cantidad de código de cliente es menor y solo necesita recibir y procesar datos de imagen.

1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include <QMainWindow>
5 #include <QUdpSocket>
6 #include <QLabel>
7
8 class MainWindow : public QMainWindow
9 {
10 Q_OBJECT
11
12 public:
13 MainWindow(QWidget *parent = nullptr);
14 ~MainWindow();
15
16 private:
17 /* 用于接收数据 */
18 QUdpSocket *udpSocket;
19
20 /* 显示接收的图像数据 */
21 QLabel *videoLabel;
22
23 void resizeEvent(QResizeEvent *event) override;
24
25 private slots:
26 /* 图像更新 */
27 void videoUpdate();
28 };
29 #endif // MAINWINDOW_H

Quinto: Prueba integral de videovigilancia.

      La interfaz usa dos QCheckBoxes, un QCheckBox se usa para abrir la pantalla de imagen local, es decir, para mostrar el contenido capturado por la cámara. Otro QCheckBox se usa para abrir la transmisión UDP, es decir, para enviar el contenido capturado por la cámara. Estas dos funciones no están seleccionadas de forma predeterminada, haga clic en "Habilitar la recopilación de datos de la cámara" en la parte inferior de la interfaz para recopilar datos y luego seleccione las funciones que deben habilitarse.

     El cliente puede ejecutarse en otra placa de desarrollo o Ubuntu/Windows, y varios clientes pueden ejecutarse en diferentes máquinas al mismo tiempo. Asegúrese de que esté en el mismo enrutador (la misma LAN) que el servidor. Los resultados de ejecución son los siguientes. Se reciben los datos del servidor y se muestra la imagen, que se sincroniza con la imagen que se muestra en el servidor. El efecto es bueno.

Resumen: este proyecto se puede aplicar a la supervisión de exteriores, el control de visitantes, etc., que es muy similar al control de visitantes en la puerta de una terminal en un edificio inteligente. Incluso desarrollar proyectos relacionados por el lector en conjunto con otros ejemplos.

Supongo que te gusta

Origin blog.csdn.net/weixin_41114301/article/details/128749761
Recomendado
Clasificación