<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<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;
}
}
}</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<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;
        
}
}</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->pixelData[3*i+1]<<8)|(int)imageDataDepth->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>