Projet: Réalité augmentée basée sur une reconstruction 3D à base d'images

(Par Jérôme Isabelle)

Le but de mon projet est de faire de la réalité augmentée en me basant sur la reconstruction 3D d'une scène. C'est en quelque sorte une version améliorée du projet sur lequel j'ai travaillé durant mon stage au laboratoire de vision de l'Université Laval. Les grandes étapes permettant d'arriver à mon but sont les suivantes:

  1. Obtenir un modèle 3D de la scène par reconstruction à base d'images(SfM)
  2. Positionner un objet virtuel dans la scène reconstruite
  3. Estimer la pose courante de la caméra par rapport à la scène reconstruite
  4. Inserer l'objet virtuel dans l'image courante
Les deux premières étapes peuvent être effectuées hors-ligne, alors que les deux dernières sont habituellement effectuées en-ligne, c'est-à-dire en temps-réel. Puisque suivre la pose de la caméra en temps-réel est une tâche assez complexe, je ne me donne pas cette contrainte pour mon projet.

Partie 1: Obtenir un modèle 3D de la scène par reconstruction 3D

Pour construire un modèle 3D de la scène, j'utilise le logiciel ContexteCapture développé par la compagnie BentleySystems. Ce logiciel permet de reconstruire un modèle 3D à partir de plusieurs images d'une scène. En général, ce type de logiciel utilise une approche semblable au SfM, c'est-à-dire qu'à partir des correspondances entre les images, l'algorithme va retrouver à la fois le déplacement de la caméra et les points 3D associées aux correspondances. Bien sûr, pour que la reconstruction fonctionne, les images doivent se chevaucher suffisamment et il doit y avoir un nombre suffisant de points d'intérêts distinctifs dans la scène. De base, le SfM permet seulement de reconstruire une version clairsemée du modèle 3D car seulement les correspondances sont reconstruites. Un autre algorithme doit donc être utilisé afin de compléter le modèle et obtenir une version dense. Voici donc un exemple de résultat obtenu par le logiciel:



et voici un extrait des images qui ont été utilisées pour la reconstruction.

Pour plusieurs raisons, comme le fait que des points ne soient tout simplement pas visibles dans les photos, la reconstruction n'est absolument pas parfaite. Cependant, elle devrait être suffisament bonne pour permettre une localisation assez précise de la caméra.

Partie 2: Positionner un objet virtuel dans la scène reconstruite

Cette étape, consistant à placer l'objet à augmenter dans la scène reconstruite, sert à exprimer les coordonnées de l'objet virtuel dans le repère de la scène. Ces coordonnées seront ensuite utilisées au moment d'augmenter l'image en tant que tel. Puisque le but de mon projet est de bien positionner le modèle virtuel dans l'image et non de présenter un rendu riche et réaliste, j'utilise un modèle virtuel très simple(comme un cylindre). Voici un exemple d'objet virtuel placé dans la scène reconstruite:

Partie 3: Estimer la pose courante de la caméra par rapport à la scène reconstruite

Pour cette étape, je me suis basé en partie sur l'article de Sattler et coll. intitulé Fast Image-Based Localization using Direct 2D-to-3D Matching paru en 2011. En résumé, l'algorithme fonctionne de la façon suivante:

  1. Construire un arbre (k-moyennes ou kd) à partir des descripteurs(SIFT) associés aux points 3D obtenus par la reconstruction.
  2. Détecter les points d'intérêts et descripteurs(SIFT) dans l'image courante.
  3. Déterminer les correspondances 2D-3D à l'aide de FLANN(Fast Library for Approximate Nearest Neighbors)
  4. Accepter la correspondance si le ratio des distances des deux plus proches voisins est inférieur à 0,7
  5. Si plusieurs points 2D de l'image possèdent la même correspondance 3D, garder seulement la plus forte correspondance(en terme de distance euclidienne entre les descripteurs)
  6. Calculer la pose de la caméra à partir des correspondances 2D-3D et d'une calibration de caméra(paramètres intrinsèques). Pour ce faire, la fonction tente de minimiser l'erreur de reprojection, c'est-à-dire la somme des distances au carré entre les points de l'image et la projection des points 3D. Le tout est effectué dans une boucle RANSAC pour être robuste aux mauvaises correspondances

Partie 4: Inserer l'objet virtuel dans l'image courante

Une fois la pose de la caméra retrouvée, il reste à reprojeter les coordonnées 3D du modèle virtuel en utilisant les bons paramètres de caméra(intrinsèques et extrinsèques(pose)) J'obtiens donc les coordonnées 2D du modèle dans l'image courante qu'il suffit de relier pour créer une image augmentée. À défaut d'avoir réussi à obtenir un bon résultat pour les données présentes, voici le type de résultat que j'avais obtenu dans mon stage:



On remarque que le modèle augmenté est assez rudimentaire. Cela n'est pas très important dans le cadre de mon projet puisque ce qui m'importe vraiment c'est de voir si l'objet est bien positionné dans l'image, ce qui est bien le cas. Par contre, si je voulais augmenter mon image avec un modèle virtuel plus complexe et texturé, je devrais faire un vrai rendu de l'objet en utilisant les bons paramètres de caméra et idéallement un bon éclairage pour rendre le tout plus crédible. Cela reviendrait donc à faire un peu comme dans le tp5, à la différence(assez grande) que la position de la caméra par rapport à la scène ne serait pas fixe, mais plutôt calculée automatiquement.