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

Publicar un comentario

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Conociendo la clase cv::Mat de OpenCV

Procesamiento de imágenes en OpenCV