Bou 'n gesigherkenningstelsel gebaseer op Golang en OpenCV

Bou 'n gesigherkenningstelsel gebaseer op Golang en OpenCV
OpenCV is 'n biblioteek wat ontwerp is vir rekenaarvisieprojekte. Sy is al so 20 jaar oud. Ek het dit op universiteit gebruik en gebruik dit steeds vir my C++ en Python-projekte omdat dit goeie ondersteuning vir daardie tale het.

Maar toe ek Go begin leer en gebruik, het ek begin belangstel of OpenCV gebruik kan word om met hierdie taal te werk. Daar was toe reeds voorbeelde en tutoriale oor integrasie, maar dit het vir my gelyk of dit te ingewikkeld was. ’n Bietjie later het ek op ’n omhulsel afgekom wat deur The Hybrid Group-span geskep is. In hierdie artikel sal ek jou wys hoe om met GoCV te begin deur 'n eenvoudige gesigherkenningstelsel met Haar Cascades te ontwikkel.

Skillbox beveel aan: Praktiese kursus "Python-ontwikkelaar van nuuts af".

Ons herinner: vir alle lesers van "Habr" - 'n afslag van 10 000 roebels wanneer u inskryf vir enige Skillbox-kursus met behulp van die "Habr"-promosiekode.

Wat word benodig:

  • Gaan;
  • OpenCV (installeerder skakels hieronder);
  • web- of gewone videokamera.

installasie

Voorbeeld 1

In die eerste voorbeeld sal ons probeer om 'n toepassing te skep wat 'n venster oopmaak wat 'n kamera-videostroom wys.

Eerstens moet jy die biblioteke invoer wat nodig is vir werk.

invoer (
"Meld"
"gocv.io/x/gocv"
)

Hierna moet jy 'n VideoCapture-voorwerp skep deur die VideoCaptureDevice-funksie te gebruik. Laasgenoemde maak dit moontlik om 'n videostroom met 'n kamera vas te vang. Die funksie gebruik 'n heelgetal as 'n parameter (dit verteenwoordig die toestel-ID).

webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {    log.Fatalf(“error opening web cam: %v”, err)
}
defer webcam.Close()

Nou moet ons 'n n-dimensionele matriks skep. Dit sal beelde stoor wat vanaf die kamera gelees is.

img := gocv.NewMat()
defer img.Close()

Om 'n videostroom te vertoon, moet jy 'n venster skep - dit kan gedoen word deur die NewWindow-funksie te gebruik.

window := gocv.NewWindow(“webcamwindow”)
defer window.Close()

Kom ons gaan nou na die interessantste deel.

Aangesien video 'n aaneenlopende stroom beeldrame is, sal ons 'n oneindige lus moet skep om die kamera se videostroom eindeloos te lees. Om dit te doen, benodig jy die Lees-metode van die VideoCapture-tipe. Dit sal 'n Mat-tipe verwag (die matriks wat ons hierbo geskep het), wat 'n Boolese waarde gee wat aandui of die raam van die VideoCapture suksesvol gelees is of nie.

for {     
        if ok := webcam.Read(&img); !ok || img.Empty( {
        log.Println(“Unable to read from the webcam”)    continue
     }
.
.
.
}

Nou moet jy die raam in die geskepde venster vertoon. Die pouse om na die volgende raam te beweeg is 50 ms.

window.IMShow(img)
window.WaitKey(50)

Nadat die toepassing begin is, sal 'n venster met 'n videostroom vanaf die kamera oopmaak.

Bou 'n gesigherkenningstelsel gebaseer op Golang en OpenCV

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)
}
}

Voorbeeld 2

In hierdie voorbeeld, kom ons gebruik die vorige voorbeeld en bou 'n gesigherkenningstelsel gebaseer op Haar Cascades.

Haar-kaskenades is kaskade-klassifiseerders wat opgelei word met behulp van die Haar wavelet-tegniek. Hulle ontleed die pixels in 'n prent om sekere kenmerke op te spoor. Om meer uit te vind oor Haar Cascades, volg asseblief die skakels hieronder.

Viola-Jones objekbespeuringsraamwerk
Cascading klassifiseerders
Haaragtige kenmerk

Laai reeds opgeleide kaskenades af kan hier wees. In die huidige voorbeeld sal kaskenades gebruik word om 'n persoon se gesig van voor te identifiseer.

Om dit te kan doen, moet jy 'n klassifiseerder skep en dit 'n reeds opgeleide lêer voer (die skakel word hierbo gegee). Ek het reeds die pencv_haarcascade_frontalface_default.xml-lêer opgelaai na die gids waar ons program geleë is.

harrcascade := “opencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()

Om gesigte in 'n prent op te spoor, moet jy die metode gebruik DetectMultiScale. Hierdie funksie neem 'n raam (tipe Mat) wat pas uit die kamera se videostroom gelees is en gee 'n reeks van tipe Reghoek terug. Die skikkinggrootte verteenwoordig die aantal gesigte wat die klassifiseerder in die raam kon opspoor. Dan, om seker te maak ons ​​sien wat dit gevind het, kom ons herhaal die lys reghoeke en druk die Reghoek-voorwerp na die konsole, wat 'n rand om die bespeurde reghoek skep. Dit kan gedoen word deur die Reghoek-funksie te gebruik. Dit sal die Mat wat deur die kamera gelees word, die Reghoek-voorwerp wat deur die DetectMultiScale-metode teruggestuur is, die kleur en dikte vir die rand aanvaar.

for _, r := range rects {
fmt.Println(“detected”, r)
gocv.Rectangle(&img, r, color, 2)
}

Bou 'n gesigherkenningstelsel gebaseer op Golang en OpenCV

Bou 'n gesigherkenningstelsel gebaseer op Golang en OpenCV

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)
}
}

En... ja, alles het uitgewerk! Ons het nou 'n eenvoudige gesigsherkenningstelsel wat in Go geskryf is. Binnekort beplan ek om hierdie eksperimente voort te sit en nuwe cool dinge te skep deur Go en OpenCV te kombineer.

As jy belangstel, gradeer asseblief gRPC webbediener, wat ek in Python en OpenCV geskryf het. Dit stroom data sodra 'n gesig bespeur word. Dit is die basis vir die skep van verskillende kliënte in verskillende programmeertale. Hulle sal aan die bediener kan koppel en data daaruit kan lees.

Dankie dat jy die artikel gelees het!

Skillbox beveel aan:

Bron: will.com

Voeg 'n opmerking