Vi bygger ett ansiktigenkÀnningssystem baserat pÄ Golang och OpenCV

Vi bygger ett ansiktigenkÀnningssystem baserat pÄ Golang och OpenCV
OpenCV Àr ett bibliotek som utvecklats för projekt inom datorseende. Det har nu funnits i ungefÀr 20 Är. Jag anvÀnde det redan pÄ universitetet och anvÀnder det fortfarande för mina projekt i C++ och Python, eftersom det har ett bra stöd för dessa sprÄk.

Men nÀr jag började utforska och anvÀnda Go blev jag nyfiken pÄ om man kunde anvÀnda OpenCV med detta sprÄk. Det fanns redan exempel och tutorials för integration vid det tillfÀllet, men jag tyckte att de var för komplicerade. Lite senare kom jag i kontakt med en wrapper som skapats av teamet pÄ The Hybrid Group. I den hÀr artikeln kommer jag att visa hur man börjar med GoCV genom att utveckla ett enkelt ansiktsigenkÀnningssystem med Haar Cascades.

Skillbox rekommenderar: Praktisk kurs «Python-utvecklare frÄn grunden».

PĂ„minnelse: för alla lĂ€sare av "Habr" — 10 000 rubel rabatt vid registrering för vilken kurs som helst pĂ„ Skillbox med rabattkoden "Habr".

Vad som behövs:

  • Go;
  • OpenCV (lĂ€nkar till installerare nedan);
  • en webbkamera eller vanlig kamera.

Installation

Exempel 1

I det första exemplet kommer vi att försöka skapa en applikation som öppnar ett fönster med en demonstration av videoströmmen frÄn kameran.

Först mÄste vi importera de bibliotek som behövs för att arbeta.

import (
“log”
“gocv.io/x/gocv”
)

DÀrefter behöver vi skapa ett VideoCapture-objekt med hjÀlp av funktionen VideoCaptureDevice. Denna ger oss möjlighet att fÄnga videoströmmen med hjÀlp av kameran. Funktionen anvÀnder ett heltal som parameter (det representerar enhetens ID).

webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {    log.Fatalf(“fel vid öppning av webbkameran: %v”, err)
}
defer webcam.Close()

Nu behöver vi skapa en n-dimensionell matris. Den kommer att lagra bilder som lÀses in frÄn kameran.

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

För att visa videoströmmen behöver vi skapa ett fönster — detta kan göras med funktionen NewWindow.

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

Nu gÄr vi vidare till den mest intressanta delen.

Eftersom videon Àr en kontinuerlig ström av bildrutor behöver vi skapa en oÀndlig loop för att kontinuerligt lÀsa videoströmmen frÄn kameran. För detta behövs metoden Read av typen VideoCapture. Den kommer att förvÀnta sig en typ Mat (matrisen vi skapade ovan), och returnera ett booleskt vÀrde som indikerar om en bildruta frÄn VideoCapture har lÀsts in framgÄngsrikt eller inte.

for {     
        if ok := webcam.Read(&img); !ok || img.Empty() {
        log.Println(“Kunde inte lĂ€sa frĂ„n webbkameran”)    continue
     }
.
.
.
}

Nu behöver vi visa ramen i det skapade fönstret. Paus för att gĂ„ till nĂ€sta ram — 50 ms.

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

NÀr applikationen körs öppnas ett fönster med videoströmmen frÄn kameran.

Vi bygger ett ansiktigenkÀnningssystem baserat pÄ Golang och 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)
}
}

Exempel 2

I det hÀr exemplet ska vi anvÀnda det föregÄende exemplet och bygga ett system för ansiktsigenkÀnning baserat pÄ Haar Cascades.

Haar Cascades Àr kaskadklassificerare som trÀnas med hjÀlp av Haar-vÄgletetekniken. De analyserar pixlar i en bild för att upptÀcka specifika funktioner. För att lÀra dig mer om Haar Cascades kan du följa lÀnkarna nedan.

Viola-Jones objektidentifieringsramverk
Kaskadklassificerare
Haar-liknande funktion

Ladda ner redan trÀnade kaskader hÀr. I det aktuella exemplet kommer kaskaderna att anvÀndas för att identifiera ett ansikte pÄ en person i frontprofil.

För att göra detta mÄste du skapa en klassificerare och mata den med en redan trÀnad fil (lÀnken ovan ger mer information). Jag har redan laddat upp filen opencv_haarcascade_frontalface_default.xml i katalogen dÀr vÄrt program finns.

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

För att upptÀcka ansikten i en bild mÄste du anvÀnda metoden DetectMultiScale. Denna funktion tar en bild (typ Mat) som just har lÀsts in frÄn kamerans videoström och returnerar en array av typen Rectangle. Storleken pÄ arrayen representerar antalet ansikten som klassificeraren kunde upptÀcka i bilden. För att se att vi faktiskt ser vad den har upptÀckt, lÄt oss gÄ igenom listan av rektanglar och skriva ut objektet Rectangle pÄ konsolen genom att skapa en kant runt den upptÀckta rektangeln. Detta kan göras med hjÀlp av funktionen Rectangle. Den tar Mat, som lÀsts in av kameran, objektet Rectangle som returnerades av metoden DetectMultiScale, fÀrgen och tjockleken för kanten.

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

Vi bygger ett ansiktigenkÀnningssystem baserat pÄ Golang och OpenCV

Vi bygger ett ansiktigenkÀnningssystem baserat pÄ Golang och 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)
}
}

Och ja, det blev bra! Nu har vi ett enkelt system för ansiktsigenkÀnning skrivet i Go. Snart planerar jag att fortsÀtta med dessa experiment och skapa nya coola grejer genom att kombinera Go och OpenCV.

Om du Àr intresserad, ge en bedömning gRPC web server, som jag skrev i Python och OpenCV. Den strÀmmar data i realtid nÀr den upptÀcker ett ansikte. Detta Àr grunden för att skapa olika klienter pÄ olika programmeringssprÄk. De kommer att kunna ansluta till servern och lÀsa data frÄn den.

Tack för att du lÀste artikeln!

Skillbox rekommenderar:

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster