Contents — find the section you need
Le SLAM visuel, l'odométrie visuelle, la géométrie épipolaire et le PnP supposent tous une correspondance exacte entre les coordonnées des pixels et l'espace 3D. Or, la lumière traversant une lentille ne forme jamais une image aussi parfaitement qu'avec un sténopé idéal. Quelle est la distance focale, en pixels ? Quel est le décalage du point principal par rapport au centre de l'image ? Quelle est la courbure d'une ligne droite sur l'image ? L'étalonnage de la caméra consiste à calculer numériquement ces grandeurs. Négliger l'étalonnage, c'est risquer d'introduire une erreur systématique, aussi sophistiquée soit-elle, dès la base du système, quelle que soit la sophistication de l'algorithme SLAM ou SfM utilisé.
0. Résumé en 30 secondes
-
L'étalonnage d'une caméra consiste à estimer ses paramètres intrinsèques (focale, point principal, distorsion) et ses coefficients de distorsion à partir des correspondances connues entre les points 3D et les points de l'image. Les paramètres extrinsèques (position de la caméra à chaque prise de vue) sont déterminés simultanément.
-
Les objectifs présentent des distorsions géométriques radiales et tangentielles. La représentation standard est le modèle de Brown-Conrady, qui exprime la distorsion radiale par k_1,k_2,k_3 et la distorsion tangentielle par p_1,p_2. Les objectifs grand angle et fisheye nécessitent un modèle différent.
-
La méthode de Zhang — qui consiste à photographier une mire plane (comme un damier) sous différents angles, à calculer linéairement les paramètres intrinsèques à partir de l'homographie de chaque vue, puis à affiner le modèle en tenant compte de la distorsion par optimisation non linéaire — est la méthode d'étalonnage standard en pratique.
-
La qualité de l'étalonnage est évaluée par l'erreur de reprojection. Se baser uniquement sur la valeur moyenne ne suffit pas ; il est également nécessaire d'analyser la distribution spatiale de l'erreur au sein de l'image et sa variance selon les poses, sous peine de passer à côté de distorsions localisées incomplètement capturées.
-
L'étalonnage n'est pas une constante, valable indéfiniment une fois établi. Le zoom, la mise au point, la température, les chocs, ainsi que les variations de résolution ou de recadrage peuvent tous modifier les paramètres intrinsèques. Les techniques SLAM visuelles, VO et PnP en aval se dégradent progressivement dès que cette hypothèse n'est plus valable.
1. Reconversion du modèle sténopé à partir des coordonnées
Un point du système de coordonnées monde \mathbf{X}=(X,Y,Z,1)^\mathsf{T} (coordonnées homogènes) est projeté sur l'image, à l'échelle, dans le modèle sténopé comme suit :
R\in SO(3) et \mathbf{t} représentent respectivement la rotation et la translation du système de coordonnées monde vers le système de coordonnées caméra (paramètres extrinsèques), et K est la matrice intrinsèque.
Ici, f_x,f_y correspondent aux distances focales en pixels, (c_x,c_y) est le point principal (où l'axe optique intersecte le plan image), et s est l'inclinaison (quasi nulle sur la plupart des capteurs modernes). L'étalonnage est le problème inverse qui consiste à retrouver, à partir des seules données observées, le paramètre K, les coefficients de distorsion et le paramètre R,\mathbf{t} de chaque tir.
Comme le montre le schéma, une seule prise de vue ne permet pas de distinguer les paramètres intrinsèques des paramètres extrinsèques. Seule la collecte de plusieurs observations à différentes poses (inclinaison, distance) permet de déterminer K avec une précision quasi unique ; c’est précisément le principe de la méthode de Zhang, que nous aborderons ci-après.
2. Une lentille n’est pas un sténopé idéal : le modèle de distorsion
Les lentilles réelles présentent une distorsion radiale et une distorsion tangentielle. En notant les coordonnées normalisées de l’image (x,y)=(X_c/Z_c,\,Y_c/Z_c) et le rayon r^2=x^2+y^2, Le modèle de distorsion de Brown-Conrady peut s'écrire comme suit :
k_1,k_2,k_3 représentent les coefficients de distorsion radiale, et p_1,p_2 les coefficients de distorsion tangentielle. La distorsion radiale est un phénomène où l'image se contracte ou se déforme en fonction de la distance au centre de l'objectif, se manifestant par la distorsion en « barillet » prononcée observée avec les objectifs grand angle, ou par la distorsion en « coussinet » observée avec les téléobjectifs. La distorsion tangentielle est une composante asymétrique plus faible, due à des imperfections de fabrication : le groupe de lentilles et le capteur d'image ne sont pas parfaitement parallèles. Les coordonnées finales des pixels sont obtenues comme \tilde{\mathbf{x}}_{px}=K(x_d,y_d,1)^\mathsf{T}.
Pour les objectifs à très grand angle, comme les objectifs fisheye, le modèle polynomial de Brown-Conrady tend à diverger près des bords et s'avère peu pratique. On utilise généralement une approximation par projection équidistante basée sur l'angle, telle que le modèle fisheye d'OpenCV. Plutôt que de « mémoriser un seul modèle de distorsion », il est important de garder à l'esprit que le modèle doit être choisi en fonction du champ de vision et de la conception optique de l'objectif.
3. Méthode de Zhang : Calibrage avec une mire plane
La méthode la plus répandue aujourd'hui est la méthode de calibrage par mire plane publiée par Zhengyou Zhang en 2000. Aucun dispositif de calibrage 3D spécifique n'est nécessaire : il suffit de photographier une mire plane, comme un damier imprimé, sous différents angles, en déplaçant la caméra ou la mire elle-même.
La transformation du plan du motif (considérant Z=0) à une certaine pose i vers l'image peut être exprimée sous forme d'homographie, en utilisant les première et deuxième colonnes de la matrice de rotation \mathbf{r}_1,\mathbf{r}_2 et la translation \mathbf{t}.
Ici, pour chaque pose, H_i peut être estimé linéairement à partir des points de la grille connus sur le motif et de leurs correspondances dans l'image, en utilisant la méthode DLT décrite dans le guide d'introduction à l'homographie. L'utilisation de la contrainte d'orthonormalité des colonnes de la matrice de rotation — \mathbf{r}_1^\mathsf{T}\mathbf{r}_2=0,\ \|\mathbf{r}_1\|=\|\mathbf{r}_2\| — conduit à une équation linéaire dans B=K^{-\mathsf{T}}K^{-1} :
qui fournit deux équations de ce type par pose (\mathbf{h}_1,\mathbf{h}_2 correspondent aux première et deuxième colonnes de H_i). Comme B est une matrice symétrique à 6 degrés de liberté, étant donné au moins 3 poses, B peut être déterminé par la méthode des moindres carrés linéaires, puis K sous forme analytique par une procédure équivalente à la décomposition de Cholesky. C'est pourquoi la méthode de Zhang ne nécessite que « quelques prises de vue d'un plan ». Cependant, si toutes les poses sont quasi parallèles au plan image (fronto-parallèles), les équations dégénèrent, et des poses avec plusieurs inclinaisons différentes sont alors nécessaires.
La solution analytique ne fournit qu'une valeur initiale qui ignore la distorsion. À partir de là, l'approche standard en deux étapes affine en pratique tous les paramètres, y compris les coefficients de distorsion, par optimisation non linéaire (généralement de Levenberg-Marquardt) en utilisant l'erreur de reprojection décrite dans la section suivante comme fonction objectif.
4. Erreur de reprojection et optimisation des paramètres
La fonction objectif de l'étalonnage consiste à minimiser, pour chaque pose et chaque point de la grille, la différence entre le pixel observé et la position projetée calculée avec les paramètres estimés. L'observation à la pose i, au point j, est notée \mathbf{u}_{ij}, et le point 3D connu correspondant sur le plan est noté \mathbf{X}_j.
est ce qui est minimisé. \boldsymbol{\kappa}=(k_1,k_2,k_3,p_1,p_2) représente le vecteur des coefficients de distorsion, et \pi_d la fonction de projection incluant la distorsion. Le nombre d'inconnues est important — K (4 à 5 degrés de liberté), \boldsymbol{\kappa} (3 à 5 degrés de liberté) et R_i,\mathbf{t}_i par pose (6 degrés de liberté × nombre de poses) — mais avec suffisamment de points observés, le problème est bien contraint. Cette formulation peut être considérée comme un cas particulier du cadre d'« optimisation conjointe de la pose de la caméra et de la structure 3D » présenté dans le guide d'introduction à l'ajustement de faisceaux. Les coordonnées des points 3D étant connues et fixées lors de l'étalonnage, il s'agit d'un sous-problème plus simple que l'ajustement de faisceaux classique.
Il est courant de présenter l'erreur quadratique moyenne (EQM) de reprojection \left\|\mathbf{u}_{ij}-\hat{\mathbf{u}}_{ij}\right\| comme « précision d'étalonnage », mais il est risqué de considérer l'étalonnage comme réussi en se basant uniquement sur la valeur moyenne. Il est impératif de vérifier également les points suivants :
-
La variance de l'erreur moyenne pour chaque pose (une pose présentant une erreur particulièrement importante à un angle spécifique suggère une déformation du motif, un flou de mouvement ou un éclairage inégal).
-
La distribution spatiale de l'erreur dans l'image (une erreur systématique persistante sur les bords suggère que l'ordre ou le type du modèle de distorsion est peut-être insuffisant).
-
La précision subpixel de la détection des points de la grille (si la détection des coins est instable, aucune optimisation ne permettra de la distinguer d'une erreur du modèle).
5. Schéma d'implémentation dans OpenCV
La procédure d'étalonnage classique pour une caméra unique se déroule comme suit : fixer les conditions de prise de vue (résolution, zoom, mise au point) et photographier le motif aux quatre coins de l'image, au centre et sous différents angles d'inclinaison représente 90 % d'un bon étalonnage.
import cv2 as cv
import numpy as np
pattern_size = (9, 6) # number of internal corners
objp = np.zeros((pattern_size[0]*pattern_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2)
objp *= square_size_m # measured side length of one square [m]
obj_points, img_points = [], []
for gray in calibration_images: # multiple frames shot at different poses
found, corners = cv.findChessboardCorners(gray, pattern_size)
if found:
corners = cv.cornerSubPix(gray, corners, (11, 11), (-1, -1),
(cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 30, 0.001))
obj_points.append(objp)
img_points.append(corners)
ret, K, dist, rvecs, tvecs = cv.calibrateCamera(
obj_points, img_points, gray.shape[::-1], None, None)
# ret is the RMS reprojection error [px]. Also compute per-pose error separately to check.
Pour les objectifs grand angle ou fisheye, utilisez la famille d'API cv.fisheye.calibrate plutôt que l'API calibrateCamera standard. Pour un système stéréo, utilisez cv.stereoCalibrate afin de déterminer la pose relative en plus des paramètres intrinsèques des deux caméras, et cv.stereoRectify pour aligner les images gauche et droite sur des lignes épipolaires horizontales. Cette procédure est directement liée à la conception de base décrite dans Comment fonctionnent les caméras stéréo et Comment fonctionnent les caméras de profondeur.
6. Pourquoi la dérive d'étalonnage perturbe les systèmes en aval
La plupart des calculs mathématiques utilisés dans Visual SLAM, VO et PnP reposent sur l'hypothèse que les valeurs d'étalonnage restent constantes tant que les conditions de prise de vue demeurent inchangées. L'estimation de la matrice essentielle dans le guide d'introduction à la géométrie épipolaire suppose des coordonnées normalisées K^{-1}\tilde{\mathbf{x}} ; la minimisation de l'erreur de reprojection dans le guide d'introduction PnP considère également K comme connu. Si K ou les coefficients de distorsion ne correspondent plus au système optique réel, chacun de ces calculs est en réalité effectué avec des paramètres inadaptés.
Plus précisément, les valeurs d'étalonnage se dégradent progressivement pour des raisons telles que :
-
Variations de zoom/mise au point : avec un objectif dont la focale varie, f_x,f_y change d'une prise de vue à l'autre. L'activation de l'autofocus implique que les paramètres intrinsèques au moment de l'étalonnage et en cours d'exécution ne correspondent plus. - Chocs thermiques et mécaniques : un léger décalage de la monture de l’objectif ou du capteur modifie le point principal et les coefficients de distorsion. Ce phénomène est particulièrement important pour les applications extérieures, automobiles et les drones.
-
Modifications de résolution, recadrage ou zoom numérique : comme K est un paramètre exprimé en pixels, si l’image est redimensionnée ou recadrée, f_x,f_y,c_x,c_y doit également être mis à jour en fonction de l’échelle. Omettre cette mise à jour est une erreur très fréquente.
-
Déformation d’un système de caméras gauche/droite : dans les configurations stéréo, si la pose relative (étalonnage extrinsèque) – et pas seulement les paramètres intrinsèques – se décale légèrement avec le temps, une erreur systématique affecte la profondeur calculée à partir de la disparité.
Ces erreurs sont difficiles à détecter lors d’une estimation de pose isolée. Dans les systèmes qui intègrent la pose de manière séquentielle au fil du temps, comme la vision par ordinateur (VO) ou le SLAM, une erreur de reprojection systématique s'accumule sous forme de dérive, produisant une carte déformée que la fermeture de boucle ne peut corriger entièrement. Dans les systèmes de production, il est conseillé de surveiller la dérive d'étalonnage en ligne à l'aide de points de repère 3D fixes et connus (lignes droites sur un bâtiment, panneaux de signalisation de taille connue), ou d'intégrer une procédure de recalibrage périodique.
7. Pannes courantes et contre-mesures
| Type de panne | Que se passe-t-il ? | Contre-mesure |
|---|---|---|
| Diversité de pose insuffisante (prises de vue frontales uniquement) | La détermination de K et de la distorsion devient imprécise, en particulier pour k_3 et le point principal | Photographiez les quatre coins, le centre et plusieurs angles d'inclinaison de l'image |
| Motif déformé par rapport à un plan | Le principe même de l'étalonnage est remis en cause, ce qui engendre une erreur systématique | Montez l'image sur un panneau plat rigide ; corrigez les erreurs d'échelle d'impression par mesure physique |
| Précision grossière de la détection des coins | Augmente le seuil d'erreur de reprojection, quelle que soit la puissance expressive du modèle | Correction subpixel, résolution suffisante, gestion de la mise au point et de l'exposition |
| Application d'un modèle de distorsion sténopé ordinaire à un objectif grand angle | Erreur divergente sur les bords de l'image, optimisation instable | Choisissez un modèle adapté au champ de vision, comme un modèle fisheye |
| Absence de mise à jour de K après redimensionnement/recadrage | Le point principal et la focale se désynchronisent de l'échelle, ce qui provoque une erreur systématique dans l'estimation de la pose | Convertissez K à l'échelle correspondante à chaque transformation d'image |
| Ignorer l'effet de rolling shutter | Le centre de projection réel diffère d'une ligne à l'autre, même au sein d'une même image | Adopter un obturateur global ou corriger avec un modèle de synchronisation de lignes |
8. Résumé
L'étalonnage de la caméra est la première étape qui transforme une image, simple matrice 2D, en une observation géométriquement interprétable. Les paramètres intrinsèques et extrinsèques du modèle sténopé, ainsi que les coefficients de distorsion radiale et tangentielle, sont obtenus à partir d'observations réalisées sous différentes poses (comme dans la méthode des motifs plans de Zhang), puis optimisés de manière non linéaire pour corriger l'erreur de reprojection. La qualité de cet étalonnage n'apparaît pas dans la métrique de précision d'un algorithme en particulier, mais elle est le fondement de chaque équation à chaque étape ultérieure : géométrie épipolaire, PnP, SLAM visuel, SfM, ajustement de faisceaux. L'étalonnage n'est pas une opération ponctuelle ; il fait partie intégrante d'un processus continu qui doit être surveillé en fonction des conditions de prise de vue.
Une petite erreur sur une image d'étalonnage est-elle suffisante ?
L'ajustement peut privilégier cette hypothèse. Vérifiez les différentes inclinaisons, les bords de l'image et utilisez des images de validation séparées.
## Références - [Zhang, A Flexible New Technique for Camera Calibration (IEEE TPAMI, 2000)](https://doi.org/10.1109/34.888718) - [Heikkilä & Silvén, A Four-step Camera Calibration Procedure with Implicit Image Correction (CVPR 1997)](https://dl.acm.org/doi/10.5555/794189.794489) - [Hartley & Zisserman, Multiple View Geometry in Computer Vision (page officielle des auteurs)](https://www.robots.ox.ac.uk/~vgg/hzbook/) - [OpenCV — Camera Calibration and 3D Reconstruction](https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html) - [OpenCV — Camera Calibration tutorial](https://docs.opencv.org/4.x/dc/dbb/tutorial_py_calibration.html) - [OpenCV — fisheye calibration module](https://docs.opencv.org/4.x/db/d58/group__calib3d__fisheye.html) - [Kalibr (outil d'étalonnage caméra/IMU, dépôt officiel)](https://github.com/ethz-asl/kalibr)
Commentaires
Veuillez vous connecter.
Aucune entrée pour le moment.