
OpenCV ist eine Bibliothek, die fĂŒr Computer-Vision-Projekte entwickelt wurde. Sie ist bereits etwa 20 Jahre alt. Ich habe es im College verwendet und verwende es immer noch fĂŒr meine C++- und Python-Projekte, weil es diese Sprachen gut unterstĂŒtzt.
Aber als ich anfing, Go zu lernen und zu verwenden, begann ich mich dafĂŒr zu interessieren, ob OpenCV fĂŒr die Arbeit mit dieser Sprache verwendet werden könnte. Damals gab es bereits Beispiele und Tutorials zur Integration, die mir aber zu kompliziert erschienen. 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 ich mit Haar Cascades ein einfaches Gesichtserkennungssystem entwickle.
Skillbox empfiehlt: Praktischer Kurs .
Erinnerung: fĂŒr alle Leser von âHabrâ â ein Rabatt von 10 Rubel bei der Anmeldung zu einem beliebigen Skillbox-Kurs mit dem Aktionscode âHabrâ.
Was wird benötigt:
- Gehen;
- OpenCV (Links zum Installationsprogramm unten);
- Web- oder normale Videokamera.
Einstellung
- Linux:
- macOS:
- Windows:
Beispiel 1
Im ersten Beispiel werden wir versuchen, eine Anwendung zu erstellen, die ein Fenster öffnet, in dem ein Kameravideostream angezeigt wird.
Zuerst mĂŒssen Sie die fĂŒr die Arbeit benötigten Bibliotheken importieren.
importieren (
"Protokoll"
âgocv.io/x/gocvâ
)
AnschlieĂend mĂŒssen Sie mithilfe der VideoCaptureDevice-Funktion ein VideoCapture-Objekt erstellen. Letzteres ermöglicht die Aufnahme eines Videostreams mit einer Kamera. Die Funktion verwendet eine Ganzzahl als Parameter (sie stellt die GerĂ€te-ID dar).
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf(âerror opening web cam: %vâ, err)
}
defer webcam.Close()Jetzt mĂŒssen wir eine n-dimensionale Matrix erstellen. Es speichert die von der Kamera gelesenen Bilder.
img := gocv.NewMat()
defer img.Close()Um einen 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 einem Video um einen kontinuierlichen Strom von Einzelbildern handelt, mĂŒssen wir eine Endlosschleife erstellen, um den Videostrom der Kamera endlos zu lesen. Dazu benötigen Sie die Read-Methode vom Typ VideoCapture. Es wird ein Mat-Typ erwartet (die Matrix, die wir oben erstellt haben), der einen booleschen Wert zurĂŒckgibt, der angibt, ob der 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
}
.
.
.
}Jetzt mĂŒssen Sie den Rahmen im erstellten Fenster anzeigen. Die Pause zum Ăbergang zum nĂ€chsten Frame betrĂ€gt 50 ms.
window.IMShow(img)
window.WaitKey(50)
Nach dem Start der Anwendung öffnet sich ein Fenster mit einem Videostream von der Kamera.

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 basierend auf Haar Cascades.
Haar-Kaskaden sind Kaskadenklassifikatoren, die mithilfe der Haar-Wavelet-Technik trainiert werden. Sie analysieren die Pixel in einem Bild, um bestimmte Merkmale zu erkennen. Um mehr ĂŒber Haar Cascades zu erfahren, folgen Sie bitte den untenstehenden Links.
Laden Sie bereits trainierte Kaskaden herunter . Im aktuellen Beispiel werden Kaskaden verwendet, um das Gesicht einer Person von vorne zu identifizieren.
Dazu mĂŒssen Sie einen Klassifikator erstellen und ihn mit einer bereits trainierten Datei fĂŒttern (der Link ist oben 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 in einem Bild zu erkennen, mĂŒssen Sie die Methode verwenden . Diese Funktion nimmt einen Frame (Typ Mat), der gerade aus dem Videostream der Kamera gelesen wurde, und gibt ein Array vom Typ Rechteck zurĂŒck. Die Array-GröĂe stellt die Anzahl der Gesichter dar, die der Klassifikator im Rahmen erkennen konnte. Um sicherzustellen, dass wir sehen, was gefunden wurde, durchlaufen wir dann die Liste der Rechtecke und geben das Rechteckobjekt auf der Konsole aus, wodurch ein Rahmen um das erkannte Rechteck erstellt wird. Dies kann mit der Rechteckfunktion erfolgen. Es akzeptiert die von der Kamera gelesene Matte, das von der DetectMultiScale-Methode zurĂŒckgegebene Rechteckobjekt sowie die Farbe und Dicke des Rahmens.
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, alles hat geklappt! Wir haben jetzt ein einfaches Gesichtserkennungssystem, das in Go geschrieben ist. Bald habe ich vor, diese Experimente fortzusetzen und durch die Kombination von Go und OpenCV neue coole Dinge zu schaffen.
Bei Interesse bitte bewerten , das ich in Python und OpenCV geschrieben habe. Es ĂŒbertrĂ€gt Daten, sobald ein Gesicht erkannt wird. Dies ist die Grundlage fĂŒr die Erstellung unterschiedlicher Clients in unterschiedlichen Programmiersprachen. Sie können sich mit dem Server verbinden und Daten von ihm lesen.
Vielen Dank, dass Sie den Artikel gelesen haben!
Skillbox empfiehlt:
- ZweijÀhriges Praktikum .
- PĂ€dagogischer Online-Kurs .
- Praktisches Jahr .
Source: habr.com
