560 likes | 979 Views
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.
E N D
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 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. • Gaussien • 1/16 2/16 1/16 • 2/16 4/16 2/16 • 1/16 2/16 1/16 • Laplacien • 0 -1 0 -1 -1 -1 • -1 4 -1 -1 8 -1 • 0 -1 0 -1 -1 –1 • Gradient • -1 0 1 1 2 1 • -2 0 2 0 0 0 • -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);
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; } }
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 fichierOpenCvDemoDlg.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); }
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 relationentre 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 (pixel) Paramètres intrinsèques Paramètres extrinsèques point 3D (en mm) L'étalonnage consiste à déterminer les paramètres de ce modèle
Centre de Centre du O I u projection plan image O G v X Z O c (u ,v ) 0 0 Y X Z p=(u ,v ) Axe optique Y Plan image P=(X,Y,Z) Étalonnage d'une caméra :Explication du modèle point image intrinsèques extrinsèques point 3D
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-hermes.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