Le blog de Jean David TECHER, un Réunionnais à Saint-Priest/Lyon

Aller au contenu | Aller au menu | Aller à la recherche


< 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 >

dimanche 15 avril 2007

Le projet Helium en C/C++: exemples de traitement d'image avec détection de contour

C'est vraiment par hasard que hier soir je suis tombé sur le site de du projet Helium http://www.lif-sud.univ-mrs.fr/~thiel/helium. Comme décrit pour l'installation, il suffit de faire/

./Configure
Comme indiqué, il suffit de saisir les y ou n pour répondre aux questions posées. Je me suis ensuite rendu à http://www.lif-sud.univ-mrs.fr/~thiel/ens/ima/index.html pour les exemples de traitement d'image. J'ai téléchargé l'exemple avec hystéreris. qui nécessite comme expliqué les fichiers bsutil.c et bsutil.h. Tout ces fichiers, je les ai placés dans le répertoire des sources de helium
for file in bsutil.h bsutil.c hyster-cor.c;do wget http://www.lif-sud.univ-mrs.fr/~thiel/ens/ima/${file};done
et pour compiler
cc hyster-cor.c bsutil.c -o hyster-cor $(./helium-cfg --cflags --libs) -lm
J'ai ensuite utilisé cette image issue de ma Webcam. L'image en niveaux de gris, je l'ai obtenu en ouvrant l'image avec GIMP, puis menu->image->mode->niveaux de gris et en sauveagardant l'image au format PGM.

Image originale

Image en niveaud de gris
En faisant
./hyster-cor snapshot.pgm
obn obtient par l'exemple la détection de contour suivant en jouant sur les seuils

Exemple de détection de contour.
Tout ça me rappelle mon stage de DEA - houla c'est vieux tout ça - sur la détection de droite en imagerie avec les méthodes du traitement d'antenne en MatLab et C++. Bon je matterais le code de Helium en semaine. Ca me fera des révsions.

lundi 9 avril 2007

Un petit importateur x3dTopgsql en C++ made by myself

PRE-REQUIS

Choix d'un parser(léger) XML en C++: TinyXML

J'ai recherché sur le Web des importateurs de données x3d vers postgis. Je n'ai rien trouvé pour le moment. La première chose que j'ai faite a donc été de trouver un parser c++ assez léger. Je me suis tournée pour celà vers TinyXML dont le site est http://tinyxml.sourceforge.net. Son installation n'a rien de compliquer

make
Installer la version de PostGIS modifié
A l'heure de la rédaction de ce billet, aucun patch officiel pour le moment dans le SVN de PostGIS n'a encore été envisagé pour la fonctionnalité AsX3D(). Pour l'installer, on peut se servir de mon repository disponible à http://www.davidgis.fr/download/postgis-svn-20070405.tar.gz Pour se faire, j'ai dû modifier légèrement le patch de Olivier et de David de la ligne 148 à 152 du fichier lwgeom/lwgeom_x3d.c
	/* -1 value are ignored (could be a way to code postgis-users@postgis.refractions.net>
		   various faces dimension in Postgres array) */
		//if (value != -1)
		//{
			j++;
			sprintf(buf,"%i,",value);
			add_str_simple(buf_face, buf);
		//}
Le programme

En examinant le tutorial proposé sur le même site, je suis donc parti d'un programme déjà proposé par l'auteur. Je l'ai agrémenté à ma sauce pour pouvoir le rendre compatible avec mes objectifs. J'avoue j'ai passé une bonne partie de la nuit à le faire - je n'avais pas fait de C++ depuis au moins 5 ans -. Le programme est à http://www.davidgis.fr/download/x3dtopgsql.cpp. Pour le compiler, il faut le mettre dans les sources de tinyxml, et faire

g++ -c -Wall -Wno-format -g -DDEBUG  -DTIXML_USE_STL x3dtopgsql.cpp -o x3dtopgsql.o
g++ -o x3dtopgsql -g tinyxml.o tinyxmlparser.o x3dtopgsql.o tinyxmlerror.o tinystr.o

Et pour l'utiliser par exemple:

x3dtopgsql [fichier.x3d] [table]
  1. [fichier.x3d] est le nom du fichier .x3d que l'on souhaite importer;
  2. [table] est le nom de la table qui sera associée et crée dans la base.
Bon là, il m'a fallut deux machines, une sous Windows et une sous GNU/Linux. Pour commencer, je me suis amuser avec Google Sketchup à créer une petite maison que j'ai ensuite exporter en fichier .kmz. Je l'ai ensuite dézippé sous GNU/Linux. J'ai ensuite remis le fichier doc.kml sous Windows. KML2X3D me l'a exporté proprement. L'importation dans PostGIS s'est faite en faisant
cd /mnt/sources/tinyxxml
./x3dtopgsql doc.x3d maison | psql -U postgres testgis
aura pour effet de me générer les instructions SQL suivantes
SELECT DropGeometryTable('maison');
BEGIN TRANSACTION;
CREATE TABLE maison (id SERIAL PRIMARY KEY,vertices integer[]);
SELECT AddGeometryColumn('maison','the_geom',-1,'MULTIPOINT',3);
INSERT INTO maison(id,vertices,the_geom) values 
(0,array[[0,1,2,3,4,-1,...,...-1,24,25,14,15,23,-1,25,24,20,19,-]],GeomFromEWKT('SRID=-1;MULTIPOINT((...)'));

INSERT INTO maison(id,vertices,the_geom) values 
(1,array[[0,1,-1,2,3,-1,...,...,1,86,87,-1,88,89,-1,90,91,-1,92,93,-]],GeomFromEWKT('SRID=-1;MULTIPOINT(...)'));

END TRANSACTION;
En recrachant rapidement les lignes obtenues par AsX3D():
SELECT AsX3D(the_geom,vertices) from maison limit 1;
 <IndexedFaceSet coordIndex='0,1,2,3,4,-1,...,-1,25,24,20,19,-1'>
 <Coordinate point='5.924419 0 -3.077384,5.879113 0 -17.345828,...,16.230912 8.780875 -17.868433'/>
 </IndexedFaceSet>
dans un fichier x3d, - faudra que je pense à automatiser tout ça -, avec freewrl on obtient par exemple les belles screenshots suivantes

Ma petite maison vu de face.


Ma petite maison vu d'en haut.
Le contenu de mon fichier x3d sera par exemple
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd">
<X3D version="3.0" profile="Immersive" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="http://www.web3d.org/specifications/x3d-3.0.xsd">
<Scene>
<Background groundColor="0.057 0.221 0.4" skyColor="0.057 0.221 0.4" />
	<Shape>
			<Appearance >

				<Material DEF='test'  diffuseColor='1.000000 1.000000 1.000000' transparency='-0.000000'/>

			</Appearance>
 <IndexedFaceSet coordIndex='0,1,2,3,4,-1,5,6,7,8,9,-1,1,0,6,5,-1,2,1,5,9,-1,4,3,8,7,-1,0,4,7,6,-1,2,10,11,3,-1,12,9,8,13,-1,10,2,9,12,14,-1,13,15,14,12,-1,3,11,15,13,8,-1,3,2,9,8,-1,16,11,10,17,18,-1,11,10,14,15,-1,17,10,14,19,-1,18,17,19,20,-1,7,21,6,-1,22,5,6,21,-1,9,22,21,7,8,-1,22,9,5,-1,15,23,20,19,14,-1,11,16,23,15,-1,16,18,20,23,-1,20,24,23,-1,25,19,14,-1,24,25,14,15,23,-1,25,24,20,19,-1'>
 <Coordinate point='5.924419 0 -3.077384,5.879113 0 -17.345828,8.63502 0 -17.354579,8.651169 0 -12.268231,8.680321 0 -3.086135,5.879113 5.6515 -17.345828,5.924419 5.6515 -3.077384,8.680321 5.6515 -3.086135,8.651169 5.6515 -12.268231,8.63502 5.6515 -17.354579,14.858036 0 -17.374334,14.87418 0 -12.287986,14.858036 5.6515 -17.374334,14.87418 5.6515 -12.287986,14.858036 5.63245 -17.374334,14.87418 5.63245 -12.287986,14.905019 0 -2.57249,18.299745 0 -17.385257,18.346721 0 -2.583413,18.299745 5.63245 -17.385257,18.346721 5.63245 -2.583413,7.37257 8.73204 -3.081982,7.32769 8.73204 -17.217077,14.905019 5.63245 -2.57249,16.279447 8.780875 -2.576852,16.230912 8.780875 -17.868433'/>
 </IndexedFaceSet>
	</Shape>
<Viewpoint DEF='doc Front' position='12.112917 4.390437 16.128923' jump='true' centerOfRotation='12.112917 4.390437 -10.220461' description='doc Front View' />


<Viewpoint DEF='doc Left' position='41.290635 4.390437 -10.220461' jump='true' centerOfRotation='12.112917 4.390437 -10.220461' description='doc Left View' orientation='0 1 0 1.571'/>

<Viewpoint DEF='doc Top' position='12.112917 31.724789 -10.220461' jump='true' centerOfRotation='12.112917 4.390437 -10.220461' description='doc Top View' orientation='-1 0 0 1.571'/>
<Viewpoint DEF='doc Back' position='12.112917 4.390437 -36.569845' jump='true' centerOfRotation='12.112917 4.390437 -10.220461' description='doc Back View' orientation='0 1 0 3.142'/>
<Viewpoint DEF='doc Right' position='-17.064802 4.390437 -10.220461' jump='true' centerOfRotation='12.112917 4.390437 -10.220461' description='doc Right View' orientation='0 -1 0 1.571'/>

<Viewpoint DEF='doc Bottom' position='12.112917 -22.943915 -10.220461' jump='true' centerOfRotation='12.112917 4.390437 -10.220461' description='doc Bottom View' orientation='1 0 0 1.571'/>
<NavigationInfo DEF='ExamineNavInfo' type='"EXAMINE","LOOKAT"' />
</Scene>
</X3D>

Site de Aristoteles: Viewer GML 3D

Ca c'est le lien que je me donne pour le viewer http://131.220.71.208/index.php/Aristoteles qui permet de visualiser des données 3D en GML. J'essais pour le moment de l'installer mais quelques soucis avec des class java! Java ca pue!

jeudi 5 avril 2007

PostGIS and X3D (English version)

A few days ago, Olivier COURTIN (CamptoCamp SA) send a mail to the mailing-list of PostGIS. I've patched my own repository from postgis-vn. If you don't know how to use the patch command, you can download my postgis-svn repository already patched. As an example, here is the SQL command I've tried for a cube:

select asx3d(geomfromewkt('SRID=-1;MULTIPOINT(1.0 -1.0 -1.0, 1.0 -1.0 1.0, 
-1.0 -1.0 1.0, -1.0 -1.0 -1.0, 1.0 1.0 -1.0, 1.0 1.0 1.0, -1.0 1.0 1.0, -1.0 1.0 -1.0)'),
array[[0,1,2,3],[4,7,6,5],[0,4,5,1],[1,5,6,2],[2,6,7,3],[4,0,3,7]]);
I've got
                                            asx3d
----------------------------------------------------------------------------------------------
<IndexedFaceSet coordIndex='0,1,2,3,-1,4,7,6,5,-1,0,4,5,1,-1,1,5,6,2,-1,2,6,7,3,-1,4,0,3,7'>
 <Coordinate point='1 -1 -1,1 -1 1,-1 -1 1,-1 -1 -1,1 1 -1,1 1 1,-1 1 1,-1 1 -1'/>
 </IndexedFaceSet>
For the moment, only POINT and MULTIPOINT are supported.

The cube with FreeWRL.

Here is the content of my wrl file

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd">
<X3D version="3.0" profile="Immersive" xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="http://www.web3d.org/specifications/x3d-3.0.xsd">
<Scene>
<NavigationInfo headlight="flase" />
<Background groundColor="0.057 0.221 0.4" skyColor="0.057 0.221 0.4" />
<Transform DEF="Cube" translation="-1.907 0.0 0.105">
	<Shape>
		<Appearance>
			<Material DEF="MA_Material" diffuseColor="0.8 0.8 0.8" specularColor="0.401 0.401 0.401" emissiveColor="0.0 0.0 0.0" 
				ambientIntensity="0.167" shininess="0.098" transparency="0.0" />			
		</Appearance>
         <IndexedFaceSet coordIndex='0,1,2,3,-1,4,7,6,5,-1,0,4,5,1,-1,1,5,6,2,-1,2,6,7,3,-1,4,0,3,7'>
                 <Coordinate point='1 -1 -1,1 -1 1,-1 -1 1,-1 -1 -1,1 1 -1,1 1 1,-1 1 1,-1 1 -1'/>
         </IndexedFaceSet>
	</Shape>
</Transform>
<PointLight DEF="Lamp" ambientIntensity="0.0" color="1.0 1.0 1.0" intensity="0.571" radius="29.9999828339" location="4.076 5.904 -1.005" />
<Viewpoint DEF="Camera" description="Camera" centerOfRotation="0 0 0" position="7.48 5.34 6.51" orientation="-1.05 1.91 0.47 0.93" fieldOfView="0.661" />
</Scene>
</X3D>