Wir bauen ein System zur Gesichtserkennung auf der Basis von Golang und OpenCV

Wir bauen ein System zur Gesichtserkennung auf der Basis von Golang und OpenCV
OpenCV – eine Bibliothek, die für Projekte im Bereich Computer Vision entwickelt wurde. Sie ist bereits etwa 20 Jahre alt. Ich habe sie schon im College verwendet und nutze sie immer noch für meine Projekte in C++ und Python, da sie eine gute Unterstützung für diese Sprachen bietet.

Als ich jedoch anfing, Go zu lernen und zu verwenden, wurde ich neugierig, ob man OpenCV auch mit dieser Sprache nutzen kann. Zu diesem Zeitpunkt gab es bereits Beispiele und Tutorials zur Integration, aber ich fand sie zu kompliziert. Wenig später stieß ich auf einen Wrapper, der vom Team von The Hybrid Group erstellt wurde. In diesem Artikel zeige ich, wie man mit GoCV beginnt, indem wir ein einfaches System zur Gesichtserkennung mit Haar-Cascades entwickeln.

Skillbox empfiehlt: Praktischer Kurs „Python-Entwickler von Grund auf„.

Wir erinnern daran: alle Leser von „Habr“ erhalten einen Rabatt von 10.000 Rubel bei der Anmeldung zu einem beliebigen Kurs von Skillbox mit dem Aktionscode „Habr“.

Was benötigt wird:

  • Go;
  • OpenCV (Links zum Installer unten);
  • eine Web- oder herkömmliche Kamera.

Installation

Beispiel 1

Im ersten Beispiel werden wir versuchen, eine Anwendung zu erstellen, die ein Fenster öffnet und den Video-Stream der Kamera demonstriert.

Zuerst müssen die für die Arbeit benötigten Bibliotheken importiert werden.

import (
"log"
"gocv.io/x/gocv"
)

Als nächstes muss ein VideoCapture-Objekt unter Verwendung der Funktion VideoCaptureDevice erstellt werden. Letztere ermöglicht das Erfassen von Video-Streams über die Kamera. In der Funktion wird eine Ganzzahl als Parameter verwendet (sie stellt die Geräte-ID dar).

webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {    log.Fatalf("Fehler beim Öffnen der Webcam: %v", err)
}
defer webcam.Close()

Jetzt müssen wir eine n-dimensionale Matrix erstellen. Diese wird die von der Kamera aufgenommenen Bilder speichern.

img := gocv.NewMat()
defer img.Close()

Um den Video-Stream anzuzeigen, müssen wir ein Fenster erstellen – dies kann mit der Funktion NewWindow erfolgen.

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

Jetzt kommen wir zum interessantesten Teil.

Da das Video einen kontinuierlichen Strom von Bildrahmen darstellt, müssen wir eine Endlosschleife erstellen, um den Video-Stream der Kamera ununterbrochen zu lesen. Dafür benötigen wir die Read-Methode des Typs VideoCapture. Diese erwartet einen Typ Mat (die oben erstellte Matrix) und gibt einen booleschen Wert zurück, der angibt, ob der Frame aus dem VideoCapture erfolgreich gelesen wurde oder nicht.

for {     
        if ok := webcam.Read(&img); !ok || img.Empty() {
        log.Println("Nicht möglich, von der Webcam zu lesen.")    continue
     }
.
.
.
}

Jetzt müssen wir das Frame im erstellten Fenster anzeigen. Die Pause für den Wechsel zum nächsten Frame beträgt 50 ms.

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

Nach dem Start der Anwendung öffnet sich ein Fenster mit dem Video-Stream der Kamera.

Wir bauen ein System zur Gesichtserkennung auf der Basis von Golang und OpenCV

package main
 
import (
"log"
 
"gocv.io/x/gocv"
)
 
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
    log.Fatalf("Fehler beim Öffnen des Geräts: %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("Kann nicht von der Webcam lesen")
continue
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

Beispiel 2

In diesem Beispiel verwenden wir das vorherige Beispiel und bauen ein System zur Gesichtserkennung basierend auf Haar-Kaskaden (Haar-Kaskaden).

Haar-Kaskaden sind kaskadierte Klassifikatoren, die auf der Technik der Haar-Wavelets trainiert werden. Sie analysieren die Pixel im Bild, um bestimmte Merkmale zu erkennen. Um mehr über Haar-Kaskaden zu erfahren, können Sie die Links unten besuchen.

Viola-Jones Objekterkennungsrahmen
Kaskadierende Klassifikatoren
Haar-ähnliches Merkmal

Bereits trainierte Kaskaden herunterladen hier. In diesem Beispiel werden die Kaskaden verwendet, um das Gesicht einer Person von vorne zu identifizieren.

Um dies zu tun, müssen Sie einen Klassifikator erstellen und ihm die bereits trainierte Datei (siehe oben) zur Verfügung stellen. Ich habe die Datei opencv_haarcascade_frontalface_default.xml in das Verzeichnis hochgeladen, in dem sich unser Programm befindet.

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

Um Gesichter im Bild zu erkennen, muss die Methode DetectMultiScaleverwendet werden. Diese Funktion nimmt einen Frame (Typ Mat), der gerade aus dem Kamera-Video-Stream gelesen wurde, und gibt ein Array vom Typ Rectangle zurück. Die Größe des Arrays stellt die Anzahl der Gesichter dar, die der Klassifikator im Bild erkennen konnte. Um sicherzustellen, dass wir sehen, was er gefunden hat, lassen Sie uns durch die Liste der Rechtecke gehen und das Rectangle-Objekt in die Konsole ausgeben, indem wir einen Rahmen um das erkannte Rechteck erstellen. Dies kann durch die Funktion Rectangle erfolgen. Sie akzeptiert Mat, das von der Kamera gelesen wurde, das Rectangle-Objekt, das von der Methode DetectMultiScale zurückgegeben wurde, die Farbe und die Dicke für den Rahmen.

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

Wir bauen ein System zur Gesichtserkennung auf der Basis von Golang und OpenCV

Wir bauen ein System zur Gesichtserkennung auf der Basis von Golang und OpenCV

package main
 
import (
"fmt"
"image/color"
"log"
 
"gocv.io/x/gocv"
)
 
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("Fehler beim Öffnen der Webcam: %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("Kann nicht vom Gerät lesen")
continue
}
 
rects := classifier.DetectMultiScale(img)
for _, r := range rects {
fmt.Println("entdeckt", r)
gocv.Rectangle(&img, r, color, 3)
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

Ja… es hat geklappt! Jetzt haben wir ein einfaches Gesichtserkennungssystem, das in Go geschrieben ist. Bald plane ich, diese Experimente fortzusetzen und neue coole Dinge zu erstellen, indem ich Go und OpenCV kombiniere.

Wenn es Sie interessiert, bewerten Sie es. gRPC-Webserver, den ich in Python und OpenCV geschrieben habe. Er streamt Daten im Moment der Gesichtserkennung. Das ist die Grundlage zur Erstellung verschiedener Clients in unterschiedlichen Programmiersprachen. Diese können sich mit dem Server verbinden und Daten abrufen.

Danke, dass Sie den Artikel gelesen haben!

Skillbox empfiehlt:

Quelle: habr.com

60GB SSD 8Gb DDR4