Vous êtes sur la page 1sur 50

Traitement d’images et vision

par ordinateur avec la


librairie OPENCV
Stéphane Bazeille
Mise en œuvre d’un système de
régulation basé sur la vision
Suivi d’un objet coloré à l’aide d’une
webcam montée sur un servo-moteur.
Capteur : webcam
Régulation : servo/pan & tilt + Labjack + PC
Le capteur visuel dans le
contexte de la robotique mobile
Capteur peu cher, il équipe la plupart des
robots.
Information riche (haute résolution).
Encore peu utilisé car traitements complexes.
Perception de l’environnement
Détection et évitement d’obstacles,
Reconnaissance d’objets et intervention,
Cartographie, carte d’exploration lors de la
découverte d’un environnement inconnu.
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’un ensemble de points.
Qu’est-ce que la vision
Chaque pixel contient des informations
sur la lumière (quantité et contenu
spectral/couleur) reçue en ce point de
la rétine.
Les objets (téléphone, voiture…)
n’existent pas sur la rétine, et pourtant
on les voit : leur interprétation est le
résultat du processus visuel.
Codage des images
RGB: 3 plans. Couleurs primaires en
synthèse additive comme l’œil humain.
Niveau de gris: 1 plan.

Cas courant: entier entre 0-255.


Parfois: double pour un codage
fréquentiel par exemple.
Le système de vision
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èle
algorithmique qui, vu de l’extérieur,
possède des propriétés semblables.
Les algorithmes de vision
Extraction de primitives à partir des
images.
Représentation des connaissances.
(modèle)
Mise en correspondance
image/connaissances : reconnaissance.
Les algorithmes de vision
1) Méthodes d’identifications « 2D ».
Prétraitement, segmentation (contour, régions)
Extraction d’attributs colorimétriques, de textures
et de forme,
Classification et reconnaissance.
2) Méthodes d’identifications « 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.
Pourquoi OPENCV
Utiliser la vision en contexte robotique
pour des applications simples.
Utiliser les traitements sans forcement
connaître les algorithmes.
Bibliothèque optimisée, traitement
temps réel.
Les algorithmes de vision
OPENCV intervient dans les premiers
niveaux du processus de reconnaissance :
Prétraitement des images,
Segmentation (contours, régions)
Segmentation (détection des points d’intérêts),
Appariement des points d’intérêts,
Calibration de la caméra,
Le prétraitement des images
Filtrage
Débruitage, rehaussement de contraste
Convolution (filtrage linéaire et non linéaire)
Fourier, Gabor, ondelettes…
Correction des couleurs ou de la luminosité
Espace couleur, histogrammes
Transformée de Fourier
Suppression des défauts (distorsion…)
La segmentation et calibration
Segmentation (extraction d’attributs)
Détection de contour ou de forme,
Extraction de régions,
Recherche de points intérêts,
Calibration
Mise en correspondance de points,
Calcul de pose et estimation de paramètres…
Concours Robotique SAUC’E
Les épreuves:
Franchir un cadre immergé sans le toucher (3mx2,5m)
Larguer un marqueur au dessus d'une cible circulaire
posée sur le fond.
Localiser une cible rouge « entre deux eaux » et la
toucher.
Produire une cartographie de la zone de compétition
(30mx20m). Obtenir les coordonnées de chaque objet:
le cadre, la cible, la boule rouge, le leurre, le pneu, le
plot, et zone de sortie flottante.
Faire surface dans un hexagone blanc flottant (3mx3m)
Présentation OPENCV
Généralités sur OPENCV
Compiler sous Visual C++ 6
Un premier programme
Traitement des images et des séquences
Création d’une interface graphique
Programme de calibration à partir d’un
échiquier (méthode de Zhang)
Présentation OPENCV
Bibliothèque de traitement d’images et
de vision par ordinateur en langage
C/C++, optimisée, proposée par Intel
pour Windows et Linux.
Elle est « Open Source »
Elle comprend un très grand nombre
d’opérateurs “classiques”.
Présentation OPENCV
CV et CVAUX
Traitement d’image
Gradient, contours, coins et contours actifs,
Morphomath (érosion, dilatation, fermeture…)
Filtrages diverses (lissage, rehaussement de
contraste, suppression de fond…)
Conversion d’espace couleur (RGB, HSV, YCbCr…)
Etiquetage, manipulation de contours,
Transformations diverses (Fourier, Hough…)
Histogrammes
Présentation OPENCV
Analyse de mouvement et suivi
Suivi d’objets, flot optique…
Reconstruction
Calibration, mise en correspondance…
Détection et reconnaissance de formes
détection de visages et autres formes
particulières…
Présentation OPENCV
CXCORE et HIGHGUI
Structures élémentaires
matrices, tableaux, listes, files, graphes, arbres…
opérateurs standards sur ces structures,
Dessin de primitives géométriques
lignes, rectangles, ellipses, polygones… et texte.
Manipulation des images et des séquences
lecture, écriture…
Interface utilisateur
fenêtre, entrées/sorties utilisateur…
Compilation sous VISUAL C++ 6
Les chemins suivants permettant de lier la bibliothèque, sont des chemins absolus
considérant l'installation par défaut dans C:\Program Files\OpenCV\

Dans le menu "Project", "Settings", "C/C++", category "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", "Link", catégorie "Input".


Ajouter les librairies 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

Modifier la variable d'environnement "PATH" de Windows en ajoutant:


C:\Program Files\OpenCV\bin
Premier programme
Créer un projet Win32ConsoleApplication
Ajouter les liens précédents.
Ajouter dans le fichier main.cpp
#include <cv.h>
#include <cvaux.h>
#include <highgui.h>

Exemple : Lecture/affichage d’une image


et application d’un filtre de convolution.
Rappel : la convolution
• Convolution de l'image avec un masque (noyau) fixe

• La convolution est une opération linéaire


La convolution
• Exemple de filtre : Le filtre de moyennage
– Chaque pixel de l'image résultat prend comme valeur la
somme pondérée des pixels voisins.

90 100 120 125 110 90 100 Gaussien


1/16 2/16 1/16
120 110 95 130 100 110 110 2/16 4/16 2/16
1/16 2/16 1/16
115 110 100 120 90 105 110 Laplacien
0 -1 0 -1 -1 -1
90 110 110 95 130 110 110 -1 4 -1 -1 8 -1
0 -1 0 -1 -1 –1
120 125 100 110 105 110 125
Gradient
-1 0 1 1 2 1
105 125 110 90 100 90 125
-2 0 2 0 0 0

110 130 100 110 90 100 130


Résultat = 107 -1 0 1 -1 -2 -1
Rappel : les pointeurs
Variable contenant l’adresse d’une autre variable
d’un type donné.
Exemple:
int a=2;
int *p1;
p1=&a;
int b=*p1;

int tableau[100];
tableau[3]=5;
*(tableau+2)=4;

int* t=tableau;
Rappel : les pointeurs
CvMat Ma=cvMat(3,3,CV_32FC1);
CvMat *Mb=cvCloneMat(&Ma);
CvMat *Mc=cvCreateMat(3,3,CV_32FC1);
void cvAdd(CvMat*, CvMat*, CvMat*);
cvAdd(&Ma,Mb,Mc);

Class CvMat{
int rows; printf(‘’%lf’’,Ma.rows);
int cols; printf(‘’%lf’’,*Mb.cols);
int type;
float[] data.fl; printf(‘’%lf’’,*Mc.data.fl[0]);
} printf(‘’%lf’’,Mc->data.fl[0]);
Généralités
Codage des images comme les matrices
Un seul tableau (codage par défaut BGR)
Classe IPLImage (objet)
width
height
nChannels (en général 1 ou 3)
depth (Unsigned char 8bits jusqu’au Float 64)
imageData
Un premier programme
Déclaration
IplImage *im = cvCreateImage(cvSize(nl,nc),IPL_DEPTH_8U,1);
IplImage *gaussian = cvCreateImage(cvSize(nl,nc),IPL_DEPTH_8U,1);

Chargement et affichage
im = cvLoadImage(« Mon_image.jpg », 1);
cvNamedWindow(« Ma fenêtre », 1);
cvSmooth(im,gaussian,CV_BLUR,7,7);
cvShowImage (« Ma fenêtre », gaussian);
cvWaitKey(3000);
Libération
cvReleaseImage(&im);
Exemple convolution
Traitement séquence
Traitement d'un flux vidéo provenant
d'une webcam (détection des pixels à
dominantes rouges)

Capture d’une image dans une séquence


CvCapture* capture=cvCaptureFromCAM(0);
IplImage* frame=cvQueryFrame(capture);
Exemple de détection couleur
Accès aux pixels avec OPENCV

for(int i=0;i<frame->height;i++)
{
for(int j=0;j<(frame->width*frame->nChannels);j+=frame->nChannels)
{
frame->imageData[i*frame->widthStep+(j+0)]= 0;
frame->imageData[i*frame->widthStep+(j+1)]= 0;
frame->imageData[i*frame->widthStep+(j+2)]=255;
}
}
WebcamDEMO
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 fichier Demo.h
Compléter le fichier OpenCvDemoDlg.cpp
contenant les fonctions associées aux boutons.
Créer le fichier Demo.cpp
Classe image
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); //afficher l'image dans la fenêtre
}
}
~UneImage(){ //destructeur
cvReleaseImage(&img);
}
void display(){
cvNamedWindow("Image Résultat",1);
cvShowImage("Image Résultat",img);
}
void process();
};
OpenCvDemoDlg.cpp
Le fichier Dlg contient la classe fenêtre.
Inclure les fichiers:
Demo.h contenant la classe UneImage.
cv.h,cvaux.h,highgui.h
Compléter les fonctions associées aux
boutons
OnOpen
OnProcess
OpenCvDemoDlg.cpp
void COpenCVDemoDlg::OnOpen()
{
// TODO: Add your control notification 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);
}
}
OpenCvDemoDlg.cpp
void COpenCVDemoDlg::OnProcess()
{
// TODO: Add your control notification handler code here
if(image!=0){
image->process();
image->display();
}
}

Dans le fichier Demo.cpp on trouvera donc les fonctions


de traitement associées à la méthode process.
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);
}
Résultats
Programme Calibration
Calibration à partir d’un échiquier et
d’une webcam, sans connaissances
des positions de la caméra.
Lecture du flux vidéo
Photos de la cible d’étalonnage
Recherche des coins dans les photos
Calcul des paramètres de calibration par
des techniques d'algèbre linéaire
standards (moindre carrés)
Étalonnage d'une caméra
On veut connaître la relation entre les points de l'espace (3D, en
millimètres) et leur position dans l'image (2D, en pixels).
On utilise un modèle simple (mais efficace) pour décrire le processus
d'acquisition d'image :

point image Paramètres Paramètres point 3D


(pixel) intrinsèques extrinsèques (en mm)
L'étalonnage consiste à déterminer les paramètres de ce modèle
Étalonnage d'une caméra :
Explication
 K du modèle
~ ~
p  TSPr ECG P
 
point image intrinsèque extrinsèque point
Centre de Centre du Os s
I
3D
projection plan image u
OG
v
X Z
Oc
(u0,v0)
Y
X Z
p=(u,v)
Axe optique
Y

Plan image P=(X,Y,Z)


Conclusion sur OPENCV
« Open Source » donc utilisée par une très
grande communauté.
Les codes sont optimisés.
La documentation (papier et en ligne) décrit
pratiquement tous les algorithmes
implémentés.
Des exemples de code sont disponibles dans le
dossier « samples » d’OPENCV pour des
problèmes assez complexes.
Le boitier Labjack
Système d'acquisition de données à connexion
USB et Ethernet.
Piloter un moteur par une sortie numérique.

PWM : Modulation de largeur d'impulsions


(Pulse Width Modulation) utilisée pour synthétiser
des signaux continus à l'aide de circuits à
fonctionnement tout ou rien.
16-bit PWM output: le rapport cyclique détermine
la valeur.
Fonctions Labjack
int U3Open(LJ_HANDLE* pHandle);
int U3Reset(LJ_HANDLE lngHandle);
int U3ConfigTimers(LJ_HANDLE lngHandle, int
timer_clock_divisor, int
timer_duty_cycle_init);
int U3ModifyDutyCycle(LJ_HANDLE
lngHandle, int timer_duty_cycle, int
num_timer);
int U3Close(LJ_HANDLE* pHandle);
Le servo-moteur
Un servomoteur est un système motorisé
capable d'atteindre des positions
prédéterminées, puis de les maintenir.

En aéromodélisme, les servos servent à


actionner les parties mobiles comme les
ailerons par exemple.
On utilisera des servos asservis en position.
(angle compris entre -40°et +40°)
Commande d’un servomoteur
Paramètres pour la commande d'un servomoteur
-         Fréquence Labjack 4 Mhz.
-         Fréquence et période du PWM ~61 Hz et
16.39ms (avec 65536 échantillons par période).
Il faut fournir au servo-moteur une impulsion
suivie d’un retour à zéro. La largeur d’impulsion
est convertie proportionnellement en angle
comme indiqué sur le schéma suivant.
PWM
Nb échantillons
/période : 65536
Déplacement max
image : 768
Déplacement max
servo : 61136
Déplacement min
servo 57936
Sujet du TP
1) Détecter les objets rouges dans la
séquence et calculer le barycentre.
2) Calculer l’angle de déplacement
nécessaire pour recentrer l’objet dans
l’image.
3)Générer le signal PWM correspondant
à l’angle calculé.
Web
http://www.ensieta.ecole/e3i2/Bazeille/
http://perception.inrialpes.fr/people/Horaud/livre-her
mes.html
http://www710.univ-lyon1.fr/~ameyer/devel/opencv/
docs/ref/opencvref_cv.htm
http://www710.univ-lyon1.fr/~ameyer/devel/opencv/
docs/ref/opencvref_cxcore.htm
http://www710.univ-lyon1.fr/~ameyer/devel/opencv/
docs/ref/opencvref_highgui.htm

Vous aimerez peut-être aussi