-
Notifications
You must be signed in to change notification settings - Fork 0
Bases théoriques
Le problème "Perspective-n-Points" (PnP) consiste, à partir d'une photo, à estimer les caractéristiques et la position de l'appareil de prise de vue.
Cette estimation se fait à partir de n
points dont on connaît à la fois les coordonnées réelles (en 3 dimensions) et les coordonnées dans la photo (en 2 dimensions). L'estimation repose sur une modélisation du comportement des appareils photo appelée "pinhole-camera" (on emploiera plutôt le terme "caméra" dans ce document). Cette modélisation repose sur la projection en perspective, d'où le nom du problème.
Dans ce document, on commence par présenter le modèle "pinhole-camera". Puis on présentera le problème PnP, basé sur cette modélisation.
Dans ce modèle, on identifie l'ouverture de la caméra à un point unique ("pinhole") et on étudie comment se forme l'image dans le plan focal de la caméra grâce aux lois de l'optique géométrique. Il est à noter que l'image est "inversée" par rapport à l'objet réel.
Schéma d'une caméra "pinhole"
Dans la suite, ce qui nous intéresse est la manière de passer des coordonnées 3D aux coordonnées 2D, à partir des caractéristiques de l'appareil. Ces équations sont à la base de la résolution du problème PnP.
Dans ce qui suit, on utilise les notations suivantes:
-
$R \in M_{3,3}$ représente la rotation de la caméra dans le repère-monde. -
$t \in \mathbb{R}_3$ représente la position de la caméra dans le repère monde. -
$f$ représente la distance focale de la caméra. -
$h$ et$w$ représentent les dimensions de la photo en pixels ($h$ : hauteur ;$w$ : largeur ). -
-
-
-
.
Projection d'un point dans le plan image de la caméra
On pose également que l'image correspond au domaine
Plan image normalisé
Dans cette section, on suppose qu'il n'y a pas de distorsion. On cherche à exprimer les coordonnées
On commence par exprimer les coordonnées du point dans le repère de la caméra,
Maintenant que l'on connaît les coordonnées du point 3D dans le repère caméra, on exprime le projeté
Par définition du plan image de la caméra :
Pour
Projection d'un point dans le plan image - vue en coupe
On normalise les coordonnées de
Pour finir, on en déduit les coordonnées-image,
(le
Nous avons adopté un modèle simplifié dans lequel la distorsion est dûe uniquement à un décalage du centre optique de la caméra. Autrement dit, le centre optique de la caméra a pour coordonnées
puis :
En généralisant le raisonnement précédent, on peut résumer le lien entre un point
Le problème PnP consiste à estimer les paramètres intrinsèques (matrice
Dans notre cas, on cherche à déterminer 9 paramètres :
- la focale
$f$ => 1 paramètre - le décentrage
$(c_x, c_y)$ => 2 paramètres - l'orientation de la caméra dans l'espace => 3 paramètres
- la position de la caméra dans l'espace => 3 paramètres
(les dimensions
$w$ et$h$ de la photo sont connues)
Remarque 1 : Dans la littérature, on parle le plus souvent de 11 paramètres. En effet, dans le cas général, la matrice intrinsèque de la caméra est de la forme :
Nous avons choisi de négliger les déformations des axes car elles sont difficiles à simuler. Ces déformations sont modélisées par le paramètre
Remarque 2 : Pour des raisons de facilité d'implémentation, notre solveur calcule la longueur focale
Ouverture vertical, vFOV
La donnée d'une correspondance (
Remarque : Dans la littérature, on peut lire qu'il ne faut que 3 points (problème P3P). Il s'agit du cas particulier où l'on connaît déjà les paramètres intrinsèques de la caméra. Dans ce cas en effet, on n'a que 6 paramètres à trouver (3 pour la position, 3 pour l'orientation), donc
Comme on l'a vu, le problème PnP consiste à évaluer les matrices
On cherche une solution approchée de ce problème, il s'agit donc de minimiser un certain critère d'erreur. Comme critère d'erreur, on choisit l'erreur de reprojection, que l'on explicite ici.
Supposons que l'on ait une estimation des matrices
Pour estimer l'erreur, on re-projette les points 3D initiaux dans le plan de la caméra :
On obtient ainsi des points correspondant sur la photo :
Puis, on compare avec les points 2D initiaux. On calcule ainsi une erreur par point :
Enfin, on donne une estimation de l'erreur globale :
Notre solveur est basé sur les méthodes calibrateCamera et solvePnP de la librairie opencv (version 3.1).