Trabajando con cámara en Python - Tomar fotos y grabar vídeos usando Flask y OpenCV

Grabar vídeo de cámara con Python, Flask y OpenCV – Cámara de vigilancia

En este post te mostraré otro avance en cuanto a la lectura de una cámara web usando Python. Con el código que expongo aquí serás capaz de:

Trabajando con cámara en Python - Tomar fotos y grabar vídeos usando Flask y OpenCV
Trabajando con cámara en Python – Tomar fotos y grabar vídeos usando Flask y OpenCV
  1. Ver la cámara en tiempo real, con fecha y hora
  2. Descargar una foto
  3. Guardar la foto en el servidor
  4. Grabar vídeos y guardarlos en el servidor

Básicamente se podrá hacer todo lo que se haría en una cámara de vigilancia, pero ahora usando Python y una cámara conectada al dispositivo. Obviamente se le pueden agregar más cosas, mejorar el proyecto, etcétera.

El punto es que con esto podemos usar Python para acceder a la cámara web, verla, tomar fotos y grabar vídeos.

Mejoras en cuanto a la versión anterior

De hecho esto no es una nueva versión, esto es más como una mejora de la anterior. En el post anterior te enseñé a stremear la cámara y a tomar fotos.

Ahora fui un paso más allá y añadí la opción para grabar vídeos además de poner la fecha y hora en el vídeo.

Sin embargo, no voy a explicar todo desde cero. Así que te recomiendo ampliamente leer el post anterior y después volver a este para ver las mejoras.

No te preocupes, igual te mostraré el código completo. Pero es mejor que lo entiendas en caso de que necesites adaptarlo o mejorarlo.

Agregando fecha y hora

Debido a que las cámaras de vigilancia graban la fecha y hora quise implementar ese comportamiento. Así que modifiqué el frame antes de que fuera devuelto y le coloqué el texto usando una función:

De este modo se agrega un texto al frame. Y ya sea que se tome la foto, se grabe vídeo o simplemente se visualice la cámara, el frame tendrá la fecha y hora actual.

Recuerda que, si bien no es un trabajo muy pesado hacer esto, puede que en dispositivos con pocos recursos esto agregue lag o pérdida de frames.

Como puedes ver usamos el método putText propio de OpenCV y le enviamos los argumentos, mismos que solo son constantes. Lo he hecho de este modo para que sea fácil cambiar los parámetros.

Grabando vídeo

Vídeo grabado con Python y OpenCV
Vídeo grabado con Python y OpenCV

Vamos a la parte más interesante del post: cómo grabar vídeos con Python usando la cámara web o una cámara conectada por USB.

En este caso simplemente tenemos que crear un archivo de vídeo en donde se van a guardar todos los frames y, en cada lectura, ir escribiendo al archivo.

La cosa se complica un poco cuando tenemos que stremear esos frames y crear vídeos cuando el usuario lo requiera. Pero con un poco de código se logró.

Por cierto, los vídeos se guardan en formato AVI en el directorio donde se ejecuta el script (tienen la fecha y hora como nombre). Más tarde se podría agregar una opción para ver el listado de vídeos o descargarlos.

El formato AVI fue elegido porque es un formato compatible con Windows; y esto cambia dependiendo del sistema operativo.

Configuraciones de grabación de vídeo

En fin, veamos las configuraciones del vídeo:

Solo recuerda que entre mayor resolución, mayor es el peso. Y que entre más Frames, más peso, pero más fluidez. Debes buscar el equilibrio perfecto entre calidad del vídeo, almacenamiento disponible y todo eso (sobre todo si realmente vas a usar esto como cámara de vigilancia).

Iniciar grabación

Grabando vídeo de cámara usando Python
Grabando vídeo de cámara usando Python

He expuesto esto en una ruta de Flask. Básicamente crea un nuevo archivo de vídeo y establece una bandera para que la otra función que devuelve los frames sepa que debe escribir el frame antes de regresarlo.

La escritura del frame en el archivo está en la línea 8. Fíjate en que estamos usando las configuraciones previamente establecidas.

Por cierto, el nombre del archivo está en la línea 7. También es importante que notes que estamos usando variables globales ya que todas las funciones deben compartir el estado de la grabación.

Escribiendo frame

Anteriormente te dije que la función que lee un frame de al cámara saber si debe guardarlo en el vídeo gracias a una bandera. El código queda así:

La magia está ocurriendo en la línea 6. Primero el frame se transforma agregándole la fecha y hora. Más tarde, se comprueba si el archivo de vídeo está definido y si se está grabando. En ese caso escribimos el frame, después lo codificamos como jpg y finalmente lo devolvemos.

Detener grabación

Para dejar de grabar también existe una ruta. En este caso simplemente libera el archivo de grabación para escribirlo, y establece la bandera en False.

Lado del cliente

El lado del cliente también juega una parte importante, pues aquí es en donde se empieza o detiene la grabación. Por ello es que además existe una ruta que dice si el vídeo se está grabando o no:

Gracias a esto podemos conectarnos una vez al “panel de control” de la cámara, comenzar la grabación y después salir, ya que el estado del servidor se refleja para todos los clientes, y toda la grabación se realiza del lado del servidor.

Así que si la grabación ya ha sido iniciada por otro cliente y alguien nuevo se conecta, se le mostrará el botón para detener la grabación.

El código HTML queda así:

He agregado los botones para grabar y detener la grabación de vídeo. Ahora, cada clic de esos botones tiene su listener:

Básicamente invocan a las rutas expuestas con Flask en el fondo, dando una experiencia de tiempo real. Por cierto, en la línea 6 estoy definiendo una función que muestra u oculta los botones de iniciar y detener grabación dependiendo del estado.

Problemas conocidos

Existe un problema que he experimentado cuando hay 2 clientes visualizando la cámara en tiempo real. Si uno de ellos inicia la grabación y luego la detiene, al detenerla se corta la transmisión de vídeo para todos, y se genera una excepción.

Si Flask está en modo de producción simplemente hay que refrescar la página y todo volverá a la normalidad. En caso de que se quieran usar varios clientes y grabar vídeos, tal vez se debería desactivar la visualización en tiempo real.

Poniendo todo junto

Trabajando con cámara en Python - Tomar fotos y grabar vídeos usando Flask y OpenCV
Trabajando con cámara en Python – Tomar fotos y grabar vídeos usando Flask y OpenCV

El código completo lo dejaré en GitHub. Recuerda que debes contar con Python y PIP. Después, instala las dependencias:

pip install opencv-python

pip install flask

Y finalmente ejecutar la app con:

python app.py

Ahora visita localhost:5000 y todo debería funcionar. Recuerda que también puedes acceder desde otro dispositivo únicamente colocando la IP del servidor y el puerto.

Por aquí te dejo más tutoriales sobre Python.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

1 comentario en “Grabar vídeo de cámara con Python, Flask y OpenCV – Cámara de vigilancia”

Dejar un comentario