Traitement d’images et vision par ordinateur avec la librairie OPENCV

Slides:



Advertisements
Présentations similaires
Manipulation d’un objet virtuel à l’aide d’une cible et d’une caméra
Advertisements

Premier programme en C :
Traitement d’images : concepts fondamentaux
Programmation Orienté Objet en C++
Algèbre de composants : une approche fonctionnelle à la sémantique de documents Bart Lamiroy LORIA/INPL QGar - École des Mines de Nancy.
C++ 6ème cours Patrick Reuter maître de conférences
Transition image classique image numérique
Cours n° 8 Conception et Programmation à Objets
C.
FLSI602 Génie Informatique et Réseaux
Introduction à limagerie numérique Acquisition, Caractéristiques, Espaces couleurs, Résolution.
12 novembre 2012 Grégory Petit
OpenCV: Introduction au Traitement d’Images et Vidéo
Identification des personnes par l’iris
LOGOS_w Imagerie La palette des icônes. Le groupe dicônes situé au dessus des images du patient permet dintervenir sur limage affichée et active.
INF-1019 Programmation en temps réel
FACULTE DES SCIENCES DE TUNIS
Détection de « tâches dobjets artificialisés » D.Réchal IRD, ESPACE Dev 18/02/2011 – Montpellier (France)
Algorithmique et Programmation
Python Interfaces graphiques
Réalisateur : PHAM TRONG TÔN Tuteur : Dr. NGUYEN DINH THUC
Création d’un programme :
Leçon 6 : Structures de données dynamiques IUP 2 Génie Informatique Méthode et Outils pour la Programmation Françoise Greffier.
Bibliothèque standard du C++
Le filtrage d’images.
Mise en correspondance et Reconnaissance
C++ : classes Introduction aux Langages Orientés Objets
Détection de code-barres sur les formulaires Hemoccult II
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 5 – Héritage, Interfaces et Listes génériques.
FICHIERS : Définition : Algorithme général:
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
Capsule 1 Introduction à Aphelion
Capsule 1 Introduction à Aphelion
Projet Traitement d'images en C
IFT2740 : Outils de l'infographie 3D Systèmes et modèles graphiques
Design dun système de vision embarqué. Application:
PIF-6003 Sujets spéciaux en informatique I
OpenCV: Introduction au Traitement d’Images et Vidéo
SUJETS SPÉCIAUX EN INFORMATIQUE I
COURS DE PROGRAMMATION ORIENTEE OBJET :
Leçon 1 : notion dobjet IUP Génie Informatique Besançon Méthode et Outils pour la Programmation Françoise Greffier Université de Franche-Comté.
Thierry Molinier > David Fofi >
SCHNEIDER Laurent NOYER Vincent TEISSIE Alexis
L’essentiel du langage C
Projet de session – SCG-67210
Programmer en langage c
Programmation Système et Réseau (sous Linux)
Projet Télédétection Vidéo Surveillance Deovan Thipphavanh – Mokrani Abdeslam – Naoui Saïd Master 2 Pro SIS / 2006.
Introduction à Visual Studio C++ (VC++)
Programmation Système et Réseau
Les réseaux de neurones à réservoir en traitement d’images
Programmation Création d’une mire 1 afficher une image
Les surcharges d'opérateurs
Semaine 06 vA14 Modèle colorimétrique Détection de contours
Introduction au Traitement d’image
Algorithmique et programmation en
INF3500 : Conception et implémentation de systèmes numériques Pierre Langlois Performance de circuits.
Calcul numérique de la transformée de Fourier Applications:
Introduction à SVG Scalable Vector Graphic. Informations ● Plus d'informations ici (draft, tutoriaux, outils... ): –
Visualisation des flots optiques en 3D
Traitements d'images et Vision par ordinateur
Traitement d’images 420-D78-SW A15 Semaine 02.
Traitement d’images Semaine 09 v.A15.
Les calques Les Template (modèles) Les Comportements Les scénarios Les formulaires Les CSS Le serveur Web de l’UTC Présentation.
C++ BY AURÉLIEN MODULO MARION. PLAN DES TROIS PRÉSENTATIONS C++ avancé C++ orienté objet Bases de C++
Filtrage des images.
Introduction à OpenCV GEL – Design III Charles du Tremblay
Transcription de la présentation:

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 Aujourd’hui la plupart des robots sont équipés d’un système de vision pour percevoir leur environnement

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 Reconstruction 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 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 Chargement et affichage Libération 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 (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

Étalonnage d'une caméra : Explication du modèle point image intrinsèques extrinsèques point 3D Z Y X u v O I c G (u ,v ) p=(u P=(X,Y,Z) Centre de projection Axe optique Centre du plan image Plan image

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