Golangil ja OpenCV-l põhineva näotuvastussüsteemi loomine

Golangil ja OpenCV-l põhineva näotuvastussüsteemi loomine
OpenCV on arvutinägemisprojektide jaoks loodud raamatukogu. Ta on juba umbes 20-aastane. Ma kasutasin seda kolledžis ja kasutan seda endiselt oma C++ ja Pythoni projektide jaoks, kuna sellel on nende keelte jaoks hea tugi.

Aga kui hakkasin Go-d õppima ja kasutama, tekkis mul huvi, kas OpenCV-d saab selle keelega töötamiseks kasutada. Tol ajal oli juba näiteid ja õpetusi lõimumisest, aga mulle tundus, et need olid liiga keerulised. Veidi hiljem sattus mulle The Hybrid Groupi meeskonna loodud ümbris. Selles artiklis näitan teile, kuidas alustada GoCV-ga, töötades välja lihtsa näotuvastussüsteemi Haar Cascades'iga.

Skillbox soovitab: Praktiline kursus "Pythoni arendaja nullist".

Tuletame meelde: kõigile "Habr" lugejatele - allahindlus 10 000 rubla, kui registreerute mis tahes Skillboxi kursusele, kasutades sooduskoodi "Habr".

Mis on vajalik:

  • Mine;
  • OpenCV (installeri lingid allpool);
  • veebi- või tavaline videokaamera.

Paigaldamine

Näide 1

Esimeses näites proovime luua rakendust, mis avab akna, mis näitab kaamera videovoogu.

Kõigepealt tuleb importida tööks vajalikud teegid.

import (
"logi"
"gocv.io/x/gocv"
)

Pärast seda peate funktsiooni VideoCaptureDevice abil looma VideoCapture'i objekti. Viimane võimaldab kaamera abil videovoogu jäädvustada. Funktsioon kasutab parameetrina täisarvu (see tähistab seadme ID-d).

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

Nüüd peame looma n-mõõtmelise maatriksi. See salvestab kaamerast loetud pildid.

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

Videovoo kuvamiseks tuleb luua aken – seda saab teha funktsiooni NewWindow abil.

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

Liigume nüüd kõige huvitavama osa juurde.

Kuna video on pidev pildikaadrite voog, peame kaamera videovoo lõputuks lugemiseks looma lõpmatu tsükli. Selleks vajate VideoCapture tüüpi lugemismeetodit. See eeldab Mat-tüüpi (maatriks, mille me ülal lõime), tagastades tõeväärtuse, mis näitab, kas VideoCapture'i kaadri lugemine õnnestus või mitte.

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

Nüüd peate loodud aknas raami kuvama. Järgmise kaadri juurde liikumise paus on 50 ms.

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

Pärast rakenduse käivitamist avaneb kaamera videovooga aken.

Golangil ja OpenCV-l põhineva näotuvastussüsteemi loomine

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

Näide 2

Selles näites kasutame eelmist näidet ja ehitame Haar Cascades baasil näotuvastussüsteemi.

Haari kaskaadid on kaskaadiklassifikaatorid, mida treenitakse Haari laineti tehnikat kasutades. Teatud funktsioonide tuvastamiseks analüüsivad nad pildi piksleid. Haar Cascadesi kohta lisateabe saamiseks järgige allolevaid linke.

Viola-Jonesi objektide tuvastamise raamistik
Kaskaadklassifikaatorid
Haari moodi omadus

Laadige alla juba koolitatud kaskaadid võib olla siin. Praeguses näites kasutatakse inimese näo tuvastamiseks eestpoolt kaskaade.

Selleks peate looma klassifikaatori ja söötma sellele juba koolitatud faili (link on toodud ülal). Olen faili pencv_haarcascade_frontalface_default.xml juba üles laadinud kataloogi, kus meie programm asub.

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

Pildil nägude tuvastamiseks peate kasutama meetodit DetectMultiScale. See funktsioon võtab kaadri (tüüp Mat), mis loeti just kaamera videovoost, ja tagastab massiivi, mille tüüp on Ristkülik. Massiivi suurus tähistab nägude arvu, mille klassifikaator suutis kaadris tuvastada. Seejärel veendumaks, et näeksime, mida see leidis, korrakem läbi ristkülikute loendi ja printige objekt Rectangle konsooli, luues tuvastatud ristküliku ümber äärise. Seda saab teha funktsiooniga Ristkülik. See aktsepteerib kaamera loetud matti, DetectMultiScale meetodil tagastatud ristkülikuobjekti, äärise värvi ja paksust.

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

Golangil ja OpenCV-l põhineva näotuvastussüsteemi loomine

Golangil ja OpenCV-l põhineva näotuvastussüsteemi loomine

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... jah, kõik läks korda! Meil on nüüd Go-sse kirjutatud lihtne näotuvastussüsteem. Varsti kavatsen neid katseid jätkata ja Go ja OpenCV kombineerimise teel uusi ägedaid asju luua.

Kui olete huvitatud, andke hinnang gRPC veebiserver, mille kirjutasin Pythonis ja OpenCV-s. See voogesitab andmeid kohe, kui nägu tuvastatakse. See on aluseks erinevate klientide loomiseks erinevates programmeerimiskeeltes. Nad saavad serveriga ühenduse luua ja sealt andmeid lugeda.

Täname, et lugesite artiklit!

Skillbox soovitab:

Allikas: www.habr.com

Lisa kommentaar