[Jderobot-dev] Plugin para kinect en gazebo 1.4, posible cambio en imagen de profundidad para kinectServer

Juan José García Cantero jj.garciac21 en gmail.com
Vie Mar 15 21:28:14 CET 2013


Hola a todos,

escribo este mail para tratar dos temas:

    I. Si habéis probado el kinectPlugin del repositorio oficial jderobot
veréis que en Gazebo 1.4 para Ubuntu 12.04 este plugin no funciona
correctamente, esto es debido a la incompatibilidad con las librerías de
anteriores versiones de Ubuntu, para solucionar esto propongo el plugin que
yo mismo he remodelado, podéis encontrarlo aquí:
https://svn.jderobot.org/users/jj.garciac21/pfc/trunk/src/kinectPlugin/echadle
un vistazo y decid que os parece. Además aquí tenéis un mundo para
utilizar este plugin en gazebo 1.3 o superiores:
https://svn.jderobot.org/users/jj.garciac21/pfc/trunk/worlds/kinect_simple.world

   II. A la hora de servir la imagen de profundidad tanto en kinectServer
como en el kinectPlugin se esta utilizando el siguiente método para hacer
la conversión de distancia a componentes RGB:

void depth2rgb( const XnDepthPixel*  Xn_disparity, cv::Mat image){
   int i;
   //const unsigned short *disparity = Xn_disparity;

   for (i=0; i<image.rows* image.cols; i++) {
      //std::cout << i << std::endl;
      int pval = depth[Xn_disparity[i]];
      int lb = pval & 0xff;
      switch (pval>>8) {
	      case 0:
		      image.data[3*i+0] = 255;
		      image.data[3*i+1] = 255-lb;
		      image.data[3*i+2] = 255-lb;
		      break;
	      case 1:
		      image.data[3*i+0] = 255;
		      image.data[3*i+1] = lb;
		      image.data[3*i+2] = 0;
		      break;
	      case 2:
		      image.data[3*i+0] = 255-lb;
		      image.data[3*i+1] = 255;
		      image.data[3*i+2] = 0;
		      break;
	      case 3:
		      image.data[3*i+0] = 0;
		      image.data[3*i+1] = 255;
		      image.data[3*i+2] = lb;
		      break;
	      case 4:
		      image.data[3*i+0] = 0;
		      image.data[3*i+1] = 255-lb;
		      image.data[3*i+2] = 255;
		      break;
	      case 5:
		      image.data[3*i+0] = 0;
		      image.data[3*i+1] = 0;
		      image.data[3*i+2] = 255-lb;
		      break;
	      default:
		      image.data[3*i+0] = 0;
		      image.data[3*i+1] = 0;
		      image.data[3*i+2] = 0;
		      break;
      }
   }
}

he percibido que mediante este método no se están dando los valores
reales de profundidad, por ello propongo el siguiente método:


void KinectPlugin::depth2rgb(cv::Mat image){
   //const unsigned short *disparity = Xn_disparity;
   imageDepth.create(image.rows,image.cols,CV_8UC3);
   float * data= (float*)image.data;
   for (int i=0; i<image.rows* image.cols; i++) {
      //std::cout << i << std::endl;
      int val = (int)(data[i]*1000);
		  imageDepth.data[3*i+0] = (float)val/10000*255;;
		  imageDepth.data[3*i+1] = val>>8;
		  imageDepth.data[3*i+2] = val&0xff;
	
   }
}


en este dividimos la distancia dada en un int con rango de 0 10000 en
dos bytes el de mas peso le metemos en el componente g, y el de menos
peso en el componente b de la imagen, ademas tenemos la componente r
para mandar el valor de la distancia en escala de grises para mostrar
si se quisiera la imagen directamente, un método para volver a tomar
el dato de distancia en su formato original podría ser este:


  float Control::get_distance(int i)
  {
    float distance=
((int)imageDataDepth->pixelData[3*i+1]<<8)|(int)imageDataDepth->pixelData[3*i+2];
    return distance;
  }

Comentadme que os parecen estos dos temas.

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


More information about the Jde-developers mailing list