<span style="border-collapse:collapse;color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">Hola a todos,<div><br></div><div>escribo este mail para tratar dos temas:</div><div><br></div>
<div>    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í: <a href="https://svn.jderobot.org/users/jj.garciac21/pfc/trunk/src/kinectPlugin/" style="color:rgb(17,85,204)" target="_blank">https://svn.jderobot.org/users/jj.garciac21/pfc/trunk/src/kinectPlugin/</a> 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: <a href="https://svn.jderobot.org/users/jj.garciac21/pfc/trunk/worlds/kinect_simple.world" style="color:rgb(17,85,204)" target="_blank">https://svn.jderobot.org/users/jj.garciac21/pfc/trunk/worlds/kinect_simple.world</a></div>


<div><br></div><div>   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:</div><div>


<span style="font-family:Times;font-size:medium"><pre style="white-space:pre-wrap;word-wrap:break-word">void depth2rgb( const XnDepthPixel*  Xn_disparity, cv::Mat image){
   int i;
   //const unsigned short *disparity = Xn_disparity;
    
   for (i=0; i&lt;image.rows* image.cols; i++) {
      //std::cout &lt;&lt; i &lt;&lt; std::endl;
      int pval = depth[Xn_disparity[i]];
      int lb = pval &amp; 0xff;
      switch (pval&gt;&gt;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;
      }
   }
}</pre><pre style="white-space:pre-wrap;word-wrap:break-word">he percibido que mediante este método no se están dando los valores reales de profundidad, por ello propongo el siguiente método:</pre><pre style="white-space:pre-wrap;word-wrap:break-word">
<br></pre></span><span style="font-family:Times;font-size:medium"><pre style="white-space:pre-wrap;word-wrap:break-word">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&lt;image.rows* image.cols; i++) {
      //std::cout &lt;&lt; i &lt;&lt; std::endl;
      int val = (int)(data[i]*1000);
                  imageDepth.data[3*i+0] = (float)val/10000*255;;
                  imageDepth.data[3*i+1] = val&gt;&gt;8;
                  imageDepth.data[3*i+2] = val&amp;0xff;
            
   }
}</pre><pre style="white-space:pre-wrap;word-wrap:break-word"><br></pre><pre style="white-space:pre-wrap;word-wrap:break-word">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:</pre>


<pre style="white-space:pre-wrap;word-wrap:break-word"><br></pre></span><span style="font-family:Times;font-size:medium"><pre style="white-space:pre-wrap;word-wrap:break-word">  float Control::get_distance(int i)
  {
    float distance= ((int)imageDataDepth-&gt;pixelData[3*i+1]&lt;&lt;8)|(int)imageDataDepth-&gt;pixelData[3*i+2];
    return distance;
  }</pre></span></div><div>Comentadme que os parecen estos dos temas.</div><div><br></div><div>Un saludo</div><div><br></div><div>Juanjo</div><div><br></div><div><br></div></span>