Traitement d'image
et vision par ordinateur
avec la librairie OpenCV
Stéphane Bazeille
Qu'est-ce que la vision ?
Le monde a une structure 3D et est composé d'objets
L'être humain sait parfaitement décrire et interpréter ce monde
Pourtant, l'information disponible sur la rétine n'est qu'unensemble de points
Chaque pixel contient des informations sur la lumière (quantité etcontenu spectral/couleur) reçue en ce point de la rétine
Les objets (téléphone, voiture. . . ) n'existent pas sur la rétine etpourtant on les voit : leur interprétation est le résultat duprocessus visuel
Stéphane Bazeille 2007 2 / 39
Qu'est-ce que la vision ?
Stéphane Bazeille 2007 3 / 39
Le problème de la vision
La vision humaine est extrêmement complexe
La vision par ordinateur ne cherche pas à comprendre ou àreproduire la vision humaine mais à construire un modèlealgorithmique qui, vu de l'extérieur, possède des propriétéssemblables
Stéphane Bazeille 2007 4 / 39
Une théorie de la vision
Connaissance a priori
Physiques (optiques, forces/interactions)
Géométriques (formes des objets, formation de l'image)
Sémantique (fonction des objets comportement
Exemple
Quelles sont les valeurs mesurables sur une voiture qui permettent del'identier dans une image ?
Stéphane Bazeille 2007 5 / 39
Les algorithmes de vision
Extraction de primitives à partir des images
Représentation des connaissances (modèle)
Mise en correspondance image/connaissances : reconnaissance
Méthodes d'identication 2D Prétraitement, segmentation (contour, régions)
Extraction d'attributs colorimétriques, de textures et de formes
Classication et reconnaissance
Méthodes d'identication 3D Segmentation (détection des points d'intérêts)
Appariement des points d'intérêts
Calibration de la caméra
Extraction d'attributs géométriques
Reconnaissance
Stéphane Bazeille 2007 6 / 39
Traitement des images
Filtrage
Débruitage, rehaussement de contraste Convolution (ltrage linéaire et non linéaire) Fourier, Gabor, ondelettes . . .
Correction des couleurs ou de la luminosité Espace couleur Transformée de Fourier
Suppression des défauts (distorsion . . .)
Segmentation (extraction d'attributs)
Détection de contours
Fermeture de contours
Extraction de régions
Recherche de points intérêts
Stéphane Bazeille 2007 7 / 39
Exemple : la convolution
Convolution de l'image avec un masque (noyau) xe
La convolution est une opération linéaire
Ef (i , j) = A ∗ E =
m/2∑h=−m/2
m/2∑k=−m/2
A(h, k)E (i − h, j − k)
A
m1 1 11 1 11 1 1
∗ 1/9
m
Stéphane Bazeille 2007 8 / 39
Exemple : la convolution
Exemple de ltre : le ltre de moyennage
Chaque pixel de l'image résultat prend comme valeur la sommepondérée des pixels voisins
90 100 120 125 110 90 100120 110 95 130 100 110 110115 110 100 120 90 105 11090 110 110 95 130 110 110120 125 100 110 105 110 125105 125 110 90 100 90 125110 130 100 110 90 100 130
⇒ résultat = 107
Stéphane Bazeille 2007 9 / 39
Exemple : la convolution
Exemples de matrices de convolution
Gaussien 1/16 2/16 1/162/16 4/16 2/161/16 2/16 1/16
Laplacien 0 -1 0
-1 4 -10 -1 0
-1 -1 -1-1 8 -1-1 -1 -1
Gradient -1 0 1
-2 0 2-1 0 1
1 2 10 0 0-1 -2 -1
Stéphane Bazeille 2007 10 / 39
Exemple : la convolution
Le résultat n'est pas une combinaison linéaire des pixels de l'image àtraiter mais plutôt une fonction non-linéaire telle qu'un min, un maxou la médiane.
Stéphane Bazeille 2007 11 / 39
Certains problèmes
Plusieurs facteurs inuencent le traitement et l'interprétation desimages :
Éclairage variable (éclairage naturel ou articiel)
Arrière-plan
Déformation de perspective
Réectance des matériaux
Modication des couleurs
Bruit du capteur
. . .
Stéphane Bazeille 2007 12 / 39
Quelques exemples concrets
Robotique mobile
Plusieurs facteurs inuencent le traitement et l'interprétation desimages :
Évitement d'obstacles
Découverte d'un environnement inconnu et construction d'unecarte (exploration)
Localisation par rapport aux objets
Reconnaissance d'objets
Stéphane Bazeille 2007 13 / 39
Calibration et reconstruction
Coordonnées homogènes
On passe des coordonnées cartésiennes aux coordonnées homogènesen ajoutant un "1" comme 4ème élément au vecteur
Notions importantes pour la reconstruction
Rotation
Translation
Changement d'échelle ("scaling")
Stéphane Bazeille 2007 14 / 39
Coordonnées homogènes : Transformations d'intérêt
Rotation
RX (α) =
1 0 0 00 cos(α) − sin(α) 00 sin(α) cos(α) 00 0 0 1
RY (β) =
cos(β) 0 sin(β) 0
0 1 0 0− sin(β) 0 cos(β) 0
0 0 0 1
RZ (γ) =
cos(γ) − sin(γ) 0 0sin(γ) cos(γ) 0 0−0 0 1 00 0 0 1
RXYZ (α, β, γ) = RX (α)RY (β)RZ (γ)
RXYZ (α, β, γ)︷ ︸︸ ︷ cos(β) cos(γ) cos(β) sin(γ) sin(β) 0
sin(α) sin(β) cos(γ) + cos(α) sin(γ) − sin(α) sin(β) sin(γ) + cos(α) cos(γ) − sin(α) cos(β) 0
− cos(α) sin(β) cos(γ) + sin(α) sin(γ) cos(α) sin(β) sin(γ) + sin(α) cos(γ) cos(α) cos(β) 0
0 0 0 1
Stéphane Bazeille 2007 15 / 39
Coordonnées homogènes : Transformations d'intérêt
Translation
T =
1 0 0 tx
0 1 0 ty
0 0 1 tz
0 0 0 1
Changement d'échelle "scaling"
S =
sx 0 0 00 sy 0 00 0 sz 00 0 0 1
Stéphane Bazeille 2007 16 / 39
Étalonnage d'une caméra
On veut connaître la relation ("Mapping") entre les points del'espace (3D en mm) et leur position dans l'image (2D en px)
On utilise un modèle simple (mais ecace) pour décrire leprocessus d'acquisition d'image :
susvs
︸ ︷︷ ︸
point image (pixel)
=
α γ u0 00 β v0 00 0 1 0
︸ ︷︷ ︸paramètres intrinsèques
paramètres extrinsèques︷ ︸︸ ︷r1 r2 r3 txr4 r5 r6 tyr7 r8 r9 tz0 0 0 1
XG
YG
ZG
1
︸ ︷︷ ︸
point 3D en mm
⇒ L'étalonnage consiste à déterminer les paramètres de ce modèle
Stéphane Bazeille 2007 17 / 39
Étalonnage d'une caméra
Explication du modèle
Le modèle provient de la formule suivante (si γ = 0) :
p︸︷︷︸point image
=
K︷ ︸︸ ︷TSPr︸ ︷︷ ︸
intrinsèque
extrinsèque︷︸︸︷ECG P︸︷︷︸
point 3D
Stéphane Bazeille 2007 18 / 39
Étalonnage d'une caméra
1 Placer une cible d'étalonnage devant la caméra
2 Repérer la position de chaque marqueur de la cible dans l'image
⇒ On obtient une liste de coordonnées3D (global) accompagnées de leurprojection dans l'image
[u1 v1][u2 v2]...
...[uN vN ]
⇔
[X1 Y1 Z1][X2 Y2 Z2]...
......
[XN YN ZN ]
3 Chaque point nous donne 2 équations de plans et on a 11 inconnues (5 intr.
+ 6 extr. car il y a 6 contraintes sur R)susvs
=
α γ u0
0 β v0
0 0 1
r1 r2 r3 tx
r4 r5 r6 ty
r7 r8 r9 tz
XG
YG
ZG
4 On construit un système d'équations linéaires que l'on peut résoudre à l'aide
des techniques d'algèbre linéaire standards (moindre carrés) → mij
5 On extrait, s'il y a lieu, les paramètres explicites α, β, tx . . .
Stéphane Bazeille 2007 19 / 39
Étalonnage d'une caméra
Il existe plusieurs techniques d'étalonnage : Zhang, Tsai, Heikkilä,Faugeras, . . .
Le type de cible et le modèle de la caméra utilisée changent
Le système d'équations à résoudre dière en fonction de cesvariantes
L'idée est toujours la même : trouver les paramètres permettantde faire le "mapping" entre les points de l'espace et leur positiondans l'image
Stéphane Bazeille 2007 20 / 39
OpenCV
1 Généralités sur OpenCV
2 Compiler Visual C++ 6
3 Premier programme utilisant une Webcam
4 Deuxième programme utilisant les MFC 1
1. Microsoft Foundation ClassStéphane Bazeille 2007 21 / 39
Présentation
Bibliothèque de traitement d'image et de vision par ordinateur enlangage C/C++, optimisée, proposée par Intel pour Windows etLinux
Open Source
Comprend une très grand nombre d'opérateurs "classiques"
Stéphane Bazeille 2007 22 / 39
Présentation
CV et CVAUX
Traitement d'image Gradient, contours, coins et contours actifs Morphomath (érosion, dilatation, fermeture . . .) Filtrages divers (lissage, rehaussement contraste, suppression fond . . .) Conversion d'espace couleur (RGB, HSV, YCbCr . . .) Etiquetage, manipulation de contours Transformations diverses (Fourier, Hough . . .) Histogrammes
Analyse de mouvement et suivi Suivi d'objets, ot optique . . .
Reconstruction Calibration, mise en correspondance . . .
Détection et reconnaissance de formes Détection de visages et autres formes particulières
Stéphane Bazeille 2007 23 / 39
Présentation
CXCORE et HIGHGUI
Structures élémentaires Matrices, tableaux, listes, les, graphes, arbres . . . Opérateurs standards sur ces structures
Dessin de primitives géométriques Lignes, rectangles, ellipses, polygônes . . . et texte
Création et libération d'images
Chargement et sauvegarde d'images
Chargement et sauvegarde de vidéos
Interface utilisateur Souris Clavier
Stéphane Bazeille 2007 24 / 39
Généralités
Codage des imagesUn seul tableau (codage par défaut BGR)
Déclaration d'imageIplImage *im =
cvCreateImage(cvSize(nl,nc),IPL_DEPTH_8U,3) ;
LibérationcvReleaseImage(&im) ;
Chargement et achageim = cvLoadImage("Mon_image.jpg",1) ;
cvNamedWindow("Ma_fenetre",1) ;
cvShowImage("Ma_fenetre",im) ;
Stéphane Bazeille 2007 25 / 39
Généralités
Accès au pixel
unsigned char *data =reinterpret_cast <unsigned char *>(frame→imageData) ;
for(i=0 ;i<nl ;i++)
for(j=0 ;j<(nc*nbchannel) ;j+=nbchannel)
data[j]=255 ;data[j+1]=0 ;data[j+2]=0 ;
data+=step ;
Stéphane Bazeille 2007 26 / 39
Compilation sous VISUAL C++ 6
Les chemins suivants permettent de lier la bibliothèque et sont des cheminsabsolus considérant l'installation par défaut dans :C :\Program Files\OpenCV\
Dans le menu Project, Settings, C/C++, catégorie Preprocessor,ajouter les liens suivants dans Additional include directories :
C :\Program Files\OpenCV\cv\include C :\Program Files\OpenCV\cvaux\include C :\Program Files\OpenCV\cxcore\include C :\Program Files\OpenCV\otherlibs\highgui
Dans le menu Project, Settings, Links, catégorie Input, ajouter leslibrairies suivantes dans Object/library modules :
cv.lib cvaux.lib cxcore.lib highgui.lib
Ajouter le lien suivant dans Additional library path :
C :\Program Files\OpenCV\lib
Modier la variable d'environnement PATH de Windows en ajoutant :
C :\Program Files\OpenCV\bin
Stéphane Bazeille 2007 27 / 39
Premier programme
Créer un projet Win32ConsoleApplication
Ajouter les liens précédents
Ajouter dans le chier main.cpp :#include <stdio.h>#include <cv.h>#include <cvaux.h>#include <highgui.h>
Stéphane Bazeille 2007 28 / 39
ExempleAchage et traitement d'un ux vidéo provenant d'une webcam
int main ()
int i,j ;CvCapture *capture = cvCaptureFromCAM(0) ;cvNamedWindow("Capture Webcam",0) ;cvNamedWindow("Capture Rouge",0) ;if(capture)
IplImage *frame = cvQueryFrame(capture) ;int nl=frame→height, nc=frame→width,
step=frame→widthStep, nbchannel=frame→nChannels, a=1 ;printf("PRESS SPACE TO QUIT \n\n") ;while(a)
frame = cvQueryFrame(capture) ;cvShowImage("Capture Webcam",frame) ;if(cvWaitKey(1) !=-1)a=0 ;unsigned char *data = reinterpret cast <unsigned char *>(frame→imageData) ;for(i=0 ;i<nl ;i++)
for(j=0 ;j<(nc*nbchannel) ;j+=nbchannel)
if((data[j]<128)&&(data[j+1]<128)&&(data[j+2]>128))data[j]=0 ;data[j+1]=0 ;data[j+2]=255 ;
elsedata[j]=128 ;data[j+1]=128 ;data[j+2]=128 ;data+ = step ;
cvShowImage("Capture Rouge",frame) ;
else printf("Video stream not found \n\n") ;return 0 ;
Stéphane Bazeille 2007 29 / 39
WebcamDEMO
Stéphane Bazeille 2007 30 / 39
Programme utilisant les MFC
Créer un projet MFCAppWizard(exe)→ Dialog-based application (OK/Cancel)→ Création automatique de 4.cpp et 4.h
Ajouter les liens précédents Créer les boutons dans la fenêtre
→ A chaque ajout d'un bouton une fonction est créée
Créer le chier Demo.h
Compléter le chier OpenCvDemoDlg.cpp contenant lesfonctions associées aux boutons
Créer le chier Demo.cpp
Stéphane Bazeille 2007 31 / 39
Classe image : Demo.h
class UneImage
IplImage*img ;public :UneImage(CString filename, bool display=TRUE) ← constructeur
img = cvLoadImage(filename) ;if(display)
cvNamedWindow("Image Originale",1) ; ← créer une fenêtre
cvShowImage("Image Originale",img) ; ← acher l'image dans la fenêtre
void process() ;void display()
cvNamedWindow("Image Résultat",1) ;cvShowImage("Image Résultat",img) ;
~UneImage() ← destructeur
cvReleaseImage(&img) ;
;
Stéphane Bazeille 2007 32 / 39
OpenCvDemoDlg.cpp
Le chier Dlg contient la classe fenêtre
Inclure les chiers : Demo.h contenant la classe UneImage cv.h, cvaux.h, highgui.h
Compléter les fonctions associées aux boutons : OnOpen OnProcess
Stéphane Bazeille 2007 33 / 39
OpenCvDemoDlg.cpp OnOpen
void COpenCVDemoDlg : :OnOpen()⇒ ToDo : add your control notication handler code here
CFileDialog dlg(TRUE,_T("*.bmp"),"",OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,"image files(*.bmp ;*.jpg)|*.bmp ;*.jpg|AVI files(*.avi)|*.avi|All Files(*.*)|*.*||",NULL) ;
char title[] = "Open Image" ; dlg.m_ofn.lpstrTitle = title ;if(dlg.DoModal() == IDOK) CString path = dlg.GetPathName() ;
if(image !=0) delete image ;image = new UneImage(path) ;
;
Stéphane Bazeille 2007 34 / 39
OpenCvDemoDlg.cpp OnProcess
void COpenCVDemoDlg : :OnProcess()⇒ ToDo : add your control notication handler code here
if(image !=0)
image → process() ;image → display() ;
Dans le chier Demo.cpp, on trouvera donc les fonctions detraitement associées à la méthode process.
Stéphane Bazeille 2007 35 / 39
Demo.cpp
#include "stdafx.h"#include "Demo.h"
UneImage *image = 0 ;
void UneImage : :process()
IplImage *image = reinterpret_cast<IplImage*>(img) ;IplImage *color = cvCreateImage(cvSize(image→width,image→height),
IPL_DEPTH_8U,3) ;IplImage *gray = cvCreateImage(cvSize(image→width,image→height),
IPL_DEPTH_8U,1) ;IplImage *laplace = cvCreateImage(cvSize(image→width,image→height),
IPL_DEPTH_16S,1) ;
cvCvtColor(image, gray, CV_BGR2GRAY) ;cvLaplace(gray,laplace,3) ;cvConvertScale(laplace,gray,1,0) ;cvCvtPlaneToPix(gray,gray,gray,0,image) ;
Stéphane Bazeille 2007 36 / 39
Résultats
Stéphane Bazeille 2007 37 / 39
Conclusion
La documentation (papier et en ligne) décrit pratiquement tousles algorithmes implémentés
Des exemples de codes sont disponibles dans le dossier "samples"d'OpenCV pour des problèmes assez complexes
Stéphane Bazeille 2007 38 / 39
Web
http://www.ensieta.ecole/e3i2/Bazeille
http://perception.inrialpes.fr/people/Horaud/livre-hermes/html
http://www710.univ-lyon1.fr/~ameyer/devel/opencv/docs/ref/opencvref_cv.htmhttp://www710.univ-lyon1.fr/~ameyer/devel/opencv/docs/ref/opencvref_cxcore.htmhttp://www710.univ-lyon1.fr/~ameyer/devel/opencv/docs/ref/opencvref_highgui.htm
Stéphane Bazeille 2007 39 / 39