Vision industrielle

Modéliser une caméra

Aujourd'hui, j'avais envie de vous faire découvrir ce qui m'a amené à faire de la robotique : La vision industrielle. Vaste domaine s'il en est ! Vous voulez déterminer votre position ? Vous souhaitez reconstruire une scène ou un objet en 3D ? Votre première étape sera impérativement de comprendre comment on passe d'un point de l'espace 3D à un pixel de l'image. C'est ce que nous allons aborder dans cet article au travers du modèle sténopé. Un peu de maths sera nécessaire, mais promis, rien de trop ambitieux !

Introduction

La robotique est un domaine très très vaste : pour peu que vous soyez un peu curieux vous y trouverez probablement votre bonheur. De l’étude des mouvements, en passant par le traitement de signal ou la conception mécanique, les spécialités sont nombreuses. L’un de ces domaines est la vision industrielle. Si vous regardez un robot comme celui ci-dessous, vous vous rendrez probablement compte qu’il est doté de nombreux capteurs, parmi lesquels figurent en bonne place des caméras.

fig10

Ces caméras sont les “yeux” du robots. Selon les cas, elles peuvent lui servir à modéliser son environnement en 3D, se localiser dans cet environnement, ou encore déterminer la forme, la position et l’orientation d’un objet à saisir.

Cependant, ce serait réduire la vision industrielle que de n’envisager que ses applications en robotique. Les véhicules autonomes, le contrôle qualité sur les chaînes de fabrication, les scanners 3D, les images de synthèse ou la réalité augmentée en sont autant d’applications.

Tout ceci repose sur une idée simple : modéliser mathématiquement une caméra, ou plus précisément le processus permettant de passer d’un point de l’espace 3D à son image sur la rétine de notre capteur. Si nous parvenons à établir un tel modèle, nous pourrons alors tenter de l’inverser (reconstruction 3D) ou le reproduire (réalité augmentée, synthèse d’image).

Le modèle mathématique qui est le plus souvent utilisé pour utiliser des caméras s’appelle le modèle sténopé. Il est la base de toutes les applications que nous avons citées et constitue donc le choix évident pour un premier article sur la vision.

Le modèle sténopé

Le modèle sténopé, ou modèle “trou de serrure” (pinhole en anglais), est un modèle approximé du fonctionnement d’une caméra. Ce modèle se compose de deux éléments :

  • un point, noté ici O
  • un plan, nommé plan image ou rétine

fig01

Le processus de formation de l’image d’un point M(x,y,z) de l’espace se fait en traçant le segment reliant le point O au point M. Le segment ainsi obtenu coupe le plan image au point m, qui est le point image que nous cherchons. Si l’on réitère le processus pour tous les points visibles d’un objet 3D, son image se dessine alors sur notre plan image.

fig02

L’axe de regard de la caméra, représenté ici en pointillé, est nommé “axe optique”. Il coupe le plan Image au point C, appelé centre optique du système.

La distance entre le point O et la plan image est notée f, pour distance focale. Plus celle-ci sera petite, plus l’image formée sur la rétine sera de petite dimension. A l’opposé, une grande distance focale formera une image plus grande comme on peut le voir ci-dessous :

fig03

Comme son nom l’indique, ce paramètre représente la focale utilisée sur l’optique de la caméra. Sur un appareil photo, vous réglez cette focale en faisant tourner l’une des bagues de l’objectif pour zoomer.

Jusque là, c’est simple non ? Nous allons maintenant mettre ce modèle en équation afin de l’exploiter.

Écrire les équations de projection

La première chose à faire pour mettre en équation ce modèle est de se doter de repères, dans lesquels nous exprimerons les différentes coordonnées. Ils seront au nombre de trois.

fig04

  • Le repère Caméra, noté , nous servira à exprimer les coordonnées 3D des points de l’espace. Ce repère est orthonormé, direct ( rappelez vous la règle de la main droite ), et nous permettra de raisonner avec des coordonnées exprimées en mètres. Il a pour origine le point O et son axe z est confondu avec l’axe optique. Toutes les coordonnés 3D seront, pour le moment, exprimées dans ce repère.

  • Le repère Centre Optique, noté , est un repère du plan image, donc à deux dimensions. Ce repère est le projeté du repère caméra selon l’axe optique : il a pour origine le centre optique C et ses axes x et y sont alignés avec le repère caméra. Il nous permettra d’écrire les coordonnées des points images (comme par exemple m) sous forme métrique.

  • Le repère Image, noté , est un autre repère dans lequel seront exprimées les coordonnées dans l’image. Ce repère utilise les conventions habituelles des librairies de traitement d’image en placant l’origine dans le coin supérieur gauche de l’écran et en exprimant les coordonnées en pixels et non pas en mètres.

Comme vous vous en doutez probablement, les deux repères que nous utiliserons couramment sont le repère caméra ( pour les coordonnées 3D ) et le repère Image. Le repère lié au centre optique ne sera qu’un intermédiaire de calcul permettant de décomposer plus simplement les équations de projection. D’ailleurs, puisqu’on en parle, il va être temps d’écrire cette projection …

Prenons donc un point de l’espace , dont les coordonnées sont exprimées dans , et cherchons les coordonnées de son projeté dans :

fig05

L’astuce pour écrire simplement la première relation est de projeter le problème sur le plan . On obtient alors la configuration suivante :

fig06

Ici, votre prof de maths de collège devrait se rappeler à votre bon souvenir, puisque nous allons pouvoir utiliser le théorème de Thalès :

Le même raisonnement peut être appliqué sur le plan , afin de trouver la seconde relation qui permet déterminer .

Notre modèle complet s’écrit donc :

Ce premier résultat, quoique déjà intéressant, n’est cependant pas très utilisable en pratique car les coordonnées du point projeté sont données en mètres, dans le repère lié au centre optique. Or, comme nous l’avons dit précédemment, dans la plupart des librairies, les coordonnées dans les images sont exprimées en pixels à partir du coin supérieur gauche de l’image. Il va donc nous falloir réécrire cette expression dans le repère .

Pour la suite, nous nommerons les coordonnées en pixels du point m dans le repère Image.

On peut écrire :

Avec :

  • les coordonnées du centre optique dans le repère écran ( donc exprimées en pixels )
  • les dimensions d’un pixel exprimées en mètres.

En réexprimant la relation de projection dans le repère image, on obtient l’équation de base du modèle sténopé :

Comme vous pouvez le voir, ce modèle permet de passer des coordonnées métriques d’un point 3D aux coordonnées en pixels de son projeté. C’est bien là le jeu de relations que nous recherchions. Cinq autres grandeurs entrent en jeu dans l’équation : ,,, et . Ces grandeurs sont des coefficients propres à la caméra (et l’optique) utilisée et constituent les paramètres de notre modèle.

Il est d’ailleurs de pratique courante d’en introduire un 6ème, que l’on appelle le skew et que l’on note . Ce 6ème coefficient permet de prendre en compte le fait que les pixels, dans certaines technologies de rétines, ne sont pas rectangulaires mais en forme de trapèzes. Ce paramètre a en général une valeur proche de zéro pour les caméras modernes, mais nous allons cependant le faire figurer dans notre modèle.

L’équation finale du modèle sténopé devient donc :

Voilà. Nous y sommes. Le modèle est enfin complet ! Il est d’ailleurs étonnamment simple vous ne trouvez pas ? Ce modèle présente toutefois quelques propriétés intéressantes. L’une d’entre elles est que la projection d’une droite par le modèle sténopé donne une droite.

Si vous essayez d’inverser la construction, vous remarquerez également que cet opérateur n’est pas bijectif : Si un point de l’espace n’a bien qu’une seule image par la projection, la réciproque n’est pas vraie. Ainsi, à un point m de l’image peut correspondre une infinité de point de l’espace : Tous ceux situés sur la droite . Ce n’est pas pour rien que la nature vous a donné deux yeux … Mais nous y reviendrons un peu plus tard dans ce blog.

Mise en forme matricielle

Comme tous les physiciens, les roboticiens ont un gros faible pour les modèles linéaires : plus simples à manipuler, nous avons à notre disposition beaucoup plus d’outils pour les résoudre. L’idéal serait donc de réussir à écrire sous forme linéaire (matrices) notre système d’équations.

Je sais ce que vous allez dire : avec des équations écrites sous forme de fractions, tu peux toujours te brosser mon ami. Vous n’avez pas tout à fait tort. Cependant la solution est connue depuis le XVIIIe siècle et les travaux d’August Ferdinand Möbius. Quand il ne jouait pas avec des rubans, le monsieur a en effet écrit toute une partie des mathématiques liées aux projections, et a notamment introduit les coordonnées homogènes que nous allons utiliser ici.

L’astuce des coordonnées homogènes est de rajouter une dimension, appelée facteur d’échelle, et souvent notée .

Dans cette notation, le vecteur suivant :

correspond au point 2D dont les coordonnées sont dans le repères .

Nous pouvons maintenant écrire la projection sous la forme d’un simple produit matriciel:

Cette matrice de projection, notée , est souvent écrite sous une forme simplifiée :

Ceci se justifie par le fait que les paramètres , et sont en pratique difficilement séparables. Dans certains travaux, cette matrice est même simplifiée au delà : les appareils photos modernes ont en effet un skew nul ou négligeable et des pixels carrés. On peut alors écrire :

La matrice fondamentale

Il reste un problème avec l’expression que nous avons obtenue :

En effet, elle est établie en fonction de coordonnées 3D dans le repère caméra. Ceci veut dire que si la caméra se déplace par rapport à la scène qu’elle filme (supposée immobile), il nous faudrait modifier les coordonnées 3D de chacun des points. Peu pratique n’est-ce pas ?

Nous allons donc introduire un nouveau repère, le repère “monde” , dans lequel la scène filmée est immobile. On peut écrire la matrice de changement de repère entre et sous la forme suivante :

Avec :

  • la matrice de passage du repère au repère
  • la matrice 3x3 correspondant à la rotation
  • la matrice 3x1 correspondant à la translation

Je sais, je sais ! Cela va un peu vite !

Je vous écrirai bientôt un petit article sur les transformations rigides et les changements de repère … Promis !

En injectant ce changement de repère dans l’équation de notre modèle sténopé, nous obtenons :

La matrice porte le nom de matrice fondamentale. Nous la recroiserons bientôt, vous verrez !

Le modèle complet

Il est temps, je crois, de faire un petit résumé. Le modèle sténopé, exprimé en coordonnées homogènes, a donc pour équation :

Ce modèle va nous permettre de représenter mathématiquement une caméra, pour peu que nous sachions en déterminer les paramètres. Ceux-ci sont d’ailleurs au nombre de 12, répartis en deux groupes.

> Les paramètres intrinsèques

Ce sont les paramètres qui dépendent de la nature et du modèle de la caméra. Ils ne changent que si l’on change la caméra ou l’un de ses réglages et sont contenus dans la matrice . Ce sont :

  • La distance focale
  • Les dimensions du pixel et
  • Les coordonnées du centre optique de la caméra et
  • Le skew

> Les paramètres extrinsèques

Ce sont les paramètres qui changent lorsque la caméra change de position ou d’orientation. On en compte 3 pour définir la translation (, et ) et trois pour définir l’orientation (par exemple les angles de roulis, tangage et lacet).

Conclusion

Le modèle sténopé a l’avantage d’être un modèle à la fois très simple et très fidèle à la réalité. Il a cependant aussi des limites. Il n’inclut pas, par exemple, la notion de mise au point ni la notion de champ de vue. Un point se situant derrière la caméra aura ainsi un projeté sur la rétine … Il faudra dont faire attention lorsque nous nous en servirons pour effectuer de la synthèse d’images.

Il n’inclut pas non plus les déformations liées aux optiques de grande courbure, comme le fameux effet “fish-eye”. On complète donc souvent ce modèle par un modèle de déformation de l’image permettant de tenir compte des déformations en coussinet ou en barillet. Les photographes comprendront, les autres devront attendre la suite de cette série d’articles :)

J’arrête ici cet article pour ce soir, en espérant qu’il vous aura plu. Nous verrons la prochaine fois comment déterminer pratiquement les paramètres du modèle : c’est l’étape que l’on nomme “calibrage” ou “identification” de la caméra. N’hésitez pas à critiquer, corriger ou poser des questions dans les commentaires : j’y répondrai avec plaisir.

A bientôt,

Seb

Crédits

Thumbnail de l’article : https://www.flickr.com/photos/mort183/6969349081

ROBOTIQUE
robotique vision 3D

Dialogues & Discussions