domingo, 9 de junio de 2013

Con OpenCV podemos acceder a la cámara web que tengamos instalada en el computador, también podremos procesar estas imágenes capturadas por la webcam mediante OpenCV y por su puesto grabar videos de la cámara.

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 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;
}

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;

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 usamos cap >> frame para capturar la imagen de la cámara, luego la procesamos con las funciones cvtColor, GaussianBlur, Canny.

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 extensión, el códec que usaremos, los cuadros por segundo y la resolución del video.

VideoWriter wtr("webcam.avi", CV_FOURCC('M','J','P','G'), 30, Size(640,480));
 
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);
wtr << dest;

Siguiente Tutorial: Detección de rostros

Ver Categoria:

5 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