Eine Anleitung zur Gesichtserkennung mit Golang und OpenCV

Blog

Eine Anleitung zur Gesichtserkennung mit Golang und OpenCV

Eine Anleitung zur Gesichtserkennung mit Golang und OpenCV

In diesem Artikel zeige ich Ihnen, wie Sie mit gocv beginnen und mit Haar Cascades einen einfachen Gesichtsdetektor erstellen.

OpenCV ist eine Bibliothek für Computer Vision, die es seit fast 20 Jahren gibt. Ich habe es während des Colleges und für persönliche Projekte verwendet C++ und Python weil es ziemlich viel Unterstützung für diese Sprachen hat. Aber als ich anfing, Go zu lernen und zu verwenden, fragte ich mich, ob es möglich ist, es zu verwenden OpenCV damit. Es gab ein paar Beispiele / Tutorials zur Verwendung von OpenCV mit Go, aber ich fand sie zu hackig oder zu kompliziert. Aber das Wrapper, geschrieben von den Leuten bei Hybridgruppe ist meiner Meinung nach am einfachsten zu verwenden und gut dokumentiert.

Anforderungen

  • gehen
  • OpenCV ( folgen Sie den Links unter Installation )
  • eine Webcam / Kamera

Installation

Linux: https://gocv.io/getting-started/linux/

macOS : https://gocv.io/getting-started/macos/

Fenster: https://gocv.io/getting-started/windows/

Beispiel 1

Im ersten Beispiel versuchen wir, eine App zu erstellen, um ein Fenster zu öffnen, das einen Videostream mit Ihrer Webcam anzeigt.

Lassen Sie uns zunächst die benötigten Bibliotheken importieren.

import ( log gocv.io/x/gocv )

Dann erstellen wir a Videoaufnahme Objekt mit dem VideoCaptureGerät Funktion. Die VideoCaptureGerät Mit dieser Funktion können Sie einen Videostream mit der Webcam aufnehmen. Die Funktion nimmt eine ganze Zahl als Parameter auf, die die Geräte-ID darstellt.

webcam, err := gocv.VideoCaptureDevice(0) if err != nil { log.Fatalf(error opening web cam: %v, err) } defer webcam.Close()

Nun erstellen wir eine leere n-dimensionale Matrix. Diese Matrix wird verwendet, um die Bilder zu speichern, die wir später von unserer Kamera lesen.

Bash-Pause für Eingabe
img := gocv.NewMat() defer img.Close()

Um den Videostream anzuzeigen, müssen wir ein Fenster erstellen. Dies kann mit der Neues Fenster Funktion.

window := gocv.NewWindow(webcamwindow) defer window.Close()

Kommen wir nun zum spaßigen Teil.

Javascript str zu senken

Da das Video ein kontinuierlicher Bilderstrom ist, müssen wir eine Endlosschleife erstellen und auf unbestimmte Zeit weiter aus der Kamera lesen. Dafür verwenden wir die Lesen Methode des Typs VideoCapture. Dies wird erwartet Mattentyp (die Matrix, die wir oben erstellt haben) und gibt einen booleschen Wert zurück, der angibt, ob ein Frame aus dem VideoCapture erfolgreich gelesen wurde oder nicht.

for { if ok := webcam.Read(&img); !ok || img.Empty() { log.Println(Unable to read from the webcam) continue } . . . }

Lassen Sie uns abschließend den Rahmen in dem von uns erstellten Fenster anzeigen. Warten Sie dann 50 ms, bevor Sie zum nächsten Bild übergehen.

window.IMShow(img) window.WaitKey(50)

Wenn wir die Anwendung ausführen, wird ein neues Fenster mit dem Videostream von Ihrer Kamera geöffnet.

package main import ( 'log' 'gocv.io/x/gocv' ) func main() { webcam, err := gocv.VideoCaptureDevice(0) if err != nil { log.Fatalf('error opening device: %v', err) } defer webcam.Close() img := gocv.NewMat() defer img.Close() window := gocv.NewWindow('webcamwindow') defer window.Close() for { if ok := webcam.Read(&img); !ok || img.Empty() { log.Println('Unable to read from the webcam') continue } window.IMShow(img) window.WaitKey(50) } }

Beispiel 2

In diesem Beispiel nehmen wir das vorherige Beispiel und bauen darauf auf, um Gesichter mit Haarkaskaden zu erkennen.

Aber zuerst … was sind Haarkaskaden?

Einfacher ausgedrückt sind Haar-Kaskaden kaskadierende Klassifikatoren, die basierend auf der Haar-Wavelet-Technik trainiert werden. Es analysiert Pixel in einem Bild, um Merkmale darin zu erkennen. Um mehr über Haar-Cascades zu erfahren, können Sie auf diese Links verweisen.

Viola-Jones Objekterkennungs-Framework

Kaskadierende Klassifikatoren

Haarähnliche Funktion

Cash-App-Zahlung kann nicht gesendet werden

Sie können vortrainierte Haar-Kaskaden im . herunterladen opencv-Repository . Für dieses Beispiel verwenden wir die Haar-Kaskade, die es uns ermöglicht, das Frontalgesicht einer Person zu erkennen.

Lassen Sie uns eine erstellen Klassifikator und speist die vortrainierte Haar-Cascade-Datei in den Klassifikator ein. In diesem Fall habe ich bereits die opencv_haarcascade_frontalface_default.xml in das Verzeichnis heruntergeladen, in dem sich unser Programm befindet.

harrcascade := opencv_haarcascade_frontalface_default.xml classifier := gocv.NewCascadeClassifier() classifier.Load(harrcascade) defer classifier.Close()

Um dann die Gesichter im Bild zu erkennen, rufen wir an DetectMultiScale Methode. Diese Funktion nimmt Frame ( Mattentyp ), die gerade von der Kamera gelesen wurde und ein Array von zurückgibt Rechteck Typ. Die Größe des Arrays stellt die Anzahl der Gesichter dar, die der Klassifikator im Rahmen erkennen konnte. Um sicherzustellen, dass wir diese Erkennung sehen, durchlaufen wir dann die Liste der Rechtecke, drucken das Rectangle-Objekt auf der Konsole und erstellen einen Rahmen um das erkannte Rechteck. Sie können dies tun, indem Sie die Rectangle-Funktion aufrufen. Diese Funktion nimmt die von der Kamera gelesene Mat, ein Rectangle-Objekt, das von der DetectMultiScale-Methode zurückgegeben wurde, eine Farbe und eine Dicke für den Rand auf.

for _, r := range rects { fmt.Println(detected, r) gocv.Rectangle(&img, r, color, 2) }

Und zum Schluss führen wir die Anwendung aus.

package main import ( 'fmt' 'image/color' 'log' 'gocv.io/x/gocv' ) func main() { webcam, err := gocv.VideoCaptureDevice(0) if err != nil { log.Fatalf('error opening web cam: %v', err) } defer webcam.Close() img := gocv.NewMat() defer img.Close() window := gocv.NewWindow('webcamwindow') defer window.Close() harrcascade := 'opencv_haarcascade_frontalface_default.xml' classifier := gocv.NewCascadeClassifier() classifier.Load(harrcascade) defer classifier.Close() color := color.RGBA{0, 255, 0, 0} for { if ok := webcam.Read(&img); !ok || img.Empty() { log.Println('Unable to read from the device') continue } rects := classifier.DetectMultiScale(img) for _, r := range rects { fmt.Println('detected', r) gocv.Rectangle(&img, r, color, 3) } window.IMShow(img) window.WaitKey(50) } }

Und los gehts! Wir haben ein einfaches Gesichtsdetektor das ist mit Go geschrieben. Ich plane, diese Serie zu erweitern und weitere coole Dinge mit Go und OpenCV zu bauen. Bleiben Sie dran für zukünftige Artikel.

#go #opencv #python