Bygga ett ansiktsigenkÀnningssystem baserat pÄ Golang och OpenCV

Bygga ett ansiktsigenkÀnningssystem baserat pÄ Golang och OpenCV
OpenCV Àr ett bibliotek utvecklat för datorseendeprojekt. Hon Àr redan cirka 20 Är gammal. Jag anvÀnde det pÄ college och anvÀnder det fortfarande för mina C++- och Python-projekt eftersom det har bra stöd för dessa sprÄk.

Men nÀr jag började lÀra mig och anvÀnda Go undrade jag om OpenCV kunde anvÀndas för att arbeta med detta sprÄk. PÄ den tiden fanns det redan exempel och handledningar om integration, men jag tyckte att de var för komplicerade. Lite senare kom jag över ett omslag skapat av The Hybrid Group. I den hÀr artikeln kommer jag att visa dig hur du kommer igÄng 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" - en rabatt pÄ 10 000 rubel nÀr du anmÀler dig till nÄgon Skillbox-kurs med hjÀlp av "Habr"-kampanjkoden.

Vad kommer att krÀvas:

  • GĂ„;
  • OpenCV (lĂ€nkar till installationsprogrammet nedan);
  • webb eller vanlig videokamera.

Installation

exempel 1

I det första exemplet kommer vi att försöka skapa ett program som öppnar ett fönster med en kameravideoström.

Först mÄste du importera de bibliotek du behöver för att arbeta.

importera (
"logga"
"gocv.io/x/gocv"
)

Efter det mÄste du skapa ett VideoCapture-objekt med funktionen VideoCaptureDevice. Det senare gör det möjligt att fÄnga en videoström med hjÀlp av en kamera. Funktionen tar ett heltal som en parameter (det representerar enhets-ID).

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

Nu mÄste vi skapa en n-dimensionell matris. Den lagrar bilderna som lÀses frÄn kameran.

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

För att visa videoströmmen mÄste du skapa ett fönster - detta kan göras med hjÀlp av NewWindow-funktionen.

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

LÄt oss nu gÄ vidare till den mest intressanta delen.

Eftersom videon Àr en kontinuerlig ström av bildramar, kommer vi att behöva skapa en oÀndlig loop för att oÀndligt lÀsa kamerans videoström. Detta krÀver lÀsmetoden av typen VideoCapture. Den förvÀntar sig en Mat-typ (matrisen vi skapade ovan), som returnerar en boolean som indikerar om en bildruta frÄn VideoCapture lÀstes framgÄngsrikt eller inte.

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

Nu mÄste vi visa ramen i det skapade fönstret. Pausa för att gÄ till nÀsta bildruta - 50 ms.

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

Efter att ha startat programmet öppnas ett fönster med en videoström frÄn kameran.

Bygga ett ansiktsigenkÀ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, lÄt oss anvÀnda det föregÄende exemplet och bygga ett ansiktsigenkÀnningssystem baserat pÄ Haar Cascades.

Haar-kaskader Àr kaskadklassificerare som trÀnas baserat pÄ Haar wavelet-tekniken. De analyserar pixlarna i en bild för att leta efter specifika funktioner. För att lÀra dig mer om Haar Cascades, följ lÀnkarna nedan.

Viola-Jones objektdetektionsramverk
Kaskadklassificerare
Haarliknande funktion

Ladda ner redan trÀnade kaskader kan vara hÀr. I det aktuella exemplet kommer kaskader att anvÀndas för att identifiera en persons ansikte framför.

För att göra detta mÄste du skapa en klassificerare och mata den med en redan trÀnad fil (lÀnken ges ovan). Jag har redan laddat upp filen pencv_haarcascade_frontalface_default.xml till 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 bildruta (av typen Mat) som just har lÀsts frÄn kamerans videoström och returnerar en array av typen Rektangel. Storleken pÄ arrayen representerar antalet ansikten som klassificeraren kunde detektera i ramen. Sedan, för att vara sÀker pÄ att vi ser vad den hittade, lÄt oss iterera genom listan med rektanglar och skriva ut Rectangle-objektet till konsolen och skapa en ram runt den hittade rektangeln. Detta kan göras med hjÀlp av rektangelfunktionen. Det tar mattan som lÀses av kameran, Rectangle-objektet som returneras med DetectMultiScale-metoden och fÀrgen och tjockleken för kanten.

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

Bygga ett ansiktsigenkÀnningssystem baserat pÄ Golang och OpenCV

Bygga ett ansiktsigenkÀ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, allt löste sig! Vi har nu ett enkelt ansiktsigenkÀnningssystem skrivet i Go. Inom en snar framtid planerar jag att fortsÀtta dessa experiment och skapa nya coola saker genom att kombinera Go och OpenCV.

Om du Àr intresserad, vÀnligen betygsÀtt gRPC webbserver, som jag skrev i Python och OpenCV. Den strömmar data sÄ snart ett ansikte upptÀcks. Detta Àr grunden för att skapa olika klienter i olika programmeringssprÄk. De kommer att kunna ansluta till servern och lÀsa data frÄn den.

Tack för att du lÀser artikeln!

Skillbox rekommenderar:

KĂ€lla: will.com

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