Acceso a la webcam con OpenCV

Usando la biblioteca OpenCV podemos acceder a la cámara web o cualquier otro dispositivo de captura que tengamos instalado en nuestro sistema, cada una de las imágenes capturadas podrán almacenarse para su análisis o procesamiento en tiempo real si así lo deseamos, tenemos disponible una clase que nos servirá para guardar los videos previamente capturados y procesados, el formato de almacenamiento depende de las características habilitadas, pero puede ser MP4, AVI, WMV, etc., y otros si tenemos los códec.

Webcam desde OpenCV

Para acceder a la webcam lo hacemos de manera parecida a como mostramos un video solo que en lugar de especificar un archivo de video a la clase VideoCapture indicaremos el número de dispositivo o índice de cámara que deseamos usar, cero si tenemos solo una cámara.

Código C++

#include <opencv2\opencv.hpp>

using namespace cv;

int main()
{
    VideoCapture cap(0);

    if(!cap.isOpened())
        return -1;

    namedWindow("webcam");

    for(;;)
    {
        Mat frame;

        cap >> frame; 
        imshow("webcam", frame);

        if(waitKey(50) >= 0) break;
    }
    
    return 0;
}

Usamos cap.isOpened() para verificar si la cámara se ha iniciado correctamente, el código cap >> frame; envía la imagen capturada por la webcam al objeto Mat indicado.

Código Python

from cv2 import *

namedWindow("webcam")
vc = VideoCapture(0);

while True:
    next, frame = vc.read()
    imshow("webcam", frame)
    if waitKey(50) >= 0:
        break;

La versión Python es similar, salvo que este caso usamos el método vc.read() para obtener la imagen capturada por la cámara.

Si deseamos procesar cada uno de los cuadros del video capturado podemos hacerlo del mismo modo como lo hicimos de un video pregrabado, veamos un ejemplo:

Código C++

for(;;)
{
       Mat frame, edges;
       cap >> frame;

       cvtColor(frame, edges, CV_BGR2GRAY);
       GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
       Canny(edges, edges, 0, 30, 3);

       imshow("webcam", edges);
       if(waitKey(50) >= 0) break;
}

Código Python

while True:
    next, frame = vc.read()

    gray = cvtColor(frame, COLOR_BGR2GRAY)
    gauss = GaussianBlur(gray, (7,7), 1.5, 1.5)
    can = Canny(gauss, 0, 30, 3)

    imshow("webcam", can)
    if waitKey(50) >= 0:
        break;

En este ejemplo aplicamos varias funciones que nos permiten modificar la imagen original, primero cvtColor, convierte la imagen a escala de grises, GaussianBlur, aplicar un filtro gaussiano, y finalmente aplicamos Canny este nos permite detectar los bordes de la imagen, puedes ver más filtros de imagen que puedes aplicar.

webcam opencv video

Almacenar video en disco

Si deseamos grabar el video proveniente de la webcam, en disco, podemos hacerlo mediante la clase VideoWriter, en el constructor o el método open debemos indicar el nombre con que deseamos guardar el archivo con la extensión, el códec que usaremos, los cuadros por segundo y la resolución del video.

Por ejemplo, para grabar la captura de la webcam en un video AVI:

VideoWriter wtr("webcam.avi", CV_FOURCC('M','J','P','G'), 30, Size(640,480));

Para indicar el códec debemos indicar las cuatro letras que lo identifican:

  • CV_FOURCC('P','I','M','1') para codec MPEG-1 codec.
  • CV_FOURCC('M','J','P','G') para códec motion-jpeg.

Existen más códec puedes verlos aquí: http://www.fourcc.org/codecs.php, siempre que estén correctamente instalados para poder usarlos.

Para finalizar solo nos falta escribir cada cuadro, lo podemos hacer de dos modos:

wtr.write(dest);

También es válido:

wtr << dest;

Recordemos que este código debe ir dentro del bucle, después de procesar la imagen, en este caso dest en la imagen ya procesada que deseamos guardar.

Siguiente Tutorial: Detección de rostros

Comentarios

  1. Hola estoy teinendo un problema al compilar estos dos codigo, me marca un error:
    Unhandled exception at 0x7682b727 in Opencv4.exe: Microsoft C++ exception: cv::Exception at memory location 0x0041f8ac
    El error es similar en los dos codigos solo que varia al final la locacion, de antemano agradesco su ayuda.

    ResponderEliminar
  2. Hola al compilar me marca un error, mi error es class cv:videowriter has no member 'release' que podria ser...?

    ResponderEliminar
  3. Hola, tengo una duda. Pongo el codigo y lo corre, pero la camara no es activada ni nada, menos marca un error. ¿A que podria deberse?

    ResponderEliminar
  4. Hola, tengo una duda, quiero capturar cierto número de frames, por ejemplo cada 5 frames para saber la posición de un objeto y que el proceso no sea tan lento, ¿cómo podría hacerlo? lo he intentado con CAM_PROP_FRAME_COUNT pero no me funciona

    ResponderEliminar
    Respuestas
    1. Haz un contador normal y corriente,
      declara antes del bucle la variable:

      int contador = 0;
      for(;;){
      contador++;
      if(contador divisible entre 5){
      continue; // salta de nuevo al principio del bucle
      }
      // captura y procesado de lo que quieras
      }

      Eliminar
  5. Se puede trabajar con dos cámaras a la vez, es decir declarar cv2.VideoCapture(0) y videocapture(x) dependiendo de las camaras que desee utilizar para detectar diferentes perspectivas ?

    ResponderEliminar
  6. Hola, me ha funcionado bien, muchas gracias por el aporte, sin embargo, me he dado cuenta que los frames son más pequeños, el video me toma de 480x640 desde python y abrir la web cam desde la app de windows me lo hace con 720x1280
    Sabes como seleccionar la configuración de la cámara para que tome la mejor resolución ?

    ResponderEliminar
    Respuestas
    1. Debes establecer las dimensiones usando set de VideoCapture:

      vc.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
      vc.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

      Debes tener el cuidado de que la resolución que introduces esté soportada por la webcam.

      Eliminar
  7. Hola muchas gracias por la informacion. Sabes como se captura una camara stereo y despues que se pueda dividir en dos imagenes, Gracias

    ResponderEliminar
  8. Hola. Tengo una pregunta, me gustaría poder leer códigos QR con mi cámara. Cómo puedo hacerle?

    ResponderEliminar
    Respuestas
    1. Aquí tienes un tutorial explicando el proceso: http://acodigo.blogspot.com/2019/10/opencv-lector-de-codigos-qr.html

      Eliminar
  9. Hola, tengo un problema a la hora de intentar guardar el archivo con python, el Vídeo se muestra correctamente mientras se ejecuta, pero el archivo que se guarda está corrupto.

    ret, im = vid.read()

    if ret == True:

    # Convertimos a escala de grises.
    gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)

    # Aplicamos un suavizado Gaussiano.
    im_blur = cv2.GaussianBlur(gray, (3,3), 0)

    # Detectamos los bordes.
    bordes = cv2.Canny(image=im_blur, threshold1=10, threshold2=200)

    salida.write(bordes) # Escribimos el vídeo.

    ResponderEliminar
    Respuestas
    1. fourcc = cv2.VideoWriter_fourcc(*'mp4v')

      # Generamos archivo de salida.
      salida = cv2.VideoWriter('nuevo.mp4',fourcc,60,(w,h))

      Eliminar
  10. Hola, en el caso de que te ponga namedWindow no esta definida, como se podria arreglar.
    soy nuevo
    muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola, hoy llegue a experimentar con estos códigos y vi que no es necesario esa linea solo la comente y cambie la linea de from cv2 import * por import cv2 y agregando el cv2.VideoCapture(0), cv2.imshow() y cv2.waitKey(). Espero te sirva yo estoy usando el IDLE de Python

      Eliminar
  11. Excelente muchas gracias!!!
    Ahora solo me falta la webcam, pero creo que una rfx 711 es una gran opcion

    ResponderEliminar

Publicar un comentario

Temas relacionados

Entradas populares de este blog

tkinter Grid

tkinter Canvas

Histogramas OpenCV Python

Python Binance API