Acceder a la webCam, reproducir y guardar un video con Python – openCV

En este post explico como acceder a la webCam, reproducir y guardar un video usando la biblioteca openCV. También puedes ver el video relacionado con este tema en YouTube.

Acceder a la webCam con python y openCV

El siguiente programa describe como mostrar el contenido de la webCam, también aplica para cámaras externas, pero se debe modificar el valor en cv2.VideoCapture() de acuerdo al puerto donde se conecte la cámara puede ser 1,-1 ,2 ,0, etc.

Desplegar la explicación del código

  1. import cv2, importar biblioteca openCV
  2. capture = cv2.VideoCapture(0), crear un objeto capture de VideoCapture(0)
    • Tiene como argumento 0 para leer la webCam. También recibe valores como -1, 1, 2, etc si se conecta en otros puertos la cámara.
  3. while (capture.isOpened()):
    • capture.isOpened() Devuelve True si la captura de video ya se ha inicializado.
  4. ret, frame = capture.read(), usa el objeto capture para leer la información de la webCam
    • frame información del video frame por frame
    • ret valor booleano TRUE si frame es leído correctamente
  5. if (cv2.waitKey(1) == ord('s')):, sentencia if compara dos valores, si se cumple la condición termina el bucle.
    • cv2.waitKey(1), si una tecla es presionada, regresa un valor de acuerdo al código ascii, mientras no se presione una tecla devuelve el valor de -1
    • ord('s') la función ord recibe un caracter y devuelve un valor que representa a ese caracter.
    • La condición queda de la siguiente manera: (cv2.waitKey(1) == ord('s')) –> 1110011 == 01110011 (Cuando se cuple, sale del bucle)
  6. Usar .realese para cerrar el dispositivo de captura.
  7. cv2.destroyAllWindows() cerrar todas las ventanas
import cv2

capture = cv2.VideoCapture(0)

while (capture.isOpened()):
    ret, frame = capture.read()
    cv2.imshow('webCam',frame)
    if (cv2.waitKey(1) == ord('s')):
        break

capture.release()
cv2.destroyAllWindows()

Nota: En este ejemplo uso (cv2.waitKey(1) == ord('s')) para salir del bucle. Algunos autores usan ((cv2.waitKey(1) & 0xFF) == ord('s')) y en la siguiente sección explico el funcionamiento de esta sentencia.

Descarga estos archivos en GitHub

Cómo funciona (cv2.waitKey(1) & 0xFF) == ord(‘s’)

if ((cv2.waitKey(1) & 0xFF) == ord('s'))
  1. (cv2.waitKey(1) & 0xFF) con & realiza una operación ‘and’ de bit a bit (No confundir con AND que realiza operaciones booleanas). Dependiendo de la tecla que se presione cv2.waitKey(1) devolverá un entero
    • Si presionamos la tecla s en código ascii es 115 y en binario 1110011.
    • 0xFF se representa en binario  así 11111111
  2. La operación & de bit a bit queda de la siguiente manera si se presiona la letra s
    • ((cv2.waitKey(1) & 0xFF) == ord('s'))
    • ((01110011 & 11111111) == 01110011)
    • 1110011 == 01110011
    • La condición se cumple y sale del bucle

Guardar un video con Python y openCV

Para guardar el video se debe agregar un objeto salida de VideoWriter y ahí establecer las características del video, así:

salida = cv2.VideoWriter('webCam.avi', cv2.VideoWriter_fourcc(*'XVID'), 10, (640,480))

También se usa el método .write para poner cada frame en el video que se esta guardando.

salida.write(frame)

A continuación se describe el código que guarda un video desde la webCam

import cv2

capture = cv2.VideoCapture(0)
#objeto salida, contiene los parámetros para crear el video
salida = cv2.VideoWriter('webCam.avi', cv2.VideoWriter_fourcc(*'XVID'), 10, (640,480))

while (True):
    ret, frame = capture.read()
    cv2.imshow('frame',frame)
    #Usar write para GUARDAR el video
    salida.write(frame)
    if (cv2.waitKey(1) == ord('s')):
        break

salida.release()
capture.release()
cv2.destroyAllWindows()

Reproducir un video con python y openCV

El código para reproducir un video desde un directorio es similar al anterior, pero en lugar de colocar un valor como 0 en VideoCapture, se debe asignar el nombre del video 'gato.avi' (si se encuentra en la misma carpeta que el programa) o colocar la dirección en donde el video se encuentre. También se añade un bucle if (ret == True) porque en algún momento el video se terminará y sin esta condición obtendremos un error porque no encontrará un frame que mostrar al final.

Descarga estos archivos en GitHub Desplegar la explicación del código

  1. Iportar la biblioteca openCV
  2. capture = cv2.VideoCapture('gato.avi'), crear un objeto capture de VideoCapture(0)
    • Tiene como argumento entre comillas el nombre del video. También se puede usar el path del video cv2.VideoCapture('/home/noemi/Escritorio/reproducir_Videos/gato.avi')
  3. while (capture.isOpened()):
    • capture.isOpened() Devuelve True si la captura de video ya se ha inicializado.
  4. ret, frame = capture.read(), usa el objeto capture para leer la información de la webCam
    • frame información del video frame por frame
    • ret valor booleano TRUE si el frame es leído correctamente
  5. if (ret == True), si ret es True ejecutará lo que este dentro de la sentencia if.
  6. if (cv2.waitKey(30) == ord('s')):, sentencia if compara dos valores, si se cumple la condición termina el bucle.
    • cv2.waitKey(30), si una tecla es presionada, regresa un valor de acuerdo al código ascii, mientras no se presione una tecla devuelve -1Nota: algunos videos pueden reproducirse mas rápido o mas lento de acuerdo a las características como el bitrate, openCV tratará de reproducir el archivo rápido, para modificar eso se puede variar el valor de cv2.waitKey(30)
    • ord('s') la función ord recibe un caracter y devuelve un valor que representa a ese caracter.
    • La condición queda de la siguiente manera cuando se presiona la tecla s(cv2.waitKey(1) == ord('s')) –> 01110011 == 01110011
  7. capture.realese para cerrar el dispositivo de captura.
  8. cv2.destroyAllWindows() cerrar todas las ventanas
import cv2

capture = cv2.VideoCapture('gato.avi')

while (capture.isOpened()):
    ret, frame = capture.read()
    if (ret == True):
        cv2.imshow("Gato", frame)
        if (cv2.waitKey(30) == ord('s')):
            break
    else:
        break

capture.release()
cv2.destroyAllWindows()

A continuación dejo algunos post que usan el código para acceder a la webCam

3 comentarios en “Acceder a la webCam, reproducir y guardar un video con Python – openCV”

  1. Pingback: Guardar frames cada cierto tiempo con Python – openCV – Kipuna Ec

  2. Pingback: No sobreescribir texto en una imagen en Python y openCV - Kipuna Ec

  3. Pingback: Detector de bordes Canny con Python y OpenCV - Kipuna Ec

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *