viernes, 3 de junio de 2011

CAPTURA DE IMAGEN CON OPENCV

Objetivo
Captura de cuadro(s) de imagen mediante cámara web.

Introducción
Opencv, es una suite que nos ofrece un sin número de funciones dentro del API, para llevar a cabo operaciones de captura y procesamiento de imágenes, entre ellas la captura de imagen fija. En este documento, se muestran las funciones básicas para captura de imagen, así como se explica el uso de parámetros en el empleo de las mismas.
OpenCV emplea el comando CvCaptureFromCAM para accesar a la cámara web conectada vía USB a la computadora. El parámetro CV_CAP_ANY , nos facilita que la función tome la cámara web que este conectada en ese instante. El identificador pCapture toma un valor de TRUE si la cámara es hallada y un valor de FALSE si esta tiene algún problema o simplemente no hay cámara web
conectada. El comando cvQueryFrame, nos proporciona la captura de un cuadro de imagen de la cámara web , si la imagen se obtiene adecuadamente el identificador pVideoFrame arroja un valor de TRUE de otra forma es FALSE.
Para guardar la imagen capturada se emplea la función: cvSaveImage . Está espera 2 parámetros, el nombre de archivo y el cuadro de imagen capturado. Algunas ocasiones dependiendo de la forma de captura de la imagen, se debe agregar un tercer parámetro que indica el número índice de cámara web que se esta empleando, en nuestro caso -0- .
Finalmente cvReleaseCapture se encarga de cerrar el objeto de captura de video, y dejar libre recursos, se le da, de parámetro un objeto del tipo de clase CvCapture.
A continuación se da un ejemplo, de captura de cuadro de imagen, el cual está escrito de tal forma que pueda capturar dos cuadros de imagen.

#include <stdio.h>
#include "cv.h"
#include "highgui.h"
#include <string.h>
int main(int argc, char ** argv)
{
CvCapture * pCapture = 0;
IplImage * pVideoFrame = 0;
int i;
char filename[50];
// Inicializar video de captura
pCapture = cvCaptureFromCAM( CV_CAP_ANY );
if( !pCapture )
{
fprintf(stderr, "Ocurrio una falla al momento de iniciar la captura de video.\n");
return -1;
}
// Captura dos cuadros de imagen y escribelos como archivos
for(i=0; i<2; i++)
{
pVideoFrame = cvQueryFrame( pCapture );
if( !pVideoFrame )
{
fprintf(stderr, "Ocurrio una falla al obtener un cuadro de imagen\n");
}
// Guarda el cuadro de imagen del video capturado como un archivo imagen
sprintf(filename, "CuadroImagen%d.jpg", i+1);
if( !cvSaveImage(filename, pVideoFrame,0) )
{
fprintf(stderr, "Ocurrio un error al momento de guardar el archivo %s\n", filename);
}
// IMPORTANTE: NO quites o modifiques la imagen que se regresa.
// de cvQueryFrame() !
}
// Termina la captura de video y libera recursos
cvReleaseCapture( &pCapture );
return 0;
}

3 comentarios:

  1. Llevaba dias buscando algo tan simple como la captura de imagenes desde un video de la webcam y almacenarlas en fichero. GRACIAS :)
    Sabes algo de tracking 3D?

    un saludo

    ResponderEliminar
    Respuestas
    1. ¡Que bueno te haya sido de utilidad!
      El seguimiento 3D se puede hacer varias formas:
      1) con sensores usando red satélital
      2) Con sensores usando potencia de una fuente emisora del dispositivo (RF o ultrasonido).
      3) Con cámara WEB,
      3.1) Por segmentación
      3.2) Por identificación del contorno.
      3.3) Usando filtros preclasificadores en cascada.
      Armar una maqueta depende de que tipo de lenguaje gustes usar, en este caso mi recomendación puede ser:
      1) C
      2) C++
      3) Python
      4) Java
      Ejemplo:
      http://science.nasa.gov/realtime/jtrack/3d/JTrack3D.html/

      ¡Saludos!

      Eliminar
  2. Buenas,

    Estaba tratando de utilizar con Visual studio 2013 y aunque no me aparecen errores de carga no se donde queda la foto, y aparentemente no se activa nada,

    el resultado que aroja es


    'prueba.exe' (Administrado (v4.0.30319)): se cargó 'C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll', se omitió la carga de símbolos. Se optimizó el módulo y se habilitó la opción 'Solo mi código'.
    'prueba.exe' (Administrado (v4.0.30319)): se cargó 'D:\proyecto_opencv\toma de foto\x64\Debug\prueba.exe', símbolos cargados.
    'prueba.exe' (Administrado (v4.0.30319)): se cargó 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll', se omitió la carga de símbolos. Se optimizó el módulo y se habilitó la opción 'Solo mi código'.
    El programa '[5212] prueba.exe: Administrado (v4.0.30319)' terminó con código 0 (0x0).

    por lo que dice que no hizo nada
    cualquier comentario se agradece

    ResponderEliminar