English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Python+Erklärung der Prinzipien und Beispiele der Gesichtserkennung von OpenCV

Über OpenCV

OpenCV ist eine von Intel bereitgestellte Open-Source-Bibliothek für Computer Vision (Computer Version). Es besteht aus einer Reihe von C-Funktionen und einer geringen Anzahl von C++ Klassen, die viele allgemeine Algorithmen für die Bildverarbeitung und Computer Vision implementieren.

OpenCV verfügt über einschließlich 300 mehr C-Funktionen, eine plattformübergreifende API von mittlerer und höherer Ebene. Es hängt nicht von anderen externen Bibliotheken ab - obwohl es auch einige externe Bibliotheken verwenden kann. OpenCV ist für nicht kommerzielle und kommerzielle Anwendungen kostenlos. Gleichzeitig bietet OpenCV den Zugriff auf die Hardware, direkt auf die Kamera zuzugreifen, und OpenCV bietet auch ein einfaches GUI (Grafische Benutzeroberfläche) -System: highgui. Wir verwenden einige Methoden, die von OpenCV bereitgestellt werden, um diese Gesichtserkennung zu konstruieren (face detectionProgramm.

OpenCVs Python-Paket 

OpenCV selbst ist C/C++ geschrieben, wenn es in einer anderen Sprache verwendet werden soll, können wir durch Verpackung der dynamischen Verknüpfungsspeicherdatei darauf zugreifen, glücklicherweise gibt es in Python viele solcher Verpackungen, in diesem Artikel wird Cvtypes verwendet.

Tatsächlich stammen viele Pakete in Python aus Drittanbietern, z.B. PIL (Python Image Library) ist ein von C realisierter Grafikverarbeitungs-Paket, das in Python verpackt wurde, diese Verpackungen ermöglichen es Ihnen, diese API so wie die internen Funktionen von Python zu verwenden.

Prinzip des Gesichtserkennens

Das Gesichtserkennen gehört zu einem Teil der Zielobjekterkennung (object detection) und bezieht sich hauptsächlich auf zwei Aspekte

1.Erstellen Sie zunächst eine Wahrscheinlichkeitsstatistik für das zu detektierende Zielobjekt, um einige Eigenschaften des zu detektierenden Objekts zu kennen und ein Zielobjektdetektionsmodell zu erstellen.
2.Verwenden Sie das erhaltene Modell, um das Eingangsimage zu matchen. Wenn es eine Übereinstimmung gibt, wird das übereinstimmende Gebiet ausgegeben, andernfalls wird nichts gemacht. 

Computer Vision

Das visuelle System des Computers ist sehr unterschiedlich vom menschlichen Auge, aber es gibt auch einige Ähnlichkeiten. Das menschliche Auge kann Objekte sehen, indem es das von den Objekten reflektierte Licht auf die photorezeptiven Zellen des Auges stimuliert und dann das visuelle Nervensystem im Gehirn das Bild des Objekts bildet. Das, was der Computer durch die Kamera sieht, ist viel einfacher, kurz gesagt, es ist eine Matrix aus Zahlen. Diese Zahlen zeigen die Stärke des von den Objekten ausgesandten Lichts an, der lichtempfindliche Teil der Kamera wandelt den Lichtsignal in ein digitales Signal um und quantifiziert es zu einer Matrix.

Wie man aus diesen Zahlen das Ergebnis "Das ist ein Gesicht" ableitet, ist eine recht komplexe Angelegenheit. Die physische Welt ist farbig, im Allgemeinen bestehen Computerfarbbilder aus einer Vielzahl von Farbkanaälen, z.B. RGB-Bilder haben Rotkanal (Red), Grünkanal (Green) und Blaukanal (Blue), diese drei Kanäle sind Graustufenbilder, z.B. ein Punkt durch}}8Farbtiefe ausgedrückt werden, dann kann ein Kanal2^8=256Graustufen. Wenn diese drei Kanäle addiert werden, können sie3*8=24Farbtiefe, auch bekannt als24echte Farbtiefe

Die Verarbeitung solcher Bilder ist zweifellos eine komplexe Angelegenheit, daher ist es notwendig, das Farbbild zunächst in ein Graustufenbild umzuwandeln, um die Datenmenge zu reduzieren (z.B. im RGB-Modus kann sie auf das ursprüngliche Bild reduziert werden1/3) und einige Rauschsignale können entfernt werden. Zunächst wird das Bild in ein Graustufenbild umgewandelt, dann wird der Kontrast dieses Graustufenbildes erhöht, was dazu führt, dass die dunklen Stellen dunkler und die hellen Stellen heller werden. Nach dieser Verarbeitung wird das Bild leichter von dem Algorithmus erkannt.

Harr-Merkmalskaskadentabelle

OpenCV verwendet bei der Objekterkennung eine Kaskadentabelle von haar-Merkmalen, die in dieser Kaskadentabelle enthaltenen sind boost-Klassifikatoren. Zunächst wird der Klassifikator mit den haar-Merkmalen der Proben trainiert, um einen kaskadenförmigen boost-Klassifikator zu erhalten. Der Trainingsstil umfasst zwei Aspekte:

1. Beispiel für positive Beispiele, d.h. die zu detektierenden Zielobjekte
2. Beispiel für negative Beispiele, andere beliebige Bilder

Zunächst werden diese Bilder in gleiche Größen gebracht, dieser Prozess wird als Normalisierung bezeichnet, und dann wird eine Statistik durchgeführt. Sobald der Klassifikator fertiggestellt ist, kann er zur Detektion des interessanten Bereichs in den Eingabebildern verwendet werden. In der Regel sind die Eingabebilder größer als die Proben, daher muss der Suchfenster verschoben werden, um verschiedene Größen der Ziele zu finden. Der Klassifikator kann seine eigenen Abmessungen proportional ändern, um verschiedene Größen der Ziele zu finden, was möglicherweise mehrere Scans des Eingabebildes erfordert.

Was ist ein Kaskadenklassifikator? Ein Kaskadenklassifikator ist ein großer Klassifikator, der aus mehreren einfachen Klassifikatoren zusammengesetzt ist, durch die detektierten Fenster werden nacheinander durch jeden Klassifikator geleitet. Wenn ein Fenster durch alle Klassifikatoren geht, kann bestimmt werden, ob es sich um ein Zielbereich handelt. Um Effizienzprobleme zu berücksichtigen, kann der strengste Klassifikator an der Oberseite der gesamten Kaskadenklassifikatorplatte platziert werden, um die Anzahl der Übereinstimmungen zu reduzieren.

Der Basisklassifikator nimmt haar-Merkmale als Eingabe und 0/1Für die Ausgabe, 0 bedeutet keine Übereinstimmung,1stellt die Übereinstimmung dar.

Haar-Merkmale

 

 Randmerkmale, die vier Arten umfassen
 Lineare Merkmale, die umfassen8Art
 Der Mittelpunkt konzentriert sich auf Merkmale und umfasst zwei Arten

When scanning the image to be detected, taking the boundary feature (a) as an example, as mentioned earlier, an image in the computer is a matrix of numbers, the program first calculates the grayscale value x of the entire window, then calculates the black grayscale value y in the rectangular frame, and then calculates (x-2y) value, the obtained value is compared with x, and if this ratio is within a certain range, it indicates that the current scanning area of the image to be detected meets the boundary features (a), and then continue scanning.

A more detailed description of this algorithm is beyond the scope of this article, and more information can be obtained from the reference resources.

Non-fixed size target detection

Since the target detection is based on video stream, it is unlikely that we will know the size of the target in advance, which requires that the classifier in our cascade table has the ability to increase (or decrease) proportionally, so that when a small window moves across the entire image to be detected without finding a target, we can adjust the size of the classifier and continue detection until a target is detected or the size of the window is comparable to the size of the image to be detected.

Step 1:Image preprocessing

After obtaining a frame (an image) from the camera, we need to preprocess this image first:
1.Convert the image from RGB mode to grayscale and then convert the grayscale image
2.Perform histogram equalization on the grayscale image

These two steps are very simple in OpenCV:

image_size = cv.cvGetSize(image)# Get the original image size 
grayscale = cv.cvCreateImage(image_size, 8, 1)# Create an empty grayscale image 
cv.cvCvtColor(image, grayscale, cv.CV_BGR2GRAY)# Conversion 
storage = cv.cvCreateMemStorage(0)# Create a new storage area for later use 
cv.cvClearMemStorage(storage) 
cv.cvEqualizeHist(grayscale, grayscale)# Equalization of the histogram of the grayscale image 

Step 2:Detect and mark the target

In OpenCV, the model for face detection has been established as an XML file, which contains the training results of the classifier mentioned above, and we can skip the process of building the cascade table by loading this file. With the cascade table, we only need to pass the image to be detected and the cascade table to the OpenCV target detection algorithm to obtain a set of detected faces.

# detect objects 
cascade = cv.cvLoadHaarClassifierCascade('haarcascade_frontalface_alt.xml', 
      cv.cvSize(1,1))}} 
faces = cv.cvHaarDetectObjects(grayscale, cascade, storage, 1.2, 2, 
    cv.CV_HAAR_DO_CANNY_PRUNING, 
    cv.cvSize(50, 50))# die minimale Größe des Gesichts auf50*50 Pixel 
if faces: 
 print 'face detected here', cv.cvGetSize(grayscale) 
 for i in faces: 
 cv.cvRectangle(image, cv.cvPoint( int(i.x), int(i.y)), 
   cv.cvPoint(int(i.x + i.width), int(i.y + i.height)), 
   cv.CV_RGB(0, 255, 0), 1, 8, 0)# einen grünen Rechteckrahmen zeichnen 

Schritt 3:Videofenster mit highgui zeichnen

highgui.cvNamedWindow ('camera', highgui.CV_WINDOW_AUTOSIZE) 
highgui.cvMoveWindow ('camera', 50, 50) 
highgui.cvShowImage('camera', detimg) 

Zu sehen ist, dass die OpenCV-API sehr klar ist und durch die Python-Wrapper sehr kleine Codes ermöglicht werden kann. Gut, lassen Sie uns das Laufzeitergebnis des Programms betrachten: 

Da der Videostream dynamisch ist, können wir am Anfang des Programms einen unendlichen Zyklus verwenden, in dem wir in jeder Iteration ein Frame aus dem Video lesen, dieses Frame an den Gesichtserkennungsmodul übermitteln, das im Frame Markierungen (wenn es ein Gesicht gibt) vornimmt und das Frame zurückgibt. Der Hauptprogramm aktualisiert dann das Anzeigefenster.

Andere Eigenschaften von OpenCV

Laplazische Kanten detection

def laplaceTransform(image): 
 laplace = None 
 colorlaplace = None 
 planes = [None, None, None] 
 image_size = cv.cvGetSize(image) 
 if not laplace: 
 for i in range(len(planes)): 
  planes[i] = cv.cvCreateImage(image_size, 8, 1) 
 laplace = cv.cvCreateImage(image_size, cv.IPL_DEPTH_16S, 1) 
 colorlaplace = cv.cvCreateImage(image_size, 8, 3) 
 cv.cvSplit(image, planes[0], planes[1], planes[2], None) 
 for plane in planes: 
 cv.cvLaplace(plane, laplace, 3) 
 cv.cvConvertScaleAbs(laplace, plane, 1, 0) 
 cv.cvMerge(planes[0], planes[1], planes[2], None, colorlaplace) 
 colorlaplace.origin = image.origin 
 return colorlaplace 

Detailliertes Bild:

CVtypes enthält ein Beispiel für einen Histogramm über die Bildfarbraum in der

Schlusswort

OpenCV bietet eine äußerst leistungsstarke Funktionalität und eine Vielzahl von Algorithmen. Das in diesem Text behandelte Material ist nur ein sehr kleiner Teil der Computer Vision. Leser könnten erwägen, gesammelte Gesichter zu kennzeichnen, um die Erkennung von bestimmten Personen zu ermöglichen. Oder erwägen Sie, die Gesichtserkennung in das Netz zu integrieren, um Fernüberwachung zu ermöglichen. Stellen Sie sich vor, dass Maschinen, die ursprünglich nicht lebendig waren, durch unsere Gedanken und Bewegungen so aussehen, als wären sie lebendig, was für sich allein schon sehr interessant ist.

Das ist der gesamte Inhalt dieses Artikels. Wir hoffen, dass er Ihnen bei Ihrem Lernen hilft und wir freuen uns über Ihre Unterstützung und Ihr Engagement für das呐喊教程.

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem jeweiligen Urheber. Der Inhalt wurde von Internetnutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht von Hand bearbeitet. Übernehmen Sie keine Haftung für rechtliche Probleme. Wenn Sie Inhalte mit Urheberrechtsverletzung finden, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3codebox.com (bei der E-Mail senden Sie bitte # durch @ ersetzen) und geben Sie relevante Beweise an. Bei nachgewiesener Urheberrechtsverletzung wird diese Website die beanstandeten Inhalte sofort löschen.

Empfohlene Artikel