[Jderobot] Duda cameraview

Oscar Garcia oscar.robotica en linaresdigital.com
Mie Mar 12 21:14:43 CET 2014


El 12/03/14 20:31, Edgar Barrero Mateo escribió:
> Quizá es una duda tonta la que planteo pero bueno. ¿que devuelve en cada
> petición Ice cameraview? Es un array de pixeles RGB?¿que formato
> exactamente tiene esa imagen?


Todo depende del componente que envíe la imagen. En mi caso yo envío 
desde Android imágenes en formato NV21.



> ¿Otra pregunta en el mismo sentido es qué devuelve exactamente
> pclRGBDServer?


A esto no te voy a responder, pero te animo que consultes el código de 
la interfaz:
http://svn.jderobot.org/jderobot/trunk/src/stable/interfaces/slice/jderobot/



> Y por último y para no tener que volver a hacer preguntas tan simples,
> ¿Hay algún sitio donde encontrar algun manual o explicación de cada
> componente?


Lo mejor es consultar directamente el código. Comprobarás que están muy 
documentados y casi todo el código es autoexplicativo.

Ejemplo:
http://svn.jderobot.org/jderobot/trunk/src/stable/interfaces/slice/jderobot/image.ice

   /**
    * A single image served as a sequence of bytes
    */
   class ImageData
   {
     Time timeStamp; /**< TimeStamp of Data */
     ImageDescription description; /**< ImageDescription of Data, for convienence purposes */
     ByteSeq pixelData; /**< The image data itself. The structure of this byte sequence
			  depends on the image format and compression. */
   };


Tal y como puedes ver la imagen en sí es una secuencia de bytes sin 
ningún formato en particular. El formato en el que se envía esa 
secuencia de bytes está definido en:

   /**
    *  Static description of the image source.
    */
   class ImageDescription
   {
     int width; /**< %Image width [pixels] */
     int height;/**< %Image height [pixels] */
     int size;/**< %Image size [bytes] */
     string format; /**< %Image format string */
   };


Es decir, en la descripción de la imagen (y no en los datos de la 
imagen) se indica en qué formato están los datos.

Yo implementé en colorspaces un conversor de NV21 (el formato nativo de 
Android) a RGB:
http://svn.jderobot.org/jderobot/tags/Jderobot-5.2.0/src/libs/colorspaces/imagecv.cpp

const Image::FormatPtr ImageNV21::FORMAT_NV21 = Image::Format::createFormat("NV21",CV_8UC2,&ImageNV21::createInstance,&ImageNV21::imageCvt);



Ahora se usan otros métodos para convertir esa secuencia de bytes (sea 
cual sea el formato) a RGB (8 bits por canal y 3 canales). Si miras el 
código de introrob:
http://svn.jderobot.org/jderobot/trunk/src/stable/components/introrob/control.cpp

     void Control::createImage(Api *api) {
         cvReleaseImage(&image);
         this->image = cvCreateImage(cvSize(api->imageData1->description->width, api->imageData1->description->height), 8, 3);

         memcpy((unsigned char *) image->imageData, &(api->imageData1->pixelData[0]), image->width * image->height * 3);
/*
         colorspaces::Image::FormatPtr fmt = colorspaces::Image::Format::searchFormat(api->imageData1->description->format);

         if (!fmt)
             throw "Format not supported";
*/
         api->imgBuff =
                 Gdk::Pixbuf::create_from_data((const guint8*) this->image->imageData,
                 Gdk::COLORSPACE_RGB,
                 false,
                 this->image->depth,
                 this->image->width,
                 this->image->height,
                 this->image->widthStep);

     }


Si usas introrob como base obtendrás la imagen en formato RGB preparada 
para ser analizada. Mira este ejemplo:
http://svn.jderobot.org/jderobot/trunk/src/stable/components/introrob/MyAlgorithms.cpp

         imageCameras2openCV(); //Esta función es necesario llamarla ANTES de trabajar con las imágenes de las cámaras.
         IplImage src = *this->imageCameraLeft; //Imagen de la cámara izquierda

         for (i = 0; i < src.width; i++) {
             for (j = 0; j < src.height; j++) {
                 if (((int) (unsigned char) src.imageData[(j * src.width + i) * src.nChannels] > 120) &&
                         ((int) (unsigned char) src.imageData[(j * src.width + i) * src.nChannels + 1] < 70) &&
                         ((int) (unsigned char) src.imageData[(j * src.width + i) * src.nChannels + 2] < 70)) {
                     cont++;
                     src.imageData[(j * src.width + i) * src.nChannels] = 255; //R
                     src.imageData[(j * src.width + i) * src.nChannels + 1] = 255; //G
                     src.imageData[(j * src.width + i) * src.nChannels + 2] = 0; //B
                 }
             }
         }



Espero que te haya servido de guía (más que ayuda).

Un saludo.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://gsyc.escet.urjc.es/pipermail/jde-developers/attachments/20140312/5d5d7147/attachment.htm 


More information about the Jde-developers mailing list