Learn OpenCV

La tour de Babel, selon un récit mythique de la Bible, a été le premier désastre d’ingénierie des humains. Le projet avait toutes les grandes qualités d’avoir une mission claire, beaucoup de puissance humaine, aucune contrainte de temps et une technologie adéquate (briques et mortier). Pourtant, il a échoué de façon spectaculaire parce que Dieu a confondu la langue des ouvriers humains et qu’ils ne pouvaient plus communiquer.

Des termes comme « Homographie » me rappellent souvent à quel point nous luttons encore avec la communication. L’homographie est un concept simple avec un nom bizarre !

Qu’est-ce que l’homographie ?

Considérez deux images d’un plan (haut du livre) montrées dans la figure 1. Le point rouge représente le même point physique dans les deux images. Dans le jargon de la vision par ordinateur, nous appelons cela des points correspondants. La figure 1. montre quatre points correspondants dans quatre couleurs différentes – rouge, vert, jaune et orange. Une Homographie est une transformation ( une matrice 3×3 ) qui fait correspondre les points dans une image aux points correspondants dans l’autre image.

Figure 1 : Deux images d’un plan 3D ( haut du livre ) sont reliées par une Homographie

Maintenant, puisqu’une homographie est une matrice 3×3, nous pouvons l’écrire comme

Considérons le premier ensemble de points correspondants – dans la première image et dans la deuxième image. Ensuite, l’homographie les met en correspondance de la manière suivante

Alignement d’images à l’aide de l’homographie

L’équation ci-dessus est vraie pour TOUS les ensembles de points correspondants, tant qu’ils se trouvent sur le même plan dans le monde réel. En d’autres termes, vous pouvez appliquer l’homographie à la première image et le livre de la première image sera aligné avec le livre de la deuxième image ! Voir Figure 2.

Figure 2 : Une image d’un plan 3D peut être alignée avec une autre image du même plan en utilisant l’homographie

Mais qu’en est-il des points qui ne sont pas sur le plan ? Eh bien, ils ne seront PAS alignés par une homographie comme vous pouvez le voir sur la figure 2. Mais attendez, et s’il y a deux plans dans l’image ? Eh bien, vous avez alors deux homographies – une pour chaque plan.

Panorama : une application de l’homographie

Dans la section précédente, nous avons appris que si une homographie entre deux images est connue, nous pouvons déformer une image sur l’autre. Cependant, il y avait un gros problème. Les images devaient contenir un plan ( le haut d’un livre ), et seule la partie plane était alignée correctement. Il s’avère que si vous prenez une photo de n’importe quelle scène (pas seulement un plan) et que vous en prenez une deuxième en faisant tourner l’appareil photo, les deux images sont liées par une homographie ! En d’autres termes, vous pouvez monter votre appareil photo sur un trépied et prendre une photo. Ensuite, faites un panoramique autour de l’axe vertical et prenez une autre photo. Les deux images que vous venez de prendre d’une scène 3D complètement arbitraire sont liées par une homographie. Les deux images partageront certaines régions communes qui peuvent être alignées et assemblées et bingo, vous avez un panorama de deux images. Est-ce vraiment si facile ? Non, pas du tout ! (désolé de vous décevoir) La création d’un bon panorama est bien plus complexe, mais le principe de base est d’aligner les deux images en utilisant une homographie et de les assembler intelligemment pour que vous ne voyiez pas les coutures. La création de panoramas fera certainement partie d’un prochain post.

Comment calculer une homographie ?

Pour calculer une homographie entre deux images, vous devez connaître au moins 4 correspondances de points entre les deux images. Si vous avez plus de 4 points correspondants, c’est encore mieux. OpenCV va estimer de manière robuste une homographie qui correspond le mieux à tous les points correspondants. Habituellement, ces correspondances de points sont trouvées automatiquement en faisant correspondre des caractéristiques comme SIFT ou SURF entre les images, mais dans ce post, nous allons simplement cliquer les points à la main.

Regardons d’abord l’utilisation.

C++

Python

Regardons un exemple plus complet à la fois en C++ et en Python.

Exemple d’homographie C++ d’OpenCV

Les images de la figure 2. peuvent être générées en utilisant le code C++ suivant. Le code ci-dessous montre comment prendre quatre points correspondants dans deux images et déformer l’image sur l’autre.

Exemple d’homographie OpenCV Python

Les images de la figure 2. peuvent également être générées en utilisant le code Python suivant. Le code ci-dessous montre comment prendre quatre points correspondants dans deux images et déformer l’image sur l’autre.

Applications de l’homographie

L’application la plus intéressante de l’homographie est sans aucun doute la réalisation de panoramas ( a.k.a image mosaicing and image stitching ). Les panoramas feront l’objet d’un prochain billet. Voyons quelques autres applications intéressantes.

Correction de perspective à l’aide de l’homographie

Figure 3. Correction de perspective

Disons que vous avez une photo représentée sur la figure 1. Ne serait-il pas cool de pouvoir cliquer sur les quatre coins du livre et d’obtenir rapidement une image qui ressemble à celle de la Figure 3. Vous pouvez obtenir le code de cet exemple dans la section de téléchargement ci-dessous. Voici les étapes.

  1. Écrire une interface utilisateur pour collecter les quatre coins du livre. Appelons ces points pts_src
  2. Nous avons besoin de connaître le rapport d’aspect du livre. Pour ce livre, le rapport d’aspect ( largeur / hauteur ) est de 3/4. Nous pouvons donc choisir la taille de l’image de sortie pour être 300×400, et nos points de destination ( pts_dst ) pour être (0,0), (299,0), (299,399) et (0,399)
  3. Obtenir l’homographie en utilisant pts_src et pts_dst .
  4. Appliquer l’homographie à l’image source pour obtenir l’image de la figure 3.
Vous pouvez télécharger le code et les images utilisés dans ce post en vous inscrivant à notre newsletter ici.

Panneau d’affichage virtuel

Dans de nombreux événements sportifs télévisés, la publicité en virtuellement insérée dans le flux vidéo en direct. Par exemple, dans le football et le baseball, les publicités placées sur de petits panneaux publicitaires juste à l’extérieur de la limite du terrain peuvent être virtuellement modifiées. Au lieu d’afficher la même publicité pour tout le monde, les annonceurs peuvent choisir les publicités à montrer en fonction des données démographiques de la personne, de son emplacement, etc. Dans ces applications, les quatre coins du panneau publicitaire sont détectés dans la vidéo et servent de points de destination. Les quatre coins de la publicité servent de points d’origine. Une homographie est calculée sur la base de ces quatre points correspondants et elle est utilisée pour déformer la publicité dans la trame vidéo.

Après avoir lu ce post, vous avez probablement une idée sur la façon de mettre une image sur un panneau d’affichage virtuel. La figure 4. montre la première image téléchargée sur internet.

Figure 4. Première image téléchargée sur internet.

Et la figure 5. montre The Times Square.

Figure 5. The Times Square
Vous pouvez télécharger le code (C++ & Python) et les images utilisées dans cet exemple et les autres exemples de ce post en vous inscrivant à notre newsletter ici.

Nous pouvons remplacer l’un des panneaux publicitaires de The Times Square par l’image de notre choix. Voici les étapes.

  1. Écrivons une interface utilisateur pour rassembler les quatre coins du panneau publicitaire dans l’image. Appelons ces points pts_dst
  2. Définissons la taille de l’image que vous voulez mettre sur le panneau publicitaire virtuel à w x h. Les coins de l’image ( pts_src ) doivent donc être (0,0), (w-1,0), (w-1,h-1) et (0,h-1)
  3. Obtenir l’homographie en utilisant pts_src et pts_dst .
  4. Appliquer l’homographie à l’image source et la fusionner avec l’image de destination pour obtenir l’image de la figure 6.

Notez que dans la figure 6. nous avons inséré l’image montrée dans la figure 4. dans l’image Times Square.

Figure 6. Panneau d’affichage virtuel. Un des panneaux d’affichage sur le côté gauche a été remplacé par une image de notre choix.

Subscribe & Télécharger le code

Si vous avez aimé cet article et que vous souhaitez télécharger le code (C++ et Python) et les images d’exemple utilisées dans ce post, veuillez vous abonner à notre newsletter. Vous recevrez également un guide de ressources gratuit sur la vision par ordinateur. Dans notre bulletin d’information, nous partageons des tutoriels et des exemples OpenCV écrits en C++/Python, ainsi que des algorithmes et des nouvelles sur la vision par ordinateur et l’apprentissage automatique.

Subscribe Now

Image Credits

  1. L’image de la figure 4. a été la première image photographique téléchargée sur Internet. Elle est qualifiée d’utilisation équitable.
  2. L’image utilisée dans la figure 5. ( The Time Square ) est sous licence GFDL.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.