Bouwe in systeem foar gesichtsherkenning basearre op Golang en OpenCV

Bouwe in systeem foar gesichtsherkenning basearre op Golang en OpenCV
OpenCV is in bibleteek ûntwikkele foar kompjûterfisyprojekten. Se is al sa'n 20 jier âld. Ik brûkte it op 'e kolleezje en brûk it noch altyd foar myn C++- en Python-projekten, om't it goede stipe hat foar dy talen.

Mar doe't ik Go begon te learen en te brûken, frege ik my ôf oft OpenCV brûkt wurde koe om mei dizze taal te wurkjen. Der wiene doe al foarbylden en tutorials oer yntegraasje, mar it like my ta dat dy te yngewikkeld wiene. Efkes letter kaam ik in wrapper tsjin makke troch The Hybrid Group. Yn dit artikel sil ik jo sjen litte hoe't jo kinne begjinne mei GoCV troch in ienfâldich gesichtsherkenningssysteem te ûntwikkeljen mei Haar Cascades.

Skillbox advisearret: Praktyske kursus "Python-ûntwikkelder fanôf it begjin".

Wy herinnerje: foar alle lêzers fan "Habr" - in koarting fan 10 roebel by it ynskriuwen fan in Skillbox-kursus mei de promoasjekoade "Habr".

Wat is ferplicht:

  • Gean;
  • OpenCV (keppelings nei ynstallearder hjirûnder);
  • web of gewoane camcorder.

ynstelling

foarbyld 1

Yn it earste foarbyld sille wy besykje in applikaasje te meitsjen dy't in finster iepenet mei in kamera-fideostream.

Earst moatte jo de biblioteken ymportearje dy't jo moatte wurkje.

ymportearje (
"lochboek"
"gocv.io/x/gocv"
)

Dêrnei moatte jo in VideoCapture-objekt oanmeitsje mei de funksje VideoCaptureDevice. Dat lêste makket it mooglik om in fideostream op te nimmen mei in kamera. De funksje nimt in hiel getal as parameter (it stiet foar de apparaat-ID).

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

No moatte wy in n-dimensionale matrix meitsje. It sil de ôfbyldings opslaan dy't lêzen binne fan 'e kamera.

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

Для отображения видеопотока нужно создать окно — это можно сделать с помощью функции NewWindow.

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

No litte wy gean nei it meast nijsgjirrige diel.

Om't de fideo in trochgeande stream fan ôfbyldingsframes is, sille wy in ûneinige lus moatte meitsje om de fideostream fan 'e kamera einleaze te lêzen. Dit fereasket de Read-metoade fan it VideoCapture-type. It sil in Mat-type ferwachtsje (de matriks dy't wy hjirboppe makke hawwe), in boolean weromjaan dy't oanjout oft in frame fan 'e VideoCapture mei súkses lêzen is of net.

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

No moatte wy it frame werjaan yn it oanmakke finster. Pausje om nei it folgjende frame te gean - 50 ms.

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

Nei it starten fan de applikaasje sil in finster iepenje mei in fideostream fan 'e kamera.

Bouwe in systeem foar gesichtsherkenning basearre 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)
}
}

foarbyld 2

В этом примере давайте воспользуемся предыдущим примером и построим систему по распознаванию лиц на основе Haar Cascades (каскады Хаара).

Haar-kaskaden binne cascadearde klassifikaasjes dy't oplaat binne op basis fan 'e Haar wavelet-technyk. Se analysearje de piksels yn in ôfbylding om te sykjen nei spesifike funksjes. Om mear te learen oer Haar Cascades, folgje asjebleaft de links hjirûnder.

Viola-Jones foarwerp detection framework
Cascading klassifikaasjes
Haar-like funksje

Download al oplaat kaskaden kin hjir wêze. Yn it hjoeddeistige foarbyld sille kaskaden brûkt wurde om it gesicht fan in persoan foar te identifisearjen.

Om dit te dwaan, moatte jo in klassifikaasje meitsje en it in al oplaat bestân fiede (de keppeling wurdt hjirboppe jûn). Ik haw it bestân pencv_haarcascade_frontalface_default.xml al opladen nei de map wêr't ús programma leit.

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

Om gesichten yn in ôfbylding te detektearjen, moatte jo de metoade brûke DetectMultiScale. Dizze funksje nimt in frame (fan type Mat) dat krekt is lêzen fan 'e fideostream fan' e kamera en jout in array fan type Rjochthoek werom. De grutte fan 'e array stiet foar it oantal gesichten dat de klassifikaasje koe ûntdekke yn it frame. Dan, om der wis fan te wêzen dat wy sjogge wat it fûn, litte wy iterearje troch de list mei rjochthoeken en printsje it rjochthoeke-objekt nei de konsole, en meitsje in râne om it fûne rjochthoek. Dit kin dien wurde mei de funksje Rjochthoek. It sil de Mat lêze troch de kamera, it rjochthoekobjekt weromjûn troch de DetectMultiScale-metoade, en de kleur en dikte foar de grins.

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

Bouwe in systeem foar gesichtsherkenning basearre op Golang en OpenCV

Bouwe in systeem foar gesichtsherkenning basearre 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 slagge! Wy hawwe no in ienfâldich systeem foar gesichtsherkenning skreaun yn Go. Yn 'e heine takomst plan ik dizze eksperiminten troch te gean en nije koele dingen te meitsjen troch Go en OpenCV te kombinearjen.

As jo ​​ynteressearre binne, please rate gRPC webserver, dy't ik skreau yn Python en OpenCV. It streamt gegevens sa gau as in gesicht wurdt ûntdutsen. Dit is de basis foar it meitsjen fan ferskate kliïnten yn ferskate programmeartalen. Se sille wêze kinne om te ferbinen mei de tsjinner en lêze gegevens út it.

Betanke foar it lêzen fan it artikel!

Skillbox advisearret:

Boarne: www.habr.com

Add a comment