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

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster