
OpenCV – eine Bibliothek, die für Projekte im Bereich der Computer Vision entwickelt wurde. Sie existiert seit etwa 20 Jahren. Ich habe sie bereits im College verwendet und setze sie bis heute für meine Projekte in C++ und Python ein, da sie eine gute Unterstützung für diese Sprachen bietet.
Als ich jedoch begann, Go zu lernen und zu nutzen, interessierte mich, ob OpenCV auch mit dieser Sprache verwendet werden kann. Zu diesem Zeitpunkt gab es bereits Beispiele und Tutorials zur Integration, jedoch schienen mir diese zu kompliziert. Später stieß ich auf einen Wrapper, der von der Hybrid Group entwickelt wurde. In diesem Artikel zeige ich, wie man mit GoCV beginnt, indem wir ein einfaches Gesichtserkennungssystem mit Haar-Cascades entwickeln.
Skillbox empfiehlt: Praktischer Kurs .
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 Webcam oder eine normale Videokamera.
Installation von
- Linux:
- macOS:
- Windows:
Beispiel 1
Im ersten Beispiel werden wir versuchen, eine Anwendung zu erstellen, die ein Fenster mit einer Live-Demonstration des Kamerastreams öffnet.
Zunächst müssen die Bibliotheken importiert werden, die für die Arbeit notwendig sind.
import (
"log"
"gocv.io/x/gocv"
)
Zuerst erstellen Sie ein VideoCapture-Objekt mit der Funktion VideoCaptureDevice. Diese ermöglicht das Aufzeichnen des Video-Streams über die Kamera. In der Funktion wird eine Ganzzahl als Parameter verwendet (diese 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 Sie eine n-dimensionale Matrix erstellen. Diese wird die Bilder speichern, die von der Kamera erfasst wurden.
img := gocv.NewMat()
defer img.Close()Um den Video-Stream anzuzeigen, müssen Sie ein Fenster erstellen – dies kann mit der Funktion NewWindow erfolgen.
window := gocv.NewWindow(„webcamwindow“)
defer window.Close()Jetzt kommen wir zum spannendsten Teil.
Da das Video einen kontinuierlichen Strom von Bildrahmen darstellt, müssen wir eine Endlosschleife erstellen, um den Video-Stream der Kamera kontinuierlich zu lesen. Dafür ist die Methode Read des Typs VideoCapture erforderlich. Sie wird auf den Typ Mat (die oben erstellte Matrix) warten und einen booleschen Wert zurückgeben, der angibt, ob der Frame erfolgreich aus VideoCapture gelesen wurde oder nicht.
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println(„Webcam konnte nicht gelesen werden“) continue
}
.
.
.
}Jetzt muss der Frame im erstellten Fenster angezeigt werden. Die Pause bis 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 Videostream von der Kamera.

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 auf der Grundlage von Haar-Kaskaden auf.
Haar-Kaskaden sind kaskadierte Klassifizierer, die auf der Haar-Wavelet-Technik trainiert werden. Sie analysieren die Pixel im Bild, um bestimmte Merkmale zu erkennen. Weitere Informationen zu Haar-Kaskaden finden Sie in den folgenden Links.
Vortrainierte Kaskaden herunterladen . In diesem Beispiel werden die Kaskaden verwendet, um das Gesicht einer Person von vorne zu identifizieren.
Um dies zu tun, müssen Sie einen Klassifizierer erstellen und ihm eine bereits trainierte Datei zur Verfügung stellen (der Link ist oben angegeben). Ich habe die Datei opencv_haarcascade_frontalface_default.xml bereits 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, verwenden Sie die Methode . Diese Funktion akzeptiert einen Frame (Typ Mat), der gerade von dem Kameravideostream gelesen wurde, und gibt ein Array vom Typ Rectangle zurück. Die Größe des Arrays entspricht der Anzahl der Gesichter, die der Klassifizierer im Frame 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 eine Grenze um das erkannte Rechteck erstellen. Dies kann mit der Funktion Rectangle durchgeführt werden. Sie akzeptiert das von der Kamera gelesene Mat-Objekt, das vom DetectMultiScale-Methode zurückgegebene Rectangle-Objekt, die Farbe und die Dicke für die Grenze.
for _, r := range rects {
fmt.Println("detected", r)
gocv.Rectangle(&img, r, color, 2)
} 

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("erkannt", r)
gocv.Rectangle(&img, r, color, 3)
}
window.IMShow(img)
window.WaitKey(50)
}
}Und ja, es hat funktioniert! Jetzt haben wir ein einfaches Gesichtserkennungssystem, das in Go geschrieben ist. Bald plane ich, diese Experimente fortzusetzen und coole neue Dinge zu kreieren, indem ich Go und OpenCV kombiniere.
Wenn Sie interessiert sind, schauen Sie sich , den ich in Python und OpenCV geschrieben habe. Er streamt Daten bei der Gesichtserkennung. Dies ist die Grundlage, um verschiedene Clients in verschiedenen Programmiersprachen zu erstellen. Diese können sich mit dem Server verbinden und Daten von ihm abrufen.
Danke, dass Sie den Artikel gelesen haben!
Skillbox empfiehlt:
- Zweijähriger praktischer Kurs .
- Online-Bildungskurs .
- Praktischer Jahreskurs .
Quelle: habr.com
