Transmisión de video en red en tiempo real basada en OpenCV

Haga clic en " Xiaobai Learn Vision " arriba , elija agregar " estrella " o " arriba "

Productos secos pesados, entregados inmediatamente

Muchos socios pequeños no instalarán cámaras web o cámaras de vigilancia en sus hogares u oficinas. Pero a veces, la gente quiere poder ver videos en vivo en cualquier momento y en cualquier lugar.

La mayoría de la gente optará por utilizar cámaras IP (cámaras de protocolo de Internet) en lugar de CCTV (circuito cerrado de televisión) porque tienen una resolución más alta y reducen los costos de cableado. En este artículo, nos centraremos en las cámaras IP. Una cámara IP es una  cámara digital que puede recibir datos de control y enviar datos de imágenes a través de una red IP y no requiere equipo de grabación local. La mayoría de las cámaras IP se basan en RTSP (Protocolo de transmisión en tiempo real), por lo que el propio navegador de Internet " no lo admite" .

01. Cómo usar un navegador web para ver medios de transmisión en vivo

La visión por computadora es un campo interdisciplinario que involucra cómo hacer computadoras para obtener un conocimiento de alto nivel a partir de imágenes o videos digitales. Para implementar la parte de visión por computadora, usaremos el módulo OpenCV en Python y mostraremos la transmisión en tiempo real en un navegador web, usaremos el  marco web Flask . Antes de entrar en la parte de codificación, primero comprendamos brevemente estos módulos. Si ya está familiarizado con estos módulos, puede pasar directamente a la siguiente sección.

Según Wikipedia, Flask es un marco de micro web escrito en Python. Se clasifica como un microframework porque no requiere herramientas o bibliotecas específicas. No tiene una capa de abstracción de base de datos, validación de formularios ni ningún otro componente de biblioteca de terceros existente que proporcione funciones comunes.

Según GeeksForGeeks, OpenCV es una enorme biblioteca de código fuente abierto para visión por computadora, aprendizaje automático y procesamiento de imágenes, y ahora juega un papel importante en las operaciones en tiempo real, lo cual es muy importante en los sistemas actuales.

02. Pasos de operación

Paso 1: instale Flask y OpenCV:

Puede utilizar los  comandos pip install  flask" y "  pip install opencv-python ". Utilizo PyCharm IDE para desarrollar aplicaciones de matraces.

Paso 2: importe las bibliotecas necesarias e inicialice la aplicación del matraz:

Ahora, importaremos las bibliotecas necesarias e inicializaremos nuestra aplicación de matraz.

#Import necessary libraries
from flask import Flask, render_template, Response
import cv2
#Initialize the Flask app
app = Flask(__name__)

Paso 3: use OpenCV para capturar video:

Cree un objeto VideoCapture () para activar la cámara y leer la primera imagen / fotograma del video. Podemos proporcionar la ruta del archivo de video o usar números para especificar el uso de la cámara web local. Para activar la cámara web, pasamos "0" como parámetro. Para capturar la fuente en tiempo real de la cámara IP, proporcionamos un enlace RTSP como parámetro.

camera = cv2.VideoCapture(0)
'''
for ip camera use - rtsp://username:password@ip_address:554/user=username_password='password'_channel=channel_number_stream=0.sdp' 
for local webcam use cv2.VideoCapture(0)
'''

Paso 4: agregue ventanas y genere marcos desde la cámara:

La función gen_frames () entra en un bucle en el que continuamente devuelve fotogramas de la cámara como bloques de respuesta. Esta función requiere que la cámara proporcione un marco, luego lo formatee en un bloque de respuesta de tipo de contenido y lo haga producir imagen / jpeg, como se muestra arriba. El código es el siguiente:

def gen_frames():  
    while True:
        success, frame = camera.read()  # read the camera frame
        if not success:
            break
        else:
            ret, buffer = cv2.imencode('.jpg', frame)
            frame = buffer.tobytes()
            yield (b'--frame\r\n'
                   b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')  # concat frame one by one and show result


Paso 5: defina la ruta de la aplicación para la página predeterminada de la aplicación web :

El enrutamiento se refiere al patrón de URL de la aplicación (por ejemplo, myapp.com/home o myapp.com/about). @ app.route ("/") es un decorador de Python proporcionado por Flask, que se utiliza para asignar URL en nuestras aplicaciones para una fácil operación.

@app.route('/')
def index():
    return render_template('index.html')

El decorador nos dice @app, siempre que el usuario visite un dominio de aplicación determinado ( localhost: 5000 en el servidor local) .route (), se ejecuta la función index (). Flask usa la biblioteca de plantillas Jinja para representar plantillas. En nuestra aplicación, usaremos plantillas para renderizar HTML, que se mostrará en el navegador.

Paso 6: defina la ruta de aplicación de la transmisión de video:

@app.route('/video_feed')
def video_feed():
    return Response(gen_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')

La ruta "/ video_feed" devuelve una respuesta de transmisión. Dado que esta secuencia devuelve la imagen que se mostrará en la página web, la URL enrutada está en el atributo "src" de la etiqueta de la imagen (consulte "index.html" a continuación). El navegador actualizará automáticamente los elementos de la imagen mostrando el flujo de imágenes JPEG en él, porque la mayoría / todos los navegadores admiten respuestas de varias partes

Echemos un vistazo a nuestro archivo index.html :

<body>
<div class="container">
    <div class="row">
        <div class="col-lg-8  offset-lg-2">
            <h3 class="mt-5">Live Streaming</h3>
            <img src="{
    
    { url_for('video_feed') }}" width="100%">
        </div>
    </div>
</div>
</body>

Paso 7: inicie el servidor Flask :

if __name__ == "__main__":
    app.run(debug=True)

Llame a app.run () y aloje la aplicación web localmente en [localhost: 5000] .

"Debug = True" garantiza que no es necesario ejecutar la aplicación cada vez que hacemos un cambio, simplemente actualice la página web mientras el servidor aún se está ejecutando para ver los cambios.

Estructura del proyecto:

El proyecto se guarda en una carpeta denominada "Detección de cámara". Ejecutamos el archivo "app.py". Después de ejecutar este archivo, nuestra aplicación se alojará en el puerto 5000 del servidor local.

  • Simplemente escriba "localhost: 5000" en el navegador web después de ejecutar "app.py" para abrir su aplicación web.

  • app.py: esta es la aplicación Flask que creamos arriba

  • Plantillas: esta carpeta contiene nuestro archivo "index.html". Esto es necesario en Flask al renderizar la plantilla. Todos los archivos HTML se colocan en esta carpeta.

Veamos qué pasa cuando ejecutamos'app.py ':

Al hacer clic en la URL proporcionada, nuestro navegador web abrirá una transmisión en vivo. Como usé VideoCapture (0) arriba , el resumen de la cámara web se mostrará en el navegador:

Hay transmisiones de video en tiempo real de cámaras IP / cámaras de red, que se pueden utilizar con fines de seguridad y vigilancia.

Enlace de código: https://github.com/NakulLakhotia/Live-Streaming-using-OpenCV-Flask

Grupo de intercambio

Bienvenido a unirse al grupo de lectores de cuentas públicas para comunicarse con sus compañeros. Actualmente, existen grupos de WeChat como SLAM, visión 3D, sensores, conducción autónoma, fotografía computacional, detección, segmentación, reconocimiento, imágenes médicas, GAN y concursos de algoritmos (se subdividirán gradualmente en el futuro). Escanee la siguiente cuenta de WeChat para agregar grupos, comentarios: "apodo + escuela / empresa + dirección de investigación", por ejemplo: "Zhang San + Shanghai Jiaotong University + Visual SLAM". Siga las observaciones del formato; de lo contrario, no se aprobará. Después de una adición exitosa, se le invitará a ingresar al grupo de WeChat correspondiente según la dirección de la investigación. No envíe anuncios en el grupo; de lo contrario, se le pedirá que abandone el grupo, gracias por su comprensión ~


Supongo que te gusta

Origin blog.csdn.net/qq_42722197/article/details/109665279
Recomendado
Clasificación