Introduction à la réalité augmentée
Objectif, ressources :
L'objectif de ces séances est de mettre en pratique les notions vues en cours afin de réaliser une petite application de réalité augmentée où l'on va chercher à projeter une image dans une scène à l'aide d'une mire faisant office de repère.
![]()
![]()
Image à projeter dans la scène Occurence à remplacer dans la scène
Le type de résultat que l'on souhaite obtenir :

Les ressources nécessaires à la réalisation de ces TP sont disponibles ici et vous avez à disposition un squelette du programme que vous devrez remplir :
import sys
import getopt
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
def get_keypoints(img):
"""Retourne une liste de points d'intérêt de l'image"""
return None
def compute_features(kps):
"""Retourne la liste des descripteurs associés à la liste des points
d'intérêt"""
return None
def get_matches(des1, des2):
"""Retourne la liste des correspondances entre les vecteurs des1 et des2"""
return None
def compute_homography(matches):
"""Retourne l'homographie de la transformation entre l'image 1 et 2"""
return None
def draw(img1, img2, M):
"""Retourne une nouvelle image résultat du dessin de l'image img1 dans la
scène décrite par l'image img2 selon l'homographie M"""
return None
def process(img_camera, img_pattern, img_texture):
"""Algorithme principal : détecte les points d'intérêt dans les deux image,
calcule leurs descripteurs associés, réalise l'appariement l'obtention
de l'homographie puis dessine une nouvelle image en projetant img_texture
à la place de l'occurence img_pattern."""
return None
def args_processing(args):
try:
opts, args = getopt.getopt(args, "c:p:t:",
["camera=", "pattern=", "texture="])
except getopt.GetoptError as err:
print(err)
sys.exit(2)
img_camera = None
img_pattern = None
img_texture = None
for o, a in opts:
if o in ("-c", "--camera"):
img_camera = cv.imread(a, cv.IMREAD_GRAYSCALE)
elif o in ("-p", "--pattern"):
img_pattern = cv.imread(a, cv.IMREAD_GRAYSCALE)
elif o in ("-t", "--texture"):
img_texture = cv.imread(a, cv.IMREAD_GRAYSCALE)
else:
assert False, "paramètre non pris en charge"
if any(obj is None for obj in [img_camera, img_pattern, img_texture]):
assert False, "Paramètres non initialisés"
return (img_camera, img_pattern, img_texture)
if __name__ == '__main__':
img_camera, img_pattern, img_texture = args_processing(sys.argv[1:])
process(img_camera, img_pattern, img_texture)
Consignes, notation :
Prenez le temps de vous familiariser avec le squelette. Une bonne façon d'aborder ce projet est de commencer par réaliser la fonction process en premier puis de remplir les autres fonctions en ayant recours uniquement à des appels OpenCV pour progressivement les remplacer par votre propre code.
Selon vos facilités, il est probable que vous ne puissiez pas tout faire ; aussi, la réecriture des fonctions get_matches et compute_homography sans passer par des appels OpenCV est considérée comme une partie optionnelle.
En revanche, une attention particulière sera apportée aux fonctions get_keypoints et compute_features avec l'implantation des algorithmes vus en cours. A ce sujet, si vous avez le temps, vous pouvez réaliser l'ensemble des différents motifs d'échantillonnage de l'algorithme BRIEF comme rappelé ci-dessous et vos constatations sur les différences effectives devront figurer dans votre rapport de projet.
