OpenCV ist eine Bibliothek für Computer Vision-Projekte. Sie ist schon ungefähr 20 Jahre alt. Ich habe es im College verwendet und verwende es immer noch für meine Projekte in C ++ und Python, da es diese Sprachen gut unterstützt.
Aber als ich anfing, Go zu lernen und zu verwenden, fragte ich mich, ob OpenCV verwendet werden könnte, um mit dieser Sprache zu arbeiten. Zu dieser Zeit gab es bereits Beispiele und Tutorials zur Integration, aber es schien mir, dass sie zu kompliziert waren. Wenig später stieß ich auf einen Wrapper, der vom Team der Hybrid Group erstellt wurde. In diesem Artikel zeige ich Ihnen, wie Sie mit GoCV beginnen, indem Sie ein einfaches Gesichtserkennungssystem mit Haar Cascades entwickeln.
Skillbox empfiehlt: Der Python-Entwickler von Grund auf zum Anfassen .
Wir erinnern Sie daran: Für alle Leser von „Habr“ - ein Rabatt von 10.000 Rubel bei der Anmeldung für einen Skillbox-Kurs mit dem Promo-Code „Habr“.
Was ist erforderlich:- Geh;
- OpenCV (Installationslinks unten);
- Web oder herkömmlicher Camcorder.
InstallationBeispiel 1
Im ersten Beispiel werden wir versuchen, eine Anwendung zu erstellen, die ein Fenster mit einer Demonstration des Videostreams der Kamera öffnet.
Zuerst müssen Sie die Bibliotheken importieren, die Sie zum Arbeiten benötigen.
importieren (
"Log"
"Gocv.io/x/gocv"
)Danach müssen Sie mit der Funktion VideoCaptureDevice ein VideoCapture-Objekt erstellen. Letzteres ermöglicht es, den Videostream mit der Kamera aufzunehmen. Die Funktion verwendet eine Ganzzahl als Parameter (sie repräsentiert die Geräte-ID).
webcam, err := gocv.VideoCaptureDevice(0) if err != nil { log.Fatalf(“error opening web cam: %v”, err) } defer webcam.Close()
Jetzt müssen Sie eine n-dimensionale Matrix erstellen. Es werden von der Kamera gelesene Bilder gespeichert.
img := gocv.NewMat() defer img.Close()
Um den Videostream anzuzeigen, müssen Sie ein Fenster erstellen - dies kann mit der NewWindow-Funktion erfolgen.
window := gocv.NewWindow(“webcamwindow”) defer window.Close()
Kommen wir nun zum interessantesten Teil.
Da es sich bei dem Video um einen kontinuierlichen Strom von Bildrahmen handelt, müssen wir eine Endlosschleife erstellen, um den Videostream der Kamera endlos zu lesen. Dazu benötigen Sie die Read-Methode vom Typ VideoCapture. Es wartet auf den Typ Mat (die oben erstellte Matrix) und gibt einen booleschen Wert zurück, der angibt, ob der Frame von VideoCapture erfolgreich gelesen wurde oder nicht.
for { if ok := webcam.Read(&img); !ok || img.Empty( { log.Println(“Unable to read from the webcam”) continue } . . . }
Jetzt müssen Sie den Rahmen im erstellten Fenster anzeigen. Pause, um zum nächsten Bild zu gelangen - 50 ms.
window.IMShow (img)
window.WaitKey (50)Nach dem Starten der Anwendung wird ein Fenster mit einem Videostream von der 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 verwenden wir das vorherige Beispiel und erstellen ein Gesichtserkennungssystem, das auf Haar-Kaskaden (Haar-Kaskaden) basiert.
Haar-Kaskaden sind Kaskadenklassifikatoren, die auf der Grundlage der Haar-Wavelet-Technik trainiert werden. Sie analysieren die Pixel im Bild, um bestimmte Zeichen zu erkennen. Um mehr über Haar Cascades zu erfahren, folgen Sie den unten stehenden Links.
Framework zur Erkennung von Viola-Jones-ObjektenKaskadierende KlassifikatorenHaarähnliches MerkmalHier
können Sie bereits trainierte Kaskaden herunterladen. Im aktuellen Beispiel werden Kaskaden verwendet, um das Gesicht einer Person im Gesicht zu identifizieren.
Dazu müssen Sie einen Klassifikator erstellen und ihm eine bereits trainierte Datei zuführen (der obige Link ist angegeben). Ich habe die Datei pencv_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, müssen Sie die
DetectMultiScale- Methode verwenden. Diese Funktion verwendet ein Bild (Typ Mat), das gerade aus dem Videostream der Kamera gelesen wurde, und gibt ein Array vom Typ Rectangle zurück. Die Größe des Arrays gibt die Anzahl der Flächen an, die der Klassifizierer im Frame erkennen konnte. Um sicherzustellen, dass wir sehen, was er gefunden hat, gehen wir die Liste der Rechtecke durch und zeigen das Rechteck-Objekt auf der Konsole an, wobei ein Rahmen um das erkannte Rechteck erstellt wird. Dies kann mit der Rechteckfunktion erfolgen. Es wird die von der Kamera gelesene Matte, das von der DetectMultiScale-Methode zurückgegebene Rechteckobjekt, Farbe und Dicke für den Rand benötigt.
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("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 ... ja, es hat geklappt! Jetzt haben wir ein einfaches Gesichtserkennungssystem in Go geschrieben. In naher Zukunft plane ich, diese Experimente fortzusetzen und neue coole Sachen zu kreieren, die Go und OpenCV kombinieren.
Wenn Sie interessiert sind,
schauen Sie sich den gRPC-Webserver an , den ich in Python und OpenCV geschrieben habe. Es überträgt Daten zum Zeitpunkt der Gesichtserkennung. Dies ist die Basis für die Erstellung verschiedener Clients in verschiedenen Programmiersprachen. Sie können eine Verbindung zum Server herstellen und Daten von diesem lesen.
Vielen Dank für das Lesen des Artikels!
Skillbox empfiehlt: