[Jde-dev] [Jde-users] Capturar imagen con opencv

JoseMaria jmplaza en gsyc.es
Mie Ene 7 16:56:32 CET 2009


Estupendo Sara, hay que darle forma de driver para que las aplicaciones
actuales en JDE que manejan imágenes lo puedan utilizar.

Sip, la eficiencia es una cuestión muy importante para las aplicaciones
que estamos haciendo ahora. En el fondo tiene que ver también con el API
de imágenes que queremos, o los APIs. Hasta ahora las imágenes
(colorA,varcolorA, varcolorB...) van en RGB, de 3 bytes por pixel, y es
un formato muy genérico. Nada impide hacer interfaces ofreciendo
fotogramas en formato YUV o HSV si es lo que dan las cámaras
directamente y si es lo que necesitan ciertas aplicaciones. Con eso nos
ahorramos una conversión, de YUV a RGB, por ejemplo.

También se podrían publicar interfaces como IplImage (tipo que maneja
opencv para las imágenes) si es interesante. Ahora mismo el driver
ofrece en su interfaz el puntero a las imágenes, el cliente no tiene por
qué hacer copia si no le interesa (ahí se podría ganar algo en
eficiencia).

Otra cuestión interesante es la robustez frente a concurrencia
(thread-safe). Por ejemplo para que no haya condiciones de carrera en el
acceso del driver (escribiendo la nueva imagen) y el acceso de los
esquemas de aplicación (leyendo la nueva imagen). Ahora mismo esto no se
vigila explícitamente (por ejemplo con semáforos) para no ralentizar
ejecución. El precio es que efectivamente el esquema usuario puede leer
un trozo de su imagen de la iteración anterior y otro de la última.

Lo de grabar videos es otra funcionalidad nueva y ahí también tenemos
que ver cómo organizarlo. Hasta ahora lo que tenemos es el esquema
"recorder" que guarda uno a uno los fotogramas que va leyendo. Esto
permitía grabar secuencias de fotogramas incluso decorados con lineas y
píxeles coloreados según quisiera el esquema que producía esos
fotogramas. Con una aplicación externa se podía componer un mpeg.
Primitivo, pero es lo mejor que tenemos hasta ahora :-), aunque hace ya
meses (años?) que no se usa. Seguro que hay formas más elegantes y
eficientes de hacerlo ahora....

Ánimo,

JoseMaria
On Mon, 2009-01-05 at 12:26 +0100, Roberto Calvo wrote:
> Genial :-)
> 
> A mi no me funcionó con las logitech nuevas, pero creo que era porque no
> configuraba bien la resolución. A ver si cuando vuelva puedo probarlas.
> 
> Sara, en el paquete opencv-doc hay varios ejemplos en C que hacen uso de
> este api, échales un ojo si no lo has hecho ya, que hay bastante código.
> 
> El driver es una cosa a debatir. El hecho de hacerlo porque sí para
> recubrir tampoco tiene mucho sentido. Los drivers de imágenes que
> tenemos, al final ralentizan el proceso porque realizan conversiones que
> hay que estudiar si son necesarias. También es importante ver que pasa
> si se activa el driver opencv para imágenes, y ahora yo quiero grabar un
> video. Grabar frame por frame es costoso y seguro que internamente
> opencv lo hace mejor escribiendo a disco.
> 
> 
> Por cierto Sara, actualiza tu bookmarks de correos, que jde-developers
> antes era jde en gsyc.es y ahora es jde-developers en gsyc.es, más que nada
> por no meter ruido en la lista de users.
> 
> un saludete!
> 
> El lun, 05-01-2009 a las 12:01 +0100, Sara Marugan escribió:
> > He modificado el código para que la captura se vea en una ventanita en 
> > tiempo real.
> > 
> > void main(){
> >      CvCapture* myCapture = NULL;
> >      IplImage *frame = NULL;
> > 
> >      // webcam capture started (opencv)
> > 
> >      myCapture =  cvCaptureFromCAM(-1);
> >      if (myCapture == NULL)
> >      {
> >         printf ("Error myCapture == NULL\n");
> >         return;
> >      }
> > 
> >      cvNamedWindow( "opencv", 1 );
> > 
> >      /* Config Image Size */
> >      cvSetCaptureProperty(myCapture,CV_CAP_PROP_FRAME_WIDTH,320);
> >      cvSetCaptureProperty(myCapture,CV_CAP_PROP_FRAME_HEIGHT,240);
> > 
> >      /* Capture frame */
> >      while(1){
> >          frame = cvQueryFrame( myCapture );
> >          cvShowImage( "opencv", frame);
> >              cvWaitKey(10);
> >      }
> > 
> >      // webcam capture finished (opencv)
> >      cvDestroyWindow("opencv");
> >      cvReleaseCapture(&myCapture);
> > }
> > 
> > 
> > Sara Marugan escribió:
> > > He realizado una prueba con el código que envió Roberto y una webcam usb 
> > > trust normalita y ha funcionado a la primera :)
> > > Parece que con las usb no va a tener problema.
> > >
> > > Yo también creo que el driver basado en opencv podría dar la mayoría del 
> > > soporte de vídeo.
> > >
> > > David Lobato escribió:
> > >   
> > >> Yo veo prometedora esta vía. ¿¿Para que preocuparnos de drivers de 
> > >> bajo nivel para acceder a las cámaras si opencv ya lo sabe hacer y 
> > >> además con una API tan sencillo??
> > >>
> > >> Por lo poco que he leído también puede leer varios formatos de video y 
> > >> seguro que imágenes estáticas. Vamos que podemos poner casi todo el 
> > >> soporte de video en este driver.
> > >>
> > >>
> > >>
> > >> El 31 de diciembre de 2008 14:19, Roberto Calvo <rocapal en gsyc.es 
> > >> <mailto:rocapal en gsyc.es>> escribió:
> > >>
> > >>
> > >>     Buenas,
> > >>
> > >>     He estado haciendo pruebas para capturar la imagen de la webcam
> > >>     utilizando software de terceros. No parece que tengamos suficientes
> > >>     recursos para mantener drivers actualizados para webcams usb y
> > >>     firewire.
> > >>
> > >>     He utilizado opencv para realizar estas pruebas desde la
> > >>     arquitectura de
> > >>     JDE. Es bastante sencillo obtener un frame de una imagen (también
> > >>     dispone de funciones para capturar vídeo). Un ejemplo:
> > >>
> > >>      CvCapture* myCapture = NULL;
> > >>      IplImage *frame = NULL;
> > >>
> > >>      // webcam capture started (opencv)
> > >>
> > >>      myCapture =  cvCaptureFromCAM(-1);
> > >>      if (myCapture == NULL)
> > >>      {
> > >>         printf ("Error myCapture == NULL\n");
> > >>         return;
> > >>      }
> > >>
> > >>      /* Config Image Size */
> > >>      cvSetCaptureProperty(myCapture,CV_CAP_PROP_FRAME_WIDTH,320);
> > >>      cvSetCaptureProperty(myCapture,CV_CAP_PROP_FRAME_HEIGHT,240);
> > >>
> > >>      /* Capture frame */
> > >>      frame = cvQueryFrame( myCapture );
> > >>      cvSaveImage("/tmp/prueba.png",frame);
> > >>
> > >>      // webcam capture finished (opencv)
> > >>      cvReleaseCapture(&myCapture);
> > >>
> > >>
> > >>     La imagen que se guarda en frame, es una imagen de 3 canales.
> > >>     Convirtiéndola a una imagen de 4 canales (R,G,B,dummy) tenemos la
> > >>     misma
> > >>     estructura que en JDE para utilizar imágenes.
> > >>
> > >>     Estas pruebas las he realizado con la Philips PCVC740K. Tendré que
> > >>     probar con la logitech a ver si funciona igual de bien.
> > >>
> > >>     Seguiremos probando a ver si puede ser una buena solución para
> > >>     despreocuparnos de drivers usb/firewire.
> > >>
> > >>     un saludete y Feliz Año a todos!!
> > >>
> > >>     --
> > >>     Roberto Calvo Palomino          | Libre Software Engineering Lab
> > >>     (GSyC)
> > >>     Tel: (+34) 91 488 85 23         | Universidad Rey Juan Carlos
> > >>     Tel: (+34) 91 488 81 05         | Edif. Departamental II -
> > >>     Despacho 116
> > >>     rocapal en gsyc.es <mailto:rocapal en gsyc.es>                 |
> > >>     c/Tulipán s/n 28933 Móstoles (Madrid)
> > >>     http://libresoft.es/
> > >>
> > >>     GPG-KEY: http://gsyc.es/~rocapal/rocapal.gpg
> > >>     <http://gsyc.es/%7Erocapal/rocapal.gpg>
> > >>
> > >>     _______________________________________________
> > >>     Jde-developers mailing list
> > >>     Jde-developers en gsyc.es <mailto:Jde-developers en gsyc.es>
> > >>     http://gsyc.escet.urjc.es/cgi-bin/mailman/listinfo/jde-developers
> > >>
> > >>
> > >> ------------------------------------------------------------------------
> > >>
> > >> _______________________________________________
> > >> Jde-developers mailing list
> > >> Jde-developers en gsyc.es
> > >> http://gsyc.escet.urjc.es/cgi-bin/mailman/listinfo/jde-developers
> > >>   
> > >>     
> > >
> > > _______________________________________________
> > > Jde-users mailing list
> > > Jde-users en gsyc.es
> > > http://gsyc.es/cgi-bin/mailman/listinfo/jde-users
> > >
> > >
> > >   
> > 
> > _______________________________________________
> > Jde-users mailing list
> > Jde-users en gsyc.es
> > http://gsyc.es/cgi-bin/mailman/listinfo/jde-users
> _______________________________________________
> Jde-developers mailing list
> Jde-developers en gsyc.es
> http://gsyc.escet.urjc.es/cgi-bin/mailman/listinfo/jde-developers
-- 
http://gsyc.es/jmplaza 
Universidad Rey Juan Carlos




More information about the Jde-developers mailing list