Lors de la résolution de problèmes de vision par ordinateur, vous ne pouvez pas vous passer de l'utilisation de logiciels spécialisés. Je veux vous présenter ceci - OpenCV - une bibliothèque open source en C ++. Dispose d'un ensemble d'outils pour la numérisation d'images, le traitement ultérieur via des algorithmes numériques ou un réseau de neurones.
Algorithmes de traitement d'image de base: interprétation d'image, étalonnage de la caméra par rapport à un standard, élimination des distorsions optiques, détection de similitude, analyse du mouvement des objets, détermination de la forme des objets et suivi des objets, reconstruction 3D, segmentation des objets, reconnaissance des gestes.
Vous pouvez télécharger la bibliothèque sur le site officiel http://sourceforge.net/projects/opencvlibrary/
Structure de la bibliothèque OpenCV
cxcore - noyau
* contient des structures de données et des algorithmes de base:
- opérations de base sur des tableaux numériques multidimensionnels
- algèbre matricielle, fonctions mathématiques, générateurs de nombres aléatoires
- Ecriture / restauration de structures de données vers / depuis XML
- les fonctions de base Graphiques 2D
CV - module de traitement d'image et de vision par ordinateur
- opérations de base sur les images (filtrage, transformations géométriques, transformation des espaces couleurs, etc.)
- analyse d'image (sélection de traits distinctifs, morphologie, recherche de contours, histogrammes)
- analyse de mouvement, suivi d'objets
- détection d'objets, en particulier de visages
- calibrage de la caméra, éléments de restauration de la structure spatiale
Highgui - un module pour l'entrée / sortie d'image et vidéo, création d'interface utilisateur
- capturer des vidéos à partir de caméras et de fichiers vidéo, lire / écrire des images statiques.
- fonctions d'organisation d'une interface utilisateur simple (toutes les applications de démonstration utilisent HighGUI)
Cvaux - Fonctionnalités expérimentales et obsolètes
- les espaces. vision: étalonnage stéréo, auto étalonnage
- recherche de correspondance stéréo, clics dans les graphiques
- trouver et décrire les traits du visage
CvCam - capture vidéo
- vous permet de capturer des vidéos à partir de caméras vidéo numériques (le support est interrompu et dans les versions récentes, ce module est manquant)
![](https://i0.wp.com/diytimes.ru/uploads/default/posts/887/defaulttemp.png)
Installer OpenCV sur Linux
Après le téléchargement dernière version OpenCV à partir du site du développeur http://sourceforge.net/projects/opencvlibrary/, vous devez décompresser l'archive et construire via CMake version 2.6 ou supérieure.
L'installation de CMake est standard:
Sudo apt-get install cmake
Pour afficher les fenêtres OpenCV, vous devez installer les bibliothèques GTK + 2.x et libgtk2.0-dev
Apt-get install libgtk2.0-dev
Construire la bibliothèque:
Tar -xjf OpenCV-2.2.0.tar.bz2 cd OpenCV-2.2.0 cmake -D CMAKE_BUILD_TYPE \u003d RELEASE -D CMAKE_INSTALL_PREFIX \u003d / usr / local ./ make make install
Pour tester la bibliothèque installée, vous pouvez créer des exemples et exécuter quelque chose:
Exemples de CD / c / chmod + x build_all.sh ./build_all.sh ./delaunay
Si au lieu d'une image de test, vous voyez l'erreur "erreur lors du chargement des bibliothèques partagées: libopencv_core.so.2.2: impossible d'ouvrir le fichier objet partagé: aucun fichier ou répertoire de ce type", cela signifie que le programme ne peut pas trouver les bibliothèques. Vous devez spécifier explicitement le chemin d'accès à eux:
$ export LD_LIBRARY_PATH \u003d / usr / local / lib: $ LD_LIBRARY_PATH
Si après cela encore l'erreur:
Erreur OpenCV: erreur non spécifiée (la fonction n'est pas implémentée. Reconstruisez la bibliothèque avec le support Windows, GTK + 2.x ou Carbon. Si vous êtes sur Ubuntu ou Debian, installez libgtk2.0-dev et pkg-config, puis relancez cmake ou configurez le script) dans cvNamedWindow, fichier /usr/src/OpenCV-2.2.0/modules/highgui/src/window.cpp, la ligne 274 se termine appelée après avoir lancé une instance de "cv :: Exception" what (): / usr /src/OpenCV-2.2.0/modules/highgui/src/window.cpp:274: erreur: (-2) La fonction n'est pas implémentée. Reconstruisez la bibliothèque avec le support Windows, GTK + 2.x ou Carbon. Si vous êtes sur Ubuntu ou Debian, installez libgtk2.0-dev et pkg-config, puis réexécutez cmake ou configurez le script dans la fonction cvNamedWindow
Vous avez donc oublié d'installer GTK + 2.x: libgtk2.0-dev. Exécutez l'installation (voir ci-dessus).
Lorsque l'installation est terminée, les fichiers d'en-tête seront disponibles dans le répertoire / usr / local / include / opencv, et les fichiers de bibliothèque se trouvent dans / usr / local / lib
Construisons un programme avec OpenCV:
test.cpp
// // pour tester // // robocraft.ru // #include
Makefile
CC: \u003d g ++ CFLAGS: \u003d -I / usr / local / include / opencv -L / usr / local / lib OBJETS: \u003d BIBLIOTHEQUES: \u003d -lopencv_core -lopencv_imgproc -lopencv_highgui .PHONY: tout nettoyer: test test: $ (CC ) $ (CFLAGS) -o test test.cpp $ (BIBLIOTHEQUES) clean: rm -f * .o
Lancement de la construction avec la commande make.
![](https://i2.wp.com/diytimes.ru/uploads/default/posts/888/defaulttemp.png)
Bonjour le monde!
OpenCV est installé et prêt à fonctionner. Écrivons notre première application Hello World!
#comprendre
Chargement d'une image
Cet exemple sera la base de tous vos programmes OpenCV. Nous chargerons l'image du fichier Image0.jpg dans l'environnement.
#comprendre
Types de formats d'image pris en charge:
- Bitmaps Windows - BMP, DIB
- Fichiers JPEG - JPEG, JPG, JPE
- Graphiques réseau portables - PNG
- Format d'image portable - PBM, PGM, PPM
- Rasters Sun - SR, RAS
- Fichiers TIFF - TIFF, TIF
Pour accéder à l'image, vous pouvez effectuer les appels suivants:
Image-\u003e nChannels // nombre de canaux d'image (RVB, bien qu'en OpenCV - BGR) (1-4) image-\u003e profondeur // profondeur en bits image-\u003e largeur // largeur de l'image en pixels image-\u003e hauteur // hauteur de l'image en pixels image-\u003e imageSize // mémoire occupée par l'image (\u003d\u003d image-\u003e hauteur * image-\u003e widthStep) image-\u003e widthStep // distance entre les points d'image verticalement adjacents (le nombre d'octets dans une ligne de l'image - peut être nécessaire pour l'auto-traversée tous les pixels de l'image)
Télécharger une video
Le chargement d'une vidéo n'est pas beaucoup plus difficile que le chargement d'une image, sauf qu'il y aura une boucle qui boucle à travers les images.
Le délai entre les trames est fixé à 33 millisecondes. cette latence permet de traiter un flux vidéo à une cadence standard de 30 images par seconde.
#comprendre
Pour capturer une vidéo à partir d'une caméra, vous devez légèrement modifier le code - au lieu de la fonction cvCreateFileCapture (), cvCreateCameraCapture () sera utilisé. Appuyer sur ESC interrompt la lecture et ferme la fenêtre, et appuyer sur Entrée enregistre l'image actuelle dans fichier jpg.
#comprendre
OpenCV v1.0 affiche et enregistre une image avec une résolution de caméra minimale de 320x240.
![](https://i2.wp.com/diytimes.ru/uploads/default/posts/891/defaulttemp.jpg)
Reconnaissance d'objets par motif
La fonction cvMatchTemplate () est disponible pour la reconnaissance de formes des zones de l'image source. La fonction superpose un modèle d'image à l'image courante et recherche une corrélation entre elles selon l'algorithme sélectionné. La détermination des limites du motif trouvé sur l'image d'origine est effectuée par la fonction cvMinMaxLoc, et pour normaliser l'algorithme de recherche, cvNormalize ().
// // exemple cvMatchTemplate () // comparer l'image avec le modèle // #include
salut! J'ai été confronté à la tâche de mettre en œuvre la reconnaissance des panneaux routiers à partir d'un flux vidéo. Étant donné que je n’ai jamais rencontré de tâches de ce genre auparavant, le processus de mise en œuvre présuppose à lui seul un long «fumage» préliminaire de forums et une moquerie impitoyable des exemples d’autrui. Par conséquent, j'ai décidé de rassembler tout ce que je lis en un seul endroit pour les générations futures, et aussi, au cours de l'histoire, de poser quelques questions à Habr.
Préludes.
Donc, après avoir étudié tous les outils qui peuvent être utilisés pour accomplir la tâche, je me suis installé sur l'environnement de développement Microsoft Visual Studio © 2010, en utilisant la merveilleuse bibliothèque OpenCV.
Le processus de travail avec OpenCV lui-même implique des danses préliminaires avec un tambourin, sur lesquelles il existe des descriptions assez détaillées:
Le deuxième acte de danse avec un tambourin.
Du coup, je me suis tourné vers les cascades d'entraînement. Ayant fumé dans ce sens, je me suis rendu compte qu'il me fallait deux outils de création d'ampes et de haartraining. Mais je n'avais pas leur exe et j'ai refusé de compiler. À cette époque, la version OpenCV que j'avais était 2.4.4, configurée par logiciel, dans le même article que j'ai lu pour la première fois sur l'utilisation de Cmake lors de l'installation. En conséquence, j'ai décidé de télécharger la version 2.3.1 et de réinstaller la bibliothèque. Après quoi j'ai pu lancer les outils nécessaires via ligne de commande et la question s'est posée de savoir comment travailler avec eux. Tous les points au-dessus des articles en pointillés "et", qui montrent les paramètres avec lesquels vous devez exécuter createampes et haartraining avec une description détaillée de ces paramètres.
Une ardoise propre de code.
Ayant complètement abandonné l'ancienne méthode, le code a été réécrit pour remplacer les cascades entraînées.
Code 2.0
#include "stdafx.h" #include
Nous mettons en place l'environnement de la même manière que dans le projet précédent.
Répétitions Je suis les pères du savoir.
C'est aux «petits» d'entraîner les cascades.)
C'est là que le plaisir commence. Puis j'ai décidé d'écrire sur toutes ces épreuves sur Habr et de demander conseil.
J'ai préparé 500 images de 1600x1200. et une image avec un signe 80x80. Une seule image suffira, car nous détectons un objet spécifique, pas une grande variété de visages.
Donc, après avoir préparé les images et créer le fichier neg.dat avec la structure
Négatif / n (1) .jpg négatif / n (2) .jpg négatif / n (3) .jpg négatif / n (4) .jpg ... négatif / n (500) .jpg
exécutez le fichier opencv_createsamples.exe via CMD avec les paramètres suivants
C: OpenCV2.3.1buildcommonx86opencv_createsamples.exe -vec C: OpenCV2.3.1buildcommonx86positive.vect -bg C: OpenCV2.3.1buildcommonx86neg.dat -img C: OpenCV2.3.1buildcommonx86ustupi.jpg -num 500 -wcolor -bgthresh 0 -show
le paramètre -show montre les images positives générées, mais elles, contrairement à celles indiquées dans d'autres articles
des photos, c'est comme ça
petit
Autrement dit, l'utilitaire coupe l'image bg à la taille de l'image positive. La modification des paramètres -w et -h n'a aucun effet et l'arrière-plan est toujours presque invisible. Si soudainement quelqu'un sait de quoi il s'agit, partagez vos pensées... La taille des images négatives a été réduite à 800x600 - le même résultat.
C: OpenCV2.3.1buildcommonx86opencv_haartraining.exe -data C: OpenCV2.3.1buildcommonx86haarustupi -vec C: OpenCV2.3.1buildcommonx86positive.vect -bg C: OpenCV2.3.1buildcommonx86neg.dat -npos 500 -nneg 6pl 20 -h 24 -mem 1536 -mode ALL -nonsym -minhitrate 0,999 -maxfalsealarm 0,5
après quoi vous recevrez le fichier xml tant attendu qui peut être chargé dans la source programmes.
En conséquence, la cascade apprend légèrement et, avec un grand nombre de faux positifs, réagit à l'image du signe de cession que j'aime.
Mais je ne peux pas obtenir de réponses précises, me semble-t-il, car l'arrière-plan est découpé en images positives. Et les images ne se révèlent pas comme dans les manuels. Mais il y a toujours une option pour augmenter le nombre d'étapes de formation et, après avoir chargé votre ordinateur pour toute la journée, attendez que la cascade soit plus «instruite». C'est ce que j'ai l'intention de faire avant que d'autres idées n'apparaissent.
Épilogue
Ceci est mon premier article HelloHabr. J'attends avec impatience vos commentaires sur le style de présentation. Et bien sûr des conseils sur le sujet.
J'espère qu'après les conseils reçus, il y aura quelque chose pour continuer l'histoire.
L'idée principale est de prendre en compte les relations statistiques entre la localisation des points anthropométriques du visage. Sur chaque image de visage, les points sont numérotés dans le même ordre. La comparaison des faces est effectuée par leur position relative.
Pour comparer des visages, vous pouvez utiliser la même position de visage par rapport à la caméra. Plus préférable pour cela.
Capturer un flux vidéo à partir d'une caméra et sélectionner un visage
#comprendre
Les fichiers cascade se trouvent dans le répertoire c: \\ opencv \\ build \\ etc \\ ... Placez la cascade requise dans le répertoire projet, au même endroit que le fichier source main.cpp.
Mettre en évidence les traits du visage
L'application est basée sur le code C ++ pour OpenCV Facemark
#comprendre
Dans le projet d'application, au même endroit que le fichier main.cpp, Fichiers postés haarcascade_frontalface_alt2.xml, drawLandmarks.hpp et lbfmodel.yaml référencés dans le code. Les fichiers en cascade se trouvent dans le répertoire c: \\ opencv \\ build \\ etc \\ .... drawLandmarks.hpp et lbfmodel.yaml disponible dans l'archive Facemark_LBF.rar.
Après avoir collé le code, des erreurs sont apparues en raison du fait qu'OpenCV 3.4.3-vc14-vc15 ne dispose pas d'un certain nombre de bibliothèques nécessaires pour exécuter l'application. J'ai lié ma bibliothèque (téléchargez opencv_new.zip) et l'ai installée à la racine du lecteur C (C: \\ opencv-new).
Maintenant, tous les réglages qui ont été effectués doivent l'être pour opencv-new:
Définition des paramètres sous Windows... Je vais dans la fenêtre "Changer la variable d'environnement" (boutons Windows-\u003e Outils système-\u003e Panneau de configuration -\u003e Système et sécurité -\u003e Système -\u003e Options supplémentaires systèmes -\u003e Variables d'environnement -\u003e Chemin -\u003e Modifier). Dans cette fenêtre, je crée la variable C: \\ ouvert-nouveau\\ x64 \\ vc14 \\ bin. Redémarrez Windows.
Dans les propriétés du projet référez-vous également à la bibliothèque opencv_new (au lieu de opencv). Dans la fenêtre "Pages de propriétés", je fais ce qui suit:
- C / C ++ -\u003e Général -\u003e Répertoires inclus supplémentaires -\u003e C: \\ ouvert-nouveau\\ comprendre
- Linker -\u003e Général -\u003e Répertoires de bibliothèques supplémentaires -\u003e C: \\ ouvert-nouveau\\ x64 \\ vc14 \\ lib
- Éditeur de liens -\u003e Entrée -\u003e Dépendances supplémentaires -\u003e opencv_core400.lib; opencv_face400.lib; opencv_videoio400.lib; opencv_objdetect400.lib; opencv_imgproc400.lib; opencv_highgui400.lib
Au démarrage, le programme génère une erreur si le fichier Debug. Pour Release, le lancement est réussi.
Sélection des fonctionnalités de filtrage d'image et de reconnaissance faciale
Le cadre en pointillé du visage est affiché de différentes manières en fonction de facteurs objectifs et subjectifs.
Les facteurs objectifs sont la position du visage par rapport à la caméra.
Facteurs subjectifs - éclairage inégal ou médiocre, distorsion du visage due aux émotions, plissement des yeux, etc. Dans ces cas, le filaire peut ne pas être correct, les points peuvent même être arrachés du visage:
Pendant la capture vidéo, parfois de telles images glissent également. Ils doivent être filtrés - à la fois pendant la formation et la reconnaissance.
Certains des points sont les plus stables et les plus informatifs. Ils sont fixés rigidement au visage, quelle que soit sa position par rapport à la caméra. De plus, ils caractérisent bien les spécificités du visage. Ces points peuvent être utilisés comme base pour la modélisation du système d'entités.
Vous pouvez utiliser une image filaire 2D de la même position de face pour comparer les faces. Quelle position du visage par rapport à la caméra est la plus informative? Visiblement frontal. Ce n'est pas pour rien que la médecine légale prend une photo de plein visage et de profil. Pour l'instant, limitons-nous au plein visage.
Tous les signes (distances) doivent être sans dimension (normalisés), c'est-à-dire corrélés à une certaine taille (distance). Je suppose que la taille la plus appropriée pour cela est la distance entre les points médians des coins des yeux. Pourquoi pas, par exemple, les coins extérieurs des yeux, qui sont en fait définis dans le tableau des points de repère? Le fait est que les coins des yeux s'écartent (se rapprochent) lorsqu'ils répondent à un changement de couleur, à une expression de surprise, à un clignotement, etc. La distance entre les centres des yeux neutralise ces fluctuations et est donc plus préférable.
Quelle caractéristique prendrons-nous comme base dans la première approximation? Je suppose la distance entre le haut du pont du nez et le bas du menton. À en juger par la photo, ce signe peut différer considérablement selon les personnes.
Ainsi, avant de former des caractéristiques pour l'apprentissage et la comparaison, il est nécessaire de filtrer les cadres ponctuels des visages obtenus par capture vidéo, qui, pour des raisons subjectives ou objectives, ne sont pas une image frontale correcte du visage (visage complet).
Nous ne laissons que les wireframes ponctuels qui respectent les critères suivants:
- La ligne droite qui passe par les points extrêmes des yeux (ligne des yeux) est perpendiculaire à la ligne qui passe par les points extrêmes du nez (ligne du nez).
- La ligne des yeux est parallèle à la ligne droite qui passe par les coins de la bouche (ligne de la bouche).
- Les points ci-dessus sont symétriques par rapport à la ligne du nez.
- Les points d'angle des yeux (externes et internes) sont sur la même ligne droite.
Un exemple d'images frontales qui suivent tous les signes:
Un exemple d'images filtrées:
Essayez de déterminer par vous-même lequel des signes ne transmet pas d'images.
Comment les fonctionnalités de filtrage et de reconnaissance faciale sont-elles formalisées? Fondamentalement, ils sont basés sur les conditions de détermination des distances entre les points, les conditions de parallélisme et de perpendicularité. La tâche de formalisation de ces signes est considérée dans le sujet.
Algorithme de reconnaissance faciale par filaire 2D de points
Les coordonnées des points de l'image filaire de la face sont initialement définies dans le système de coordonnées ancré au point supérieur gauche de la fenêtre. L'axe Y est dirigé vers le bas.
Pour faciliter l'identification des entités, nous utilisons un système de coordonnées personnalisé (SCU), dont l'axe X passe par le segment entre les points médians des yeux, et l'axe Y est perpendiculaire à ce segment par son milieu dans la direction ascendante. Les coordonnées UCS (de -1 à +1) sont normalisées - corrélées avec la distance entre les points médians des yeux.
UCS offre commodité et simplicité dans l'identification des fonctionnalités. Par exemple, la position du visage en vue de face est déterminée par le signe de symétrie des points correspondants des yeux par rapport à la ligne du nez. Cette caractéristique est formalisée par la coïncidence de la ligne de nez avec l'axe Y, c'est-à-dire X1 \u003d X2 \u003d 0, où X1 et X2 sont les coordonnées des points extrêmes du nez (27 et 30) dans le SCU.
Détermination par rapport à la fenêtre SC
Les coordonnées des milieux des yeux gauche et droit (gauche et droit):
XL \u003d (X45 + X42) / 2; YL \u003d (Y45 + Y42) / 2; XR \u003d (X39 + X 36) / 2; YR \u003d (Y39 + Y 36) / 2;
Début du SCU:
X0 \u003d (XL + XR) / 2; Y0 \u003d (YL + YR) / 2;
Distances entre les milieux des yeux le long des axes X et Y:
DX \u003d XR - XL; DY \u003d YR - YL;
La distance réelle L entre les milieux des yeux (selon le théorème de Pythagore):
L \u003d sqrt (DX ** 2 + DY ** 2)
Fonctions trigonométriques de l'angle de rotation du SCU:
Passer des coordonnées du CS fenêtré aux coordonnées du SCUen utilisant les paramètres X0, Y0, L, sin AL, cos AL:
X_User_0 \u003d 2 (X_Window - X0) / L;
Y_User_0 \u003d - 2 (Y_Window - Y0) / L;
X_User \u003d X_User_0 * cos_AL - Y_User_0 * sin_AL;
Y_User \u003d X_User_0 * sin_AL + Y_User_0 * cos_AL;
Mettre en œuvre le filtrage d'images vérifier constamment les signes:
1. un signe de la perpendicularité des lignes du nez et des yeux, ainsi que la symétrie des coins des yeux... La ligne du nez est définie par les points 27 et 30 (voir figure c). Les deux signes sont remplis si les coordonnées de ces points dans le SCU sont X1 \u003d X2 \u003d 0 (c'est-à-dire que la ligne de nez coïncide avec l'axe Y).
2.Un signe de parallélisme de la ligne des yeux et de la ligne de la bouche... La ligne de la bouche est définie par les points 48 et 54 (voir figure c). La caractéristique est remplie si dans l'UCS Y1-Y2 \u003d 0.
3. Signe de symétrie des coins de la bouche... La ligne de la bouche est définie par les points 48 et 54 (voir figure c). La fonctionnalité est remplie si dans l'UCS X1 + X2 \u003d 0
4. Panneau "Les coins des yeux sont sur la même ligne droite"... Les lignes sont définies par des paires de points: (36 et 45), ainsi que (39 et 42). Le test de l'attribut 1 ayant déjà été réussi, il suffit de définir l'attribut Y2-Y1 \u003d 0 dans l'UCS uniquement pour les points 36 et 39.
Il ne peut y avoir d'égalité absolue à zéro, donc les caractéristiques sont comparées à une valeur certes petite.
Programme de comparaison de visages pour une fonctionnalité
La distance entre les points de l'arête du nez et le menton est prise comme un signe (Repères points 27 et 8, voir figure c). La caractéristique, normalisée, est définie dans le SCU par le rapport: (Y1 - Y2) / L, où L est la distance entre les centres des yeux. Lors de la formation du programme, un signe pour une personne spécifique est déterminé par un numéro qui est affiché à côté de la personne suivie (cette partie du code est commentée dans le programme). Lors de la reconnaissance, la valeur d'une fonctionnalité est comparée à une fonctionnalité spécifique entrée dans le programme pour chaque personne. Si la comparaison est positive, son identifiant apparaît à côté du visage.
Le programme reconnaît également à partir d'une photo dans laquelle j'ai 15 ans de moins, et même avec une moustache. La différence sur la photo est significative, tout le monde ne s'en rendra pas compte. Mais programme d'ordinateur vous ne serez pas dupe.
Tâches de contrôle:
- Familiarisez-vous avec le programme.
- Déterminez la signification de la caractéristique pour votre visage et plusieurs de vos collègues.
- Testez le programme pour l'identification des individus (les vôtres et les collègues).
#comprendre
Cet article fournit une vue d'ensemble des méthodes de recherche d'un objet dans une image.
1. Introduction
De nombreuses tâches pratiques, de l'automatisation du contrôle en production à la conception de véhicules robotiques, sont directement liées à la recherche d'objets dans l'image. Pour le résoudre, vous pouvez utiliser deux stratégies différentes qui dépendent des conditions de prise de vue: la modélisation d'arrière-plan et la modélisation d'objets.- Simulation d'arrière-plan - Cette approche peut être utilisée si la caméra est stationnaire, c.-à-d. nous avons un arrière-plan qui change peu et nous pouvons donc le modéliser. Tous les points d'image qui s'écartent considérablement du modèle d'arrière-plan sont considérés comme des objets de premier plan. Ainsi, il est possible de résoudre les problèmes de détection et de suivi d'objets.
- Modélisation d'objets - cette approche est plus générale, elle est utilisée dans les cas où l'arrière-plan change constamment et de manière significative. Contrairement au cas précédent, nous avons ici besoin de savoir exactement ce que nous voulons trouver, c'est-à-dire il est nécessaire de construire un modèle de l'objet, puis de vérifier les points de l'image pour la conformité avec ce modèle.
2. Aperçu des méthodes
Dans cette section, nous allons fournir une liste d'approches qui peuvent être utilisées pour résoudre avec succès le problème de la recherche d'un objet dans une image, par ordre de complexité croissante.- Filtres de couleur - si l'objet se distingue de manière significative par rapport à l'arrière-plan en couleur, vous pouvez choisir le filtre approprié.
- Sélection et analyse des contours - si nous savons que l'objet a la forme, par exemple, d'un cercle, nous pouvons rechercher des cercles dans l'image.
- Correspondance avec un modèle - nous avons une image d'un objet, nous recherchons des zones dans une autre image qui correspondent à cette image d'un objet.
- Travailler avec des points spéciaux - dans l'image avec l'objet, nous recherchons des caractéristiques (par exemple, des angles), que nous essayons de faire correspondre avec de telles caractéristiques dans une autre image.
- Méthodes d'apprentissage automatique - nous formons le classificateur sur des images avec un objet, divisons d'une certaine manière l'image en parties, vérifions chaque partie avec le classificateur pour la présence d'un objet.
3. Filtres de couleur
La méthode des filtres de couleur peut être utilisée dans les cas où l'objet diffère considérablement de l'arrière-plan en couleur et l'éclairage est uniforme et ne change pas. Vous pouvez en savoir plus sur la méthode de filtre de couleur dans.4. Extraction et analyse des contours
Si l'objet sur l'arrière-plan ne se distingue pas de manière significative en couleur et / ou a une coloration complexe, l'utilisation de la méthode des filtres de couleur ne donnera pas de bons résultats. Dans ce cas, vous pouvez essayer d'appliquer la méthode de sélection et d'analyse des contours. Pour ce faire, nous sélectionnons les bordures de l'image. Les bordures sont des endroits où le dégradé de luminosité change brusquement et peuvent être trouvés à l'aide de la méthode Canny. Ensuite, nous pouvons vérifier les lignes de démarcation sélectionnées pour la conformité avec les contours géométriques de l'objet, cela peut être fait en utilisant la méthode Hough Transform, par exemple, nous pouvons rechercher dans les limites d'un cercle.
Fig. 4:trouver des cercles
Cette méthode peut également être utilisée avec des filtres de couleur. Vous pouvez en savoir plus sur la sélection et l'analyse des contours dans. Le code source de l'exemple de recherche de cercle peut être téléchargé.
5. Correspondance de modèle
Si l'image contient beaucoup de petits détails, l'analyse des contours peut être difficile. Dans ce cas, vous pouvez utiliser la méthode de correspondance de modèle. Il consiste en ce qui suit - nous prenons une photo avec un objet (Fig. 5) et recherchons des zones dans la grande image qui coïncident avec l'image de l'objet (Fig. 6,7).
Fig 5: objet à rechercher
6. Travailler avec des points spéciaux
La méthode de correspondance de motif décrite dans la section précédente recherche des correspondances exactes entre les points de motif et les points d'image. Si l'image est pivotée ou mise à l'échelle par rapport aux paramètres du modèle, cette méthode ne fonctionne pas correctement. Pour surmonter ces limitations, des méthodes sont utilisées sur la base de ce que l'on appelle. points singuliers, nous les examinerons ci-dessous. Un point clé est une petite zone qui se distingue de manière significative dans l'image. Il existe plusieurs méthodes pour déterminer de tels points, ceux-ci peuvent être des angles (détecteur de coin Harris) ou des gouttes (blob, drop), c.-à-d. petites zones de même luminosité, avec une bordure assez claire qui se détache sur le fond général. Pour un point spécial, le soi-disant. descripteur - caractéristique d'un point particulier. Le descripteur est calculé à partir d'un voisinage donné du point singulier, comme les directions des gradients de luminosité des différentes parties de ce voisinage. Il existe plusieurs méthodes de calcul des descripteurs pour des points particuliers: SIFT, SURF, ORB, etc. Il faut noter que certaines méthodes de calcul des descripteurs sont brevetées (par exemple, SIFT) et leur utilisation commerciale est limitée. Vous pouvez écouter la conférence plus en détail sur les points particuliers des images et les méthodes de travail avec elles. Des points spéciaux peuvent être utilisés pour trouver un objet dans une image. Pour ce faire, nous devons avoir une image de l'objet souhaité, puis effectuer les actions suivantes.- Dans l'image avec l'objet, nous recherchons les points spéciaux de l'objet et calculons leurs descripteurs.
- Sur l'image analysée, nous recherchons également des points spéciaux et calculons leurs descripteurs.
- Nous comparons les descripteurs des points spéciaux de l'objet et les descripteurs des points spéciaux trouvés dans l'image.
- Si un nombre suffisant de correspondances est trouvé, nous marquons la zone avec les points correspondants.
Fig 8: détecteur d'objets par des points spéciaux
Le code source de l'exemple peut être téléchargé.
7. Méthodes d'apprentissage automatique
La méthode de recherche d'objets en comparant des ensembles de points spéciaux a ses inconvénients, dont l'un est une faible capacité de généralisation. Si nous avons une tâche, par exemple, pour sélectionner les visages des personnes sur une photo, notre méthode recherchera une photo spécifique par des points spéciaux. La photo sur laquelle les points spéciaux ont été sélectionnés, le reste des visages ressortira pire, car ils correspondent très probablement à d'autres ensembles de points spéciaux. Les résultats peuvent être encore pires si vous modifiez l'angle de la caméra. Pour résoudre ces problèmes, nous avons déjà besoin de méthodes d'apprentissage automatique et pas seulement d'une image avec un objet, mais de jeux de formation entiers de centaines (et dans certains cas, des centaines de milliers) d'images différentes représentant un objet dans différentes conditions. Nous examinerons l'utilisation de méthodes d'apprentissage automatique pour trouver des objets dans une image dans la deuxième partie de cet article.Littérature
- ES Borisov Détecteur d'objets pour caméras fixes.
- http: //site/cv-backgr.html - ES Borisov Traitement vidéo: détecteur d'objet basé sur des filtres de couleur.
- http: //site/cv-detector-color.html - ES Borisov Méthodes de base de traitement d'image.
- http: //site/cv-base.html - Anton Konushin Computer vision (2011). Conférence 3. Méthodes simples d'analyse d'images. Modèles assortis.
- http://www.youtube.com/watch?v\u003dTE99wDbRrUI - Documentation OpenCV: Détection de coin Harris
- http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_features_harris/py_features_harris.html - Wikipédia: Blob_detection
- http://en.wikipedia.org/wiki/Blob_detection - Anton Konushin Computer vision (2011). Conférence 5. Caractéristiques locales
- http://www.youtube.com/watch?v\u003dvFseUICis-s
Une bibliothèque open source de vision par ordinateur et d'apprentissage automatique. Il comprend plus de 2500 algorithmes, qui incluent à la fois des algorithmes classiques et modernes pour la vision par ordinateur et l'apprentissage automatique. Cette bibliothèque dispose d'interfaces dans différents langages, parmi lesquels Python (dans cet article, nous l'utiliserons), Java, C ++ et Matlab.
Installation
Les instructions d'installation pour Windows peuvent être consultées, et pour Linux -.
Importer et visualiser une image
import cv2 image \u003d cv2.imread ("./ chemin / vers / image.extension") cv2.imshow ("Image", image) cv2.waitKey (0) cv2.destroyAllWindows ()Remarque Lors de la lecture de la méthode ci-dessus, l'image est dans l'espace colorimétrique non RVB (comme tout le monde est habitué à), mais BGR. Ce n'est peut-être pas si important au début, mais une fois que vous commencez à travailler avec la couleur, il vaut la peine de connaître cette fonctionnalité. Il existe 2 solutions:
- Permutez le 1er canal (R - rouge) avec le 3e canal (B - bleu), puis la couleur rouge sera (0,0,255), pas (255,0,0).
- Changer l'espace colorimétrique en RVB: rgb_image \u003d cv2.cvtColor (image, cv2.COLOR_BGR2RGB)
Et puis dans le code pour ne plus travailler avec image, mais avec rgb_image.
Remarque Appuyez sur n'importe quelle touche pour fermer la fenêtre dans laquelle l'image est affichée. Si vous utilisez le bouton de fermeture de la fenêtre, vous risquez de tomber sur des blocages.
Tout au long de cet article, le code suivant sera utilisé pour afficher les images:
Importer cv2 def viewImage (image, nom_de_fenêtre): cv2.namedWindow (nom_de_window, cv2.WINDOW_NORMAL) cv2.imshow (nom_de_window, image) cv2.waitKey (0) cv2.destroyAllWindows ()
Recadrage
Chien après le recadrage
Importer cv2 cropped \u003d image viewImage (recadrée, "Doggie after recadrage")
Où l'image est image.
Changement de taille
Après redimensionnement de 20%
Importer cv2 scale_percent \u003d 20 # Pourcentage de la taille d'origine width \u003d int (img.shape * scale_percent / 100) height \u003d int (img.shape * scale_percent / 100) dim \u003d (width, height) resized \u003d cv2.resize (img, dim , interpolation \u003d cv2.INTER_AREA) viewImage (redimensionné, "Après redimensionnement de 20%")
Cette fonction prend en compte le rapport hauteur / largeur de l'image originale. D'autres fonctions de redimensionnement d'image peuvent être vues.
Tour
Chien après avoir tourné à 180 degrés
Importer cv2 (h, w, d) \u003d image.shape center \u003d (w // 2, h // 2) M \u003d cv2.getRotationMatrix2D (center, 180, 1.0) rotated \u003d cv2.warpAffine (image, M, (w , h)) viewImage (pivoté, "Chien après avoir tourné de 180 degrés")
image.shape renvoie la hauteur, la largeur et les canaux. M - matrice de rotation - fait pivoter l'image de 180 degrés autour du centre. -ve est la rotation horaire de l'image et + ve est la rotation anti-horaire.
Seuils en niveaux de gris et en noir et blanc
Toutou en niveaux de gris
Toutou noir et blanc
Importer cv2 gray_image \u003d cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) ret, threshold_image \u003d cv2.threshold (im, 127, 255, 0) viewImage (gray_image, "Greyscale doggie") viewImage (threshold_image, "Doggie noir et blanc ")
gray_image est la version monocanal de l'image.
La fonction de seuil renvoie une image dans laquelle tous les pixels plus sombres (inférieurs à) 127 sont remplacés par 0 et tous les pixels plus clairs (supérieurs à) 127 sont remplacés par 255.
Pour plus de clarté, un autre exemple:
Ret, seuil \u003d cv2.seuil (im, 150, 200, 10)
Ici, tout ce qui est plus sombre que 150 est remplacé par 10, et tout ce qui est plus clair est remplacé par 200.
Les autres fonctions de seuil sont décrites.
Flou / anti-aliasing
Toutou flou
Importer cv2 floue \u003d cv2.GaussianBlur (image, (51, 51), 0) viewImage (floue, "Chien flou")
La fonction GaussianBlur prend 3 paramètres:
- Image originale.
- Un tuple de 2 nombres impairs positifs. Plus les nombres sont élevés, plus la force du lissage est grande.
- sigmaX et sigmaY... Si ces paramètres sont laissés égaux à 0, leur valeur sera calculée automatiquement.
Dessin de rectangles
Dessinez un rectangle autour du visage du chien
Importer la sortie cv2 \u003d image.copy () cv2.rectangle (sortie, (2600, 800), (4100, 2400), (0, 255, 255), 10) viewImage (sortie, "Décrire le visage du chien avec un rectangle")
Cette fonction prend 5 paramètres:
- L'image elle-même.
- La coordonnée du coin supérieur gauche (x1, y1).
- Coordonnée du coin inférieur droit (x2, y2).
- Couleur du rectangle (GBR / RVB selon le modèle de couleur sélectionné).
- Largeur de ligne du rectangle.
Dessin au trait
2 chiens séparés par une ligne
Importer la sortie cv2 \u003d image.copy () cv2.line (sortie, (60, 20), (400, 200), (0, 0, 255), 5) viewImage (sortie, "2 chiens séparés par une ligne")
La fonction de ligne prend 5 paramètres:
- L'image réelle sur laquelle la ligne est dessinée.
- La coordonnée du premier point (x1, y1).
- Coordonnée du deuxième point (x2, y2).
- Couleur de la ligne (GBR / RVB selon le modèle de couleur sélectionné).
- Largeur de ligne.
Texte sur l'image
Image avec texte
Importer la sortie cv2 \u003d image.copy () cv2.putText (sortie, "Nous<3 Dogs", (1500, 3600),cv2.FONT_HERSHEY_SIMPLEX, 15, (30, 105, 210), 40) viewImage(output, "Изображение с текстом")
La fonction putText prend 7 paramètres:
- Image directement.
- Texte pour l'image.
- La coordonnée du coin inférieur gauche du début du texte (x, y).
- L'image traitée en niveaux de gris.
- Paramètre ScaleFactor. Certains visages peuvent être plus grands que d'autres parce qu'ils sont plus proches que d'autres. Ce paramètre compense la perspective.
- L'algorithme de reconnaissance utilise une fenêtre glissante lors de la reconnaissance d'objets. Le paramètre minNeighbors détermine le nombre d'objets autour du visage. C'est-à-dire que plus la valeur de ce paramètre est élevée, plus l'algorithme a besoin d'objets similaires pour définir l'objet actuel en tant que visage. Une valeur trop petite augmentera le nombre de faux positifs, et trop grande rendra l'algorithme plus exigeant.
- minSize est la taille réelle de ces zones.
Visages détectés: 2
Importer cv2 image_path \u003d "./path/to/photo.extension" face_cascade \u003d cv2.CascadeClassifier ("haarcascade_frontalface_default.xml") image \u003d cv2.imread (image_path) gray \u003d cv2.cvtColor (image, cv2.COLOR_BGR_BGR .detectMultiScale (gray, scaleFactor \u003d 1.1, minNeighbors \u003d 5, minSize \u003d (10, 10)) faces_detected \u003d "Visages détectés:" + format (len (faces)) print (faces_detected) # Dessine des carrés autour des visages pour (x, y , w, h) dans les faces: cv2.rectangle (image, (x, y), (x + w, y + h), (255, 255, 0), 2) viewImage (image, faces_detected)
detectMultiScale est une fonction générale de reconnaissance à la fois des visages et des objets. Pour que la fonction recherche spécifiquement des visages, nous lui passons la cascade appropriée.
La fonction detectMultiScale prend 4 paramètres:
Contours - reconnaissance d'objets
La reconnaissance d'objets est effectuée à l'aide de la segmentation des couleurs de l'image. Il existe deux fonctions pour cela: cv2.findContours et cv2.drawContours.
Cet article détaille la détection d'objets à l'aide de la segmentation des couleurs. Tout ce dont vous avez besoin pour elle est là.
Enregistrer une image
import cv2 image \u003d cv2.imread ("./ import / chemin.extension") cv2.imwrite ("./ export / chemin.extension", image)Conclusion
OpenCV est une excellente bibliothèque avec des algorithmes légers qui peuvent être utilisés dans le rendu 3D, l'édition avancée d'images et de vidéos, le suivi et l'identification d'objets et de personnes dans la vidéo, la recherche d'images identiques à partir d'un ensemble, et bien plus encore.
Cette bibliothèque est très importante pour quiconque développe des projets liés à l'apprentissage automatique dans le domaine des images.