[Jde-dev] Ticket 167
Sara Marugan
s.marugan en alumnos.urjc.es
Sab Ene 31 18:20:30 CET 2009
Si, me pondré con ello próximamente.
JoseMaria escribió:
> Hola mozos,
>
>
>> Por cierto, toda la doc que comentas en tú correo estaría genial si la
>> subimos a alguna sección del wiki, para que quede bien reflejado los
>> cambios y el uso actual del api.
>>
>
> Sip, el sitio natural es la sección del manual de Jde que explica la
> biblioteca progeo. Imagino que Sara está en ello...
>
> Sobre las mejoras que describe Sara en progeo, os cuento un poco más la
> intención, el contexto y la historia del asunto. Progeo es la biblioteca
> que relaciona las imágenes con el espacio tridimensional que observa la
> cámara. Gracias a ella hemo hecho aplicaciones como ElderCare [1] o
> Attention [2], que estiman la posición 3D de una persona o reconstruyen
> en 3D la escena que rodea un par de cámaras.
>
> Hasta ahora usabamos un modelo pinhole [3] para modelar las cámaras.
> Este modelo es relativamente simple y responde a cámaras ideales. Por
> ejemplo es el que siguen las cámaras de OpenGL. Con el calibrador que
> hizo Redo enriquecimos el modelo de cámara: le añadimos el parámetro
> skew, y que las focales en horizontal y en vertical pudieran ser
> diferentes. Con ellos el modelo representa más fielmente a cámaras
> reales, que no encajan en el idílico modelo pinhole.
>
> Hasta ahora el esquema calibrador era el único en usar ese modelo, de
> hecho calculaba los valores de esos parámetros skew, fdistx y fdisty. La
> biblioteca progeo aún no había incorporado ese modelo más rico en sus
> cálculos. Con el parche que ha enviado Sara ya sí lo utiliza y ahora
> todas las aplicaciones que usan progeo pueden beneficiarse de sus
> cálculos más exactos.
>
> Puestos a cambiar el API hemos incluido también varios parámetros de
> distorsión radial para modelar correctamente aún a más cámaras reales.
> De hecho aquellas que presentan ciertos defectos típicos como la
> distorsión tipo barrilete. Esto de momento no lo vamos a implementar en
> el código de la biblioteca, pero hemos dejado abierta la puerta para
> hacerlo en un futuro no muy lejano, sin tener que cambiar el API de
> progeo.
>
> La incorporación de 'rows' y 'columns' obedece a una mala elección en el
> API antiguo. Después de usarlo con cámaras virtuales de distintos
> tamaños, enseguida nos dimos cuenta de que lo natural era incorporar el
> tamaño del fotograma en el modelo de la cámara.
>
> Ánimo,
>
> JoseMaria
> [1] http://jde.gsyc.es/index.php/ElderCare
> [2] http://jde.gsyc.es/index.php/Rocapal_visual_attention_3D
> [3] http://en.wikipedia.org/wiki/Pinhole_camera
>
>
>>> Debido a que el modelo de cámara que teníamos hasta ahora era muy
>>> simplificado, se ha decidido introducir algunos parámetros más en la
>>> estructura que representa una cámara en progeo:
>>>
>>> * rows: número de filas que tiene la imagen de la cámara
>>>
>>> * columns: número de columnas que tiene la imagen de la cámara
>>>
>>> * fdistx: distancia focal x en milímetros
>>>
>>> * fdisty: distancia focal y en milímetros (por defecto la distancia focal
>>> y hará el papel de distancia focal 'a secas' del modelo simplificado
>>> anterior.
>>>
>>> * skew: ángulo entre los ejes x e y de un píxel en radianes. El parámetro
>>> 's' de la matriz 'K' toma valor de la siguiente manera s=skew*fdisty.
>>>
>>> * d1,d2,d3,d4,d5,d6,dx,dy: parámetros que modelan la distorsión radial (de
>>> momento no se van a utilizar).
>>>
>>>
>>> Considerar que el parámetro 's' puede tomar valores distintos de 0 ha
>>> supuesto modificar las fórmulas para hallar la matriz inversa de 'K'
>>> necesaria para backproject, obteniendo las siguientes nuevas relaciones en
>>> la inversa de 'K':
>>>
>>> 1/k11 -k12/(k11·k22) (k12·k23 - k13·k22) / (k22·k11)
>>>
>>> 0 1/k22 -k23/k22
>>>
>>> 0 0 1
>>>
>>> También se ha cambiado el API de la función displayline(), a la que ahora
>>> se le pasa todo la estructura de una cámara.
>>>
>>> documento de texto sencillo adjunto (parche)
>>> Index: schemas/extrinsics/extrinsics.c
>>> ===================================================================
>>> --- schemas/extrinsics/extrinsics.c (revisión: 275)
>>> +++ schemas/extrinsics/extrinsics.c (copia de trabajo)
>>> @@ -366,7 +366,7 @@
>>> fprintf(salida,"FOApositionH %f\n",mycameras[mycam].foa.H);
>>> fprintf(salida,"roll %f\n",mycameras[mycam].roll);
>>> fprintf(salida,"\n #intrinsics\n");
>>> - fprintf(salida,"f %f\n",mycameras[mycam].fdist);
>>> + fprintf(salida,"f %f\n",mycameras[mycam].fdisty);
>>> fprintf(salida,"u0 %f\n",mycameras[mycam].u0);
>>> fprintf(salida,"v0 %f\n",mycameras[mycam].v0);
>>> fclose(salida);
>>> @@ -444,7 +444,7 @@
>>> }
>>> else if (strcmp(word1,"f")==0){
>>> sscanf(buffer_file,"%s %s",word1,word2);
>>> - mycameras[mycam].fdist=(float)atof(word2);
>>> + mycameras[mycam].fdisty=(float)atof(word2);
>>> }
>>> else if (strcmp(word1,"u0")==0){
>>> sscanf(buffer_file,"%s %s",word1,word2);
>>> @@ -453,7 +453,7 @@
>>> else if (strcmp(word1,"v0")==0){
>>> sscanf(buffer_file,"%s %s",word1,word2);
>>> mycameras[mycam].v0=(float)atof(word2);
>>> - }
>>> + }
>>> }
>>> return 1;
>>> }
>>> @@ -726,11 +726,14 @@
>>> mycameras[vcam].foa.Y = 1975.0;
>>> mycameras[vcam].foa.Z = -225.0;
>>> mycameras[vcam].foa.H = 1.;
>>> - mycameras[vcam].fdist = (float)ISIGHT_PINHOLE_FDIST;
>>> + mycameras[vcam].fdisty = (float)ISIGHT_PINHOLE_FDIST;
>>> mycameras[vcam].u0 = (float)ISIGHT_PINHOLE_U0;
>>> mycameras[vcam].v0 = (float)ISIGHT_PINHOLE_V0;
>>> mycameras[vcam].roll = 0.0;
>>> - update_camera_matrix(&mycameras[vcam]);
>>> + mycameras[vcam].skew = 0.0;
>>> + mycameras[vcam].columns = SIFNTSC_COLUMNS;
>>> + mycameras[vcam].rows = SIFNTSC_ROWS;
>>> + update_camera_matrix(&mycameras[vcam]);
>>> }
>>>
>>>
>>> @@ -749,7 +752,7 @@
>>> fl_set_slider_value(fd_extrinsicsgui->roll_slider,(double)((mycameras[mycam].roll*360)/(2*PI)));
>>>
>>> /* intrinsics */
>>> - fl_set_slider_value(fd_extrinsicsgui->focus_slider,(double)mycameras[mycam].fdist);
>>> + fl_set_slider_value(fd_extrinsicsgui->focus_slider,(double)mycameras[mycam].fdisty);
>>> fl_set_slider_value(fd_extrinsicsgui->u0,(double)mycameras[mycam].u0);
>>> fl_set_slider_value(fd_extrinsicsgui->v0,(double)mycameras[mycam].v0);
>>> }
>>> @@ -862,7 +865,7 @@
>>>
>>> }else if(obj == fd_extrinsicsgui->focus_slider){ /* FOCUS DISTANCE SLIDER */
>>>
>>> - mycameras[mycam].fdist=(float) fl_get_slider_value(fd_extrinsicsgui->focus_slider);
>>> + mycameras[mycam].fdisty=(float) fl_get_slider_value(fd_extrinsicsgui->focus_slider);
>>> update_camera_matrix(&mycameras[mycam]);
>>> /*mydebug();*/
>>>
>>> @@ -940,7 +943,7 @@
>>> else return -1;
>>> }
>>>
>>> -int virtual_drawline(HPoint2D p1, HPoint2D p2, FL_COLOR colour)
>>> +int virtual_drawline(HPoint2D p1, HPoint2D p2, FL_COLOR colour, TPinHoleCamera camera)
>>> /* it takes care of important features */
>>> /* before/behind the focal plane, inside/outside the image frame */
>>> {
>>> @@ -953,7 +956,7 @@
>>> return 0;
>>> }
>>>
>>> -int drawline(HPoint2D p1, HPoint2D p2, FL_COLOR colour)
>>> +int drawline(HPoint2D p1, HPoint2D p2, FL_COLOR colour, TPinHoleCamera camera)
>>> /* it takes care of important features */
>>> /* before/behind the focal plane, inside/outside the image frame */
>>> {
>>> @@ -1005,7 +1008,7 @@
>>> for(i=0;i<room_lines;i++){
>>> project(room[i*2+0],&a,mycameras[mycam]);
>>> project(room[i*2+1],&b,mycameras[mycam]);
>>> - drawline(a,b,FL_RED);
>>> + drawline(a,b,FL_RED,mycameras[mycam]);
>>> }
>>> /* cross at the optical center */
>>> fila=SIFNTSC_ROWS-1-(int)mycameras[mycam].u0;
>>> @@ -1091,7 +1094,7 @@
>>> H2.Z=0;
>>> project(H1,&a,mycameras[mycam]);
>>> project(H2,&b,mycameras[mycam]);
>>> - drawline(a,b,FL_GREEN);
>>> + drawline(a,b,FL_GREEN,mycameras[mycam]);
>>>
>>> /* rendering of virtual image */
>>> /* reset_virtual_buffer */
>>> @@ -1107,47 +1110,47 @@
>>> backproject(&a3A,a,mycameras[mycam]);
>>> project(a3A,&a,mycameras[vcam]);
>>> project(mycameras[mycam].position,&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_DEEPPINK);
>>> + virtual_drawline(a,b,FL_DEEPPINK,mycameras[mycam]);
>>> a.x=0.;
>>> a.y=SIFNTSC_COLUMNS-1.;
>>> a.h=1.;
>>> backproject(&a3B,a,mycameras[mycam]);
>>> project(a3B,&a,mycameras[vcam]);
>>> project(mycameras[mycam].position,&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_DEEPPINK);
>>> + virtual_drawline(a,b,FL_DEEPPINK,mycameras[mycam]);
>>> a.x=0.;
>>> a.y=0.;
>>> a.h=1.;
>>> backproject(&a3C,a,mycameras[mycam]);
>>> project(a3C,&a,mycameras[vcam]);
>>> project(mycameras[mycam].position,&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_DEEPPINK);
>>> + virtual_drawline(a,b,FL_DEEPPINK,mycameras[mycam]);
>>> a.x=SIFNTSC_ROWS-1.;
>>> a.y=0.;
>>> a.h=1.;
>>> backproject(&a3D,a,mycameras[mycam]);
>>> project(a3D,&a,mycameras[vcam]);
>>> project(mycameras[mycam].position,&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_DEEPPINK);
>>> + virtual_drawline(a,b,FL_DEEPPINK,mycameras[mycam]);
>>>
>>> project(a3A,&a,mycameras[vcam]);
>>> project(a3B,&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_DEEPPINK);
>>> + virtual_drawline(a,b,FL_DEEPPINK,mycameras[mycam]);
>>> project(a3B,&a,mycameras[vcam]);
>>> project(a3C,&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_DEEPPINK);
>>> + virtual_drawline(a,b,FL_DEEPPINK,mycameras[mycam]);
>>> project(a3C,&a,mycameras[vcam]);
>>> project(a3D,&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_DEEPPINK);
>>> + virtual_drawline(a,b,FL_DEEPPINK,mycameras[mycam]);
>>> project(a3D,&a,mycameras[vcam]);
>>> project(a3A,&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_DEEPPINK);
>>> + virtual_drawline(a,b,FL_DEEPPINK,mycameras[mycam]);
>>>
>>> /* room in virtual camera */
>>> for(i=0;i<room_lines;i++){
>>> project(room[i*2+0],&a,mycameras[vcam]);
>>> project(room[i*2+1],&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_BLACK);
>>> + virtual_drawline(a,b,FL_BLACK,mycameras[mycam]);
>>> }
>>>
>>> /* Draw XY, XZ, YZ grids */
>>> @@ -1155,28 +1158,28 @@
>>> {
>>> project(gridXY[2*i],&a,mycameras[vcam]);
>>> project(gridXY[2*i+1],&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_RED);
>>> + virtual_drawline(a,b,FL_RED,mycameras[mycam]);
>>> project(gridXY[2*SLOTS+2*i],&a,mycameras[vcam]);
>>> project(gridXY[2*SLOTS+2*i+1],&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_RED);
>>> + virtual_drawline(a,b,FL_RED,mycameras[mycam]);
>>> }
>>> for(i=0;i<SLOTS;i++)
>>> {
>>> project(gridYZ[2*i],&a,mycameras[vcam]);
>>> project(gridYZ[2*i+1],&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_PALEGREEN);
>>> + virtual_drawline(a,b,FL_PALEGREEN,mycameras[mycam]);
>>> project(gridYZ[2*SLOTS+2*i],&a,mycameras[vcam]);
>>> project(gridYZ[2*SLOTS+2*i+1],&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_PALEGREEN);
>>> + virtual_drawline(a,b,FL_PALEGREEN,mycameras[mycam]);
>>> }
>>> for(i=0;i<SLOTS;i++)
>>> {
>>> project(gridXZ[2*i],&a,mycameras[vcam]);
>>> project(gridXZ[2*i+1],&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_BLUE);
>>> + virtual_drawline(a,b,FL_BLUE,mycameras[mycam]);
>>> project(gridXZ[2*SLOTS+2*i],&a,mycameras[vcam]);
>>> project(gridXZ[2*SLOTS+2*i+1],&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_BLUE);
>>> + virtual_drawline(a,b,FL_BLUE,mycameras[mycam]);
>>> }
>>>
>>> /* camera axis in virtual camera */
>>> @@ -1186,21 +1189,21 @@
>>> relativas2absolutas(XaxisRel,&Xaxis);
>>> project(mycameras[mycam].position,&a,mycameras[vcam]);
>>> project(Xaxis,&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_PALEGREEN);
>>> + virtual_drawline(a,b,FL_PALEGREEN,mycameras[mycam]);
>>> relativas2absolutas(YaxisRel,&Yaxis);
>>> project(mycameras[mycam].position,&a,mycameras[vcam]);
>>> project(Yaxis,&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_BLUE);
>>> + virtual_drawline(a,b,FL_BLUE,mycameras[mycam]);
>>> relativas2absolutas(ZaxisRel,&Zaxis);
>>> project(mycameras[mycam].position,&a,mycameras[vcam]);
>>> project(Zaxis,&b,mycameras[vcam]);
>>> - virtual_drawline(a,b,FL_RED);
>>> + virtual_drawline(a,b,FL_RED,mycameras[mycam]);
>>>
>>> /*cameras axis*/
>>> project(mycameras[mycam].position,&a,mycameras[vcam]);
>>> project(mycameras[mycam].foa,&b,mycameras[vcam]);
>>> /*FL_WHEAT,FL_PALEGREEN*/
>>> - virtual_drawline(a,b,FL_RED);
>>> + virtual_drawline(a,b,FL_RED,mycameras[mycam]);
>>>
>>>
>>>
>>> Index: libs/progeo/progeo.h
>>> ===================================================================
>>> --- libs/progeo/progeo.h (revisión: 275)
>>> +++ libs/progeo/progeo.h (copia de trabajo)
>>> @@ -47,12 +47,18 @@
>>> HPoint3D position; /* camera 3d position in mm */
>>> HPoint3D foa; /* camera 3d focus of attention in mm */
>>> float roll; /* camera roll position angle in rads */
>>> - float fdist; /* focus distance in mm*/
>>> + float fdistx; /* focus x distance in mm*/
>>> + float fdisty; /* focus y distance in mm*/
>>> float u0,v0; /* pixels */
>>> + float skew; /*angle between the x and y pixel axes in rads*/
>>> + int rows; /* image height in pixels */
>>> + int columns; /* image width in pixels */
>>> /* camera K matrix */
>>> float k11,k12,k13,k14,k21,k22,k23,k24,k31,k32,k33,k34;
>>> /* camera rotation + translation matrix */
>>> float rt11,rt12,rt13,rt14,rt21,rt22,rt23,rt24,rt31,rt32,rt33,rt34,rt41,rt42,rt43,rt44;
>>> + /* distorsion parameters */
>>> + float d1,d2,d3,d4,d5,d6,dx,dy;
>>> /* top right and bottom left points */
>>> HPoint3D tr, bl;
>>> /* name */
>>> @@ -77,5 +83,5 @@
>>> extern void update_stereocamera_matrix(TPinHoleStereocamera *stereo);
>>> extern int project(HPoint3D in, HPoint2D *out, TPinHoleCamera camera);
>>> extern int backproject(HPoint3D *out, HPoint2D in, TPinHoleCamera camera);
>>> -extern int displayline(HPoint2D p1, HPoint2D p2, HPoint2D *a, HPoint2D *b);
>>> +extern int displayline(HPoint2D p1, HPoint2D p2, HPoint2D *a, HPoint2D *b, TPinHoleCamera camera);
>>> extern void display_camerainfo(TPinHoleCamera camera);
>>> Index: libs/progeo/progeo.c
>>> ===================================================================
>>> --- libs/progeo/progeo.c (revisión: 275)
>>> +++ libs/progeo/progeo.c (copia de trabajo)
>>> @@ -23,10 +23,6 @@
>>> #include <math.h>
>>> #include <stdio.h>
>>>
>>> -/* SIF image size */
>>> -#define SIFNTSC_ROWS 240
>>> -#define SIFNTSC_COLUMNS 320
>>> -
>>> #define PI 3.141592654
>>>
>>> int debug=0;
>>> @@ -116,13 +112,13 @@
>>> camera->rt44=1.;
>>>
>>> /* intrinsics parameters */
>>> - camera->k11=camera->fdist; camera->k12=0.; camera->k13=camera->u0; camera->k14=0.;
>>> - camera->k21=0.; camera->k22=camera->fdist; camera->k23=camera->v0; camera->k24=0.;
>>> + camera->k11=camera->fdisty; camera->k12=camera->skew*camera->fdisty; camera->k13=camera->u0; camera->k14=0.;
>>> + camera->k21=0.; camera->k22=camera->fdisty; camera->k23=camera->v0; camera->k24=0.;
>>> camera->k31=0.; camera->k32=0.; camera->k33=1.; camera->k34=0.;
>>>
>>> if (debug==1) printf("Camera %s Located at (%.f,%.f,%.f)\n",camera->name,camera->position.X,camera->position.Y,camera->position.Z);
>>> if (debug==1) printf("Camera %s Orientation: pointing towards FocusOfAtention (%.f,%.f,%.f), roll (%.f)\n",camera->name,camera->foa.X,camera->foa.Y,camera->foa.Z,camera->roll*360./(2*PI));
>>> - if (debug==1) printf("Camera %s f= %.5f y0=%d x0=%d\n",camera->name,camera->fdist,(int)camera->v0,(int)camera->u0);
>>> + if (debug==1) printf("Camera %s f= %.5f y0=%d x0=%d\n",camera->name,camera->fdisty,(int)camera->v0,(int)camera->u0);
>>> if (debug==1) printf("Camera %s K matrix\n %.3f %.1f %.1f %.1f\n %.1f %.3f %.1f %.1f\n %.1f %.1f %.1f %.1f\n",camera->name,camera->k11,camera->k12,camera->k13,camera->k14,camera->k21,camera->k22,camera->k23,camera->k24,camera->k31,camera->k32,camera->k33,camera->k34);
>>> if (debug==1) printf("Camera %s RT matrix\n %.1f %.1f %.1f %.1f\n %.1f %.1f %.1f %.1f\n %.1f %.1f %.1f %.1f\n %.1f %.1f %.1f %.1f\n",camera->name,camera->rt11,camera->rt12,camera->rt13,camera->rt14,camera->rt21,camera->rt22,camera->rt23,camera->rt24,camera->rt31,camera->rt32,camera->rt33,camera->rt34,camera->rt41,camera->rt42,camera->rt43,camera->rt44);
>>> }
>>> @@ -243,7 +239,9 @@
>>> myin.x=in.x*camera.k11/in.h;
>>> myin.y=in.y*camera.k11/in.h;
>>>
>>> - ik11=(1./camera.k11); ik12=0.; ik13=-(camera.k13/camera.k11);
>>> + ik11=(1./camera.k11);
>>> + ik12=-camera.k12/(camera.k11*camera.k22);
>>> + ik13=(camera.k12*camera.k23-camera.k13*camera.k22)/(camera.k22*camera.k11);
>>> ik21=0.; ik22=(1./camera.k22); ik23=-(camera.k23/camera.k22);
>>> ik31=0.; ik32=0.; ik33=1.;
>>>
>>> @@ -286,7 +284,7 @@
>>>
>>> /* if p1 and p2 can't be drawed in a 320x240 image, then it will return 0.
>>> otherwise it will return 1 and gooda & goodb will be the correct points in the image to be drawn */
>>> -int displayline(HPoint2D p1, HPoint2D p2, HPoint2D *a, HPoint2D *b)
>>> +int displayline(HPoint2D p1, HPoint2D p2, HPoint2D *a, HPoint2D *b, TPinHoleCamera camera)
>>> /* it takes care of important features: before/behind the focal plane, inside/outside the image frame */
>>> {
>>>
>>> @@ -296,7 +294,7 @@
>>> float Xmax,Xmin,Ymax,Ymin;
>>> float papb=0.;
>>>
>>> - Xmin=0.; Xmax=SIFNTSC_ROWS-1.; Ymin=0.; Ymax=SIFNTSC_COLUMNS-1.;
>>> + Xmin=0.; Xmax=camera.rows-1.; Ymin=0.; Ymax=camera.columns-1.;
>>> /* Watchout!: they can't reach 240 or 320, their are not valid values for the pixels */
>>>
>>> l0.x=0.; l0.y=1.; l0.h=-Ymin;
>>> @@ -547,7 +545,7 @@
>>> printf("Camera %s\n\n",camera.name);
>>> printf(" Position: (X,Y,Z,H)=(%.1f,%.1f,%.1f,%.1f)\n",camera.position.X,camera.position.Y,camera.position.Z,camera.position.H);
>>> printf(" Focus of Attention: (x,y,z,h)=(%.1f,%.1f,%.1f,%.1f)\n\n",camera.foa.X,camera.foa.Y,camera.foa.Z,camera.foa.H);
>>> - printf(" Focus Distance: %.1f mm\n",camera.fdist);
>>> + printf(" Focus Distance: %.1f mm\n",camera.fdisty);
>>> printf(" Optical Center: (x,y)=(%.1f,%.1f)\n\n",camera.u0,camera.v0);
>>> printf(" K Matrix: | %.1f %.1f %.1f %.1f |\n",camera.k11,camera.k12,camera.k13,camera.k14);
>>> printf(" | %.1f %.1f %.1f %.1f |\n",camera.k21,camera.k22,camera.k23,camera.k24);
>>> _______________________________________________
>>> Jde-developers mailing list
>>> Jde-developers en gsyc.es
>>> http://gsyc.escet.urjc.es/cgi-bin/mailman/listinfo/jde-developers
>>>
>> --
>> Roberto Calvo Palomino | Libre Software Engineering Lab (GSyC)
>> Tel: (+34) 91 488 85 23 | Universidad Rey Juan Carlos
>> Tel: (+34) 91 488 81 05 | Edif. Departamental II - Despacho 116
>> rocapal en gsyc.es | c/Tulipán s/n 28933 Móstoles (Madrid)
>> http://libresoft.es/
>>
>> GPG-KEY: http://gsyc.es/~rocapal/rocapal.gpg
>> _______________________________________________
>> Jde-developers mailing list
>> Jde-developers en gsyc.es
>> http://gsyc.escet.urjc.es/cgi-bin/mailman/listinfo/jde-developers
>>
More information about the Jde-developers
mailing list