
OpenCV is een bibliotheek die is ontwikkeld voor projecten op het gebied van computer vision. Het bestaat al ongeveer 20 jaar. Ik heb het gebruikt tijdens mijn studie en pas het nog steeds toe in mijn projecten in C++ en Python, omdat het een goede ondersteuning voor deze talen biedt.
Maar toen ik begon met het leren en gebruiken van Go, vroeg ik me af of ik OpenCV kon toepassen met deze taal. Op dat moment waren er al voorbeelden en tutorials over integratie, maar ik vond ze te complex. Een tijdje later kwam ik een wrapper tegen, gemaakt door het team van The Hybrid Group. In dit artikel laat ik zien hoe je aan de slag kunt met GoCV door een eenvoudig gezichtsherkenningssysteem te ontwikkelen met Haar Cascades.
Skillbox raadt aan: Praktische cursus .
Ter herinnering: voor alle lezers van «Habr» â een korting van 10.000 roebel bij inschrijving voor elke cursus van Skillbox met de promocode «Habr».
Wat je nodig hebt:
- Go;
- OpenCV (links naar de installer hieronder);
- een webcam of gewone videocamera.
Installatie
- Linux:
- macOS:
- Windows:
Voorbeeld 1
In het eerste voorbeeld proberen we een applicatie te maken die een venster opent met de demonstratie van de videostream van de camera.
Eerst moeten we de vereiste bibliotheken importeren.
import (
âlogâ
âgocv.io/x/gocvâ
)
Vervolgens moeten we een VideoCapture-object maken met behulp van de functie VideoCaptureDevice. Deze laatste maakt het mogelijk om de videostream van de camera vast te leggen. De functie gebruikt een geheel getal als parameter (dit vertegenwoordigt het apparaats-ID).
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf(âerror opening web cam: %vâ, err)
}
defer webcam.Close()Nu moeten we een n-dimensionale matrix creëren. Deze zal de beelden opslaan die van de camera zijn gelezen.
img := gocv.NewMat()
defer img.Close()Om de videostream weer te geven, moeten we een venster creĂ«ren â dit kan met de functie NewWindow.
window := gocv.NewWindow(âwebcamwindowâ)
defer window.Close()Laten we nu doorgaan naar het meest interessante deel.
Omdat video bestaat uit een ononderbroken stroom van beeldframes, moeten we een oneindige lus maken voor het oneindig lezen van de videostream van de camera. Hiervoor is een methode Read van het type VideoCapture nodig. Deze zal wachten op een type Mat (de matrix die we hierboven hebben gemaakt) en een logisch waarde retourneren die aangeeft of het frame uit VideoCapture succesvol is gelezen of niet.
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println(âUnable to read from the webcamâ) continue
}
.
.
.
}Nu moeten we het frame in het gemaakte venster weergeven. De pauze om naar het volgende frame te gaan â 50 ms.
window.IMShow(img)
window.WaitKey(50)
Na het starten van de applicatie opent er een venster met de videostream van de camera.

pakket hoofd
import (
"log"
"gocv.io/x/gocv"
)
func hoofd() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("fout bij het openen van apparaat: %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("Kan niet lezen van de webcam")
continue
}
window.IMShow(img)
window.WaitKey(50)
}
}Voorbeeld 2
In dit voorbeeld gaan we gebruikmaken van het vorige voorbeeld en een systeem voor gezichtsherkenning bouwen op basis van Haar Cascades.
Haar Cascades zijn cascade classifiers die zijn getraind op basis van de Haar wavelet techniek. Ze analyseren pixels in een afbeelding om bepaalde kenmerken te detecteren. Voor meer informatie over Haar Cascades kun je de onderstaande links volgen.
Download al getrainde cascades . In het huidige voorbeeld zullen de cascades worden gebruikt om het gezicht van een persoon van voren te identificeren.
Om dit te doen, moet je een classifier maken en deze voeden met het eerder getrainde bestand (de link is hierboven gegeven). Ik heb al het bestand opencv_haarcascade_frontalface_default.xml in de map geplaatst waar ons programma zich bevindt.
harrcascade := "opencv_haarcascade_frontalface_default.xml"classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()Om gezichten in een afbeelding te detecteren, moet je de methode . Deze functie neemt een frame (type Mat), dat net is gelezen van de videostream van de camera, en retourneert een array van het type Rectangle. De grootte van de array geeft het aantal gezichten aan dat de classifier in het frame heeft kunnen detecteren. Vervolgens, om er zeker van te zijn dat we zien wat hij heeft gevonden, laten we door de lijst van rechthoeken lopen en het Rectangle-object naar de console afdrukken, terwijl we een rand rondom het gedetecteerde rechthoek maken. Dit kan gedaan worden met de functie Rectangle. Het zal Mat, dat door de camera is gelezen, een Rectangle-object, dat door de DetectMultiScale-methode is geretourneerd, kleur en dikte voor de rand accepteren.
for _, r := range rects {
fmt.Println("gedetecteerd", 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)
}
}Ja... het is gelukt! We hebben nu een eenvoudig gezichtsherkenningssysteem in Go. Binnenkort ben ik van plan om deze experimenten voort te zetten en nieuwe coole dingen te maken door Go en OpenCV te combineren.
Als je geĂŻnteresseerd bent, laat dan een beoordeling achter , die ik heb geschreven in Python en OpenCV. Het streamt gegevens op het moment dat een gezicht wordt gedetecteerd. Dit is de basis voor het maken van verschillende clients in verschillende programmeertalen. Zij kunnen verbinding maken met de server en gegevens van hem lezen.
Bedankt voor het lezen van het artikel!
Skillbox raadt aan:
- Praktische tweejarenopleiding .
- Online opleidingscursus .
- Praktische jaaropleiding .
Bron: habr.com
