Documentation technique
Transcription
Documentation technique
Documentation technique Logiciel de reconstruction de surface à l’aide de caméras Vadon Guillaume – Trlin Moreno Rose Aurélie – Freydier Simon Université Joseph Fourier, UFRIMA 2011 1./ Installation Pour exécuter ce logiciel, il est nécessaire d’avoir, sur l’ordinateur, la bibliothèque OpenCV en version 2.2, ainsi que le logiciel QT 4. L’installation du dit logiciel peut donc se faire sous n’importe quel système d’exploitation supportant OpenCV et Qt. Toutefois, pour pouvoir le compiler, il est nécessaire de modifier le « Makefile » afin de changer l’adresse des bibliothèques (en particulier OpenCV) puis de recompiler le projet. 2./ commentaires Si un utilisateur le désire, il lui est possible de générer une documentation de type doxygen à partir des classes ThreadTraitement, camera, et radialSplines, qui contiennent des commentaires prévus à cet effet dans les fichiers « .h » et « .hpp ». Les classes liées à l’interface graphique ne disposent pas de cette possibilité, étant normalement simple d’accès et de compréhension pour un utilisateur de Qt. 3./Description du code Le code est structuré en 4 grandes parties : IHM ThreadTraitement Camera radialSpline 1. IHM Le dossier IHM contient tous les fichiers relatifs à l’interface, et à la vérification des données en entrée. On trouvera donc : Paramwindow : classe d’interface graphique correspondant à la fenêtre principale. Tabcontent : classe d’interface graphique correspondant à un onglet « Caméra ». Il s’agit d’un widget ajouté a paramwindow lors du clic sur le bouton « Ajouter caméra ». Addcalibpointwindow : il s’agit d’une classe d’interface graphique correspondant à la boite de dialogue d’ajout de point de calibration, qui apparait lorsque l’utilisateur clique sur le bouton « Ajouter point calibration ». Removecalibpointwindow : il s’agit d’une classe d’interface graphique correspondant à la boite de dialogue de suppression de point de calibration, qui apparait lorsque l’utilisateur clique sur le bouton « Supprimer point de calibration ». Point2D : il s’agit d’une classe codant un point à 2 dimensions en double. Point3D : il s’agit d’une classe codant un point à 3 dimensions en double. Calibrationpair : il s’agit de la classe codant les points de calibration par association entre un point 2d et un point 3d. Utils : il s’agit d’une paire de fichiers pouvant être utilisés afin d’ajouter des fonctions diverses. 2. ThreadTraitement Cette classe contient l’ensemble du code directement lié au traitement des images afin d’en extraire les positions des marqueurs et d’effectuer les correspondances entre les marqueurs trouvés sur les différentes images à un temps t. On peut donc y trouver les prétraitements, le matching, le tracking, ainsi que l’appel aux fonctions permettant la triangulation et l’interpolation de la surface se trouvant respectivement dans « camera » et « radialSpline ». 3. Camera [dossier Camera] Il s’agit d’une classe template. Cette classe permet de modéliser le comportement des caméras utilisées pour la capture des données. Elle contient donc les fonctions de calibration, et de triangulation, ainsi que l’ensemble des attributs permettant d’accéder aux fichiers images correspondant à la caméra modélisée. 4. radialSpline [dossier interpolation] Il s’agit d’une classe template. Cette classe permet de définir une surface de type spline radiale paramétrée par une fonction qui sera définie dans les fichiers « fonctions.h » et « fonctions.cpp ». 4./ Note sur l’utilisation d’Eigen Ce projet utilise la librairie de templates Eigen. Pour des raisons de compatibilités, nous avons choisi d’inclure directement la librairie au code. Il est néanmoins possible pour les personnes disposant préalablement de cette librairie de la retirer du code. Il faut pour cela avoir Eigen d’installé sur la machine de compilation, et modifier les fichiers faisant appel à Eigen en remplaçant les guillemets des « #include » par « <…> ». Il sera peut être également nécessaire de modifier le makefile afin d’inclure Eigen aux dépendances. 5./ Bugs connus Le logiciel souffre malheureusement de plusieurs bugs non résolus. Fuite mémoire : une fuite mémoire importante a été localisée dans la fonction « ThreadTraitement ::preTraitements », avec l’utilisation de la fonction « cvLoadImage ». La mémoire allouée par cette fonction ne semble jamais libérée, mais l’utilisation des différents opérateurs et fonctions de libérations de mémoire disponibles aboutissent à une erreur. Autre fuite mémoire : Il semblerait que l’utilisation de vecteur de tableaux (std ::vector<Type*>) provoque également une fuite mémoire, bien que les pointeurs du vecteur soient libérés individuellement. Cette fuite mémoire associée à la précédente empêche le traitement de plus de 10 images sur la totalité des caméras, ce qui est fortement limitant. Crash : Si les numéros des images lues ne commencent pas à 1 et ne se suivent pas (par exemple 1,2,4,5…) la fonction cvLoadImage (même emplacement que la 1ère fuite mémoire) ne charge pas l’image et une erreur risque donc de planter le programme. 6/Limitations connues Le logiciel n’étant pas achevé, les limitations suivantes ont été répertoriées. Disposition des caméras : le matching est codé tel que l’utilisation d’une prise de vue d’une surface rectangulaire en diagonale rasante provoquera de mauvaises associations, et donc probablement une erreur. Projection : le logiciel est pour l’instant prévu pour fonctionner avec des images issues de simulation avec une projection orthogonale. L’utilisation de prises de vue avec une projection en perspective nécessitera de modifier le code du tracking et des caméras. Traitements fixes : les paramètres de traitements indiqués en gris ont été fixés à l’optimale à partir des tests que nous avons effectués. Il pourrait néanmoins s’avérer judicieux de permettre à l’utilisateur de les faire varier si il décide par exemple de travailler sur des images de taille très différente, ou avec des pastilles d’une taille différente. Pastilles circulaires : le programme est prévu initialement pour des pastilles circulaires. L’utilisation d’un autre type de pastille requiert une modification du code de prétraitement (ThreadPretraitement) notamment pour le choix des éléments structurants des opérateurs morphologiques, ainsi que leur taille. Multi-threading : à l’heure actuelle, le programme s’exécute comme un seul processus. Il serait judicieux de lancer le traitement (fonction ThreadTraitement ::run) dans un nouveau processus car il peut être couteux en temps, et bloque donc l’interface le temps de son exécution.