[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