IFT6145 - Vision 3D
Travail Pratique 5 : Lumière structurée
Début
- mardi 4 avril 2006
Remise
- ~3 semaines
Description
Vous devez reconstruire des scenes 3D, en utilisant le principe de la lumiere structuree.
Il y a 5 scenes a reconstruire (les images sont reduites pour l'affichage).
Images
Pour chaque scene, 40 images sont prises du meme point de vue, mais en projetant 40 pattern
differents. Ces patterns sont tous encodes avec le code de Gray (10 bits) et se distribuent
ainsi:
Codes | desciption |
_pat00 ... _pat09 | images des bits 0 a 9 de la position X du projecteur |
_pat10 ... _pat19 | images des bits 0 a 9 de la position Y du projecteur |
_pat20 ... _pat29 | images inverse des bits 0 a 9 de la position X du projecteur |
_pat30 ... _pat39 | images inverse des bits 0 a 9 de la position Y du projecteur |
Les images sont disponibles dans un fichier dataset.tar.gz. Attention, ca fait 5 X 40 X 1MB = 200MB une fois decompresse...
Programme
Faite un programme stl (en C, C++, Java, langage machine, ...) qui prend en argument les images
sous la forme d'un printf, donc qu'on appelle comme suit:
stl set1/_pat%02d_00.pgm ...autres parametres de votre choix...
qui va lire les images set1/_pat00_00.pgm, set1/_pat01_00.pgm, ...,
set1/_pat39_00.pgm, puis les analyser pour obtenir une reconstruction.
Les "autres parametres de votre choix" doivent permettre de choisir la version de l'algorithme (A,B,C) et de donner les valeurs aux parametres si necessaire.
Pour ceux qui ne sont pas familiers avec sprintf, vous pouvez lire les images comme ceci:
char buf[100];
for(i=0;i<40;i++) {
sprintf(buf,format,i); // format contient "set1/pat%03d_00.pgm"
... lire l'image buf ...
}
Le programme doit
- Implanter l'algorithme de reconstruction qui utilise toutes les images (positives et negatives). C'est la version A.
- Implanter l'algorithme de reconstruction qui utilise seulement les images 0..19 (positives seulement) avec un seuil de votre choix pour separer le blanc et le noir. C'est la version B.
- Implanter l'algorithme de reconstruction qui utilise toutes les images, mais qui impose une
forme de lissage entre voisins. C'est la version C.
Expliquez quel voisinage, quelle fonction de lissage, et quel algorithme de lissage vous utilisez. (vous choisissez)
- Lire les 40 images
- Retrouver les codes de 10 bits en X et Y (les coordonnees du projecteurs) pour chaque pixel
- Sauvegarder les codes dans des image en tons de gris. Notez que _A_ est la version A,B ou C et _S_ est le numero de la scene, 1,2,3,4,5.
- xcode_S_A_hi.pgm / ycode_S_A_hi.pgm
contiennent les 8 bits superieurs (de poid fort) du code X / Y.
ex: pour un code v sur 10 bits, on utilise (v>>2) ou (v/4)
- xcode_S_A_low.pgm / ycode_S_A_low.pgm
contiennent les 8 bits inferieurs (de poid faibles) du code X / Y.
ex: pour un code v sur 10 bits, on utilise (v&255) ou (v%256)
- xcode_S_A_low4.pgm / ycode_S_A_low4.pgm
contiennent les 4 bits inferieurs (de poid faibles) du code X / Y, ajustes pour etre facile a voir.
ex: pour un code v sur 10 bits, on utilise (v&15)<<4 ou (v%16)*16
Cela fait donc 6 images par experience, et 15 experiences (5 scenes X 3 versions d'algorithme), ce qui fait un total de 90 images.
- Faite une petite page web qui affiche les 90 images bien identifiees, et qui contient vos commentaires.
Evaluation
- Vous devez remettre un programme qui fonctionne et qui compile (si vous n'etes pas sur, contactez-moi)
- L'evaluation tient compte de la qualite du code, si le code fonctionne bien, des resulats, et des commentaires/discussion.
- Expliquez vos choix (seuil, lissage, ...) et expliquez les differences dans les resultats obtenus.