Ehitus nĂ€otuvastussĂŒsteemi, mis pĂ”hineb Golangil ja OpenCV-l

Ehitus nĂ€otuvastussĂŒsteemi, mis pĂ”hineb Golangil ja OpenCV-l
OpenCV — teek, mis on vĂ€lja töötatud arvutinĂ€gemise projektide jaoks. Sellel on umbes 20 aastat ajalugu. Olen seda kasutanud juba ĂŒlikoolis ja kasutan endiselt oma projektides C++ ja Pythoniga, kuna sellel on nende keelte jaoks hea tugi.

Kuid kui hakkasin Ă”ppima ja kasutama Go-d, tekkis mul huvi, kas OpenCV-d saab kasutada ka selle keele jaoks. Sel ajal olid juba olemas nĂ€ited ja Ă”petused integreerimiseks, kuid need tundusid mulle liiga keerulised. Hiljem leidsin mĂ€ssumehe, mida oli loonud The Hybrid Group. Selles artiklis nĂ€itan, kuidas alustada GoCV kasutamist, arendades lihtsat nĂ€otuvastussĂŒsteemi Haari kaskaadide abil.

Skillbox soovitab: Praktiline kursus „Python-arendaja nullist“.

Tuletame meelde: kĂ”igile «Habr» lugejatele – 10 000 rubla allahindlus igale Skillboxi kursusele, kasutades sooduskoodi «Habr».

Mida on vaja:

  • Go;
  • OpenCV (link installerile allpool);
  • veebikaamera vĂ”i tavaline videokaamera.

Paigaldamine

NĂ€ide 1

Esimeses nÀites proovime luua rakenduse, mis avab akna kaamera videovoogude demonstreerimiseks.

Esmalt tuleb importida vajalikud teegid.

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

PÀrast seda tuleb luua VideoCapture objekt, kasutades VideoCaptureDevice funktsiooni. Viimane vÔimaldab kaamerast videovoogu haarata. Funktsioonis kasutatakse tÀisarvulist parameetrit (mis tÀhistab seadme ID-d).

webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {    log.Fatalf(“vea avanemine veebikaameraga: %v”, err)
}
defer webcam.Close()

NĂŒĂŒd tuleb luua n-mÔÔtmeline maatriks. See salvestab kaamerast loetud pildid.

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

Videovoogude kuvamiseks tuleb luua aken — seda saab teha funktsiooni NewWindow abil.

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

NĂŒĂŒd liigume kĂ”ige huvitavama osa juurde.

Kuna video on pidev kaadrite voog, peame looma lĂ”pmatu tsĂŒkli, et pidevalt kaamera videovoogu lugeda. Selleks on vajalik VideoCapture tĂŒĂŒpi Read meetod. See ootab Mat tĂŒĂŒpi (maatriks, mille me varem lĂ”ime), tagastades loogilise vÀÀrtuse, mis nĂ€itab, kas kaader VideoCapture-ist loeti edukalt vĂ”i mitte.

for {     
        if ok := webcam.Read(&img); !ok || img.Empty() {
        log.Println(“Kaamerast lugemine ebaĂ”nnestus”)    continue
     }
.
.
.
}

NĂŒĂŒd tuleb kaader luua loodud aknas. Ooteaeg jĂ€rgmise kaadri ĂŒleminekuks on 50 ms.

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

Rakenduse kÀivitamisel avaneb aken kaamera videovooguga.

Ehitus nĂ€otuvastussĂŒsteemi, mis pĂ”hineb Golangil ja OpenCV-l

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 nĂ€otuvastus sĂŒsteemi, mis pĂ”hineb Haar Cascade'idel.

Haar Cascade'id on kaskaadklassifikaatorid, mis on koolitatud Haari lainepikkuse tehnika alusel. Need analĂŒĂŒsivad piksleid pildil, et tuvastada teatud jooni. Lisainformatsiooni jaoks Haar Cascade'ide kohta vaadake allolevaid linke.

Viola-Jones objekti tuvastamise raamistik
Kaskaadklassifikaatorid
Haar'i sarnane tunnus

Laadi alla juba koolitatud kaskaadid saab siit. KÀesolevas nÀites kasutatakse kaskaade inimese nÀo tuvastamiseks otsesuunas.

Selleks tuleb luua klassifikaator ja anda sellele juba koolitatud fail (ĂŒles on antud link). Olen juba ĂŒles laadinud faili opencv_haarcascade_frontalface_default.xml katalooge, kus asub meie programm.

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

NĂ€o tuvastamiseks pildil tuleb kasutada meetodit DetectMultiScale. See funktsioon vĂ”tab kaadri (tĂŒĂŒp Mat), mis on just videovoolust loetud, ja tagastab ristkĂŒliku tĂŒĂŒpi massi. Massi suurus esindab nĂ€gude arvu, mille klassifikaator suutis kaadris tuvastada. SeejĂ€rel, et veenduda, et me nĂ€eme seda, mida ta leidis, vaatame nimekirja ristkĂŒlikutest ja kuvame objekti Rectangle konsoolis, luues piiri tuvastatud ristkĂŒliku ĂŒmber. Seda saab teha funktsiooniga Rectangle. See vĂ”tab vastu Mat'i, mille kaamera loeb, Rectangle objekti, mille tagastas meetod DetectMultiScale, vĂ€rvi ja paksuse piiri jaoks.

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

Ehitus nĂ€otuvastussĂŒsteemi, mis pĂ”hineb Golangil ja OpenCV-l

Ehitus nĂ€otuvastussĂŒsteemi, mis pĂ”hineb Golangil ja OpenCV-l

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

Jah, see toimis! NĂŒĂŒd on meil lihtne nĂ€otuvastussĂŒsteem, mis on kirjutatud Go keeles. Plaanin varsti jĂ€tkata nende katsetustega ja luua uusi Ă€gedaid asju, kombineerides Go-d ja OpenCV-d.

Kui teied huvitab, siis hindage gRPC veebiserver, mille ma kirjutasin Pythoni ja OpenCV abil. See edastab andmeid silmade esmakordsel tuvastamisel. See on alus erinevate klientide loomiseks erinevates programmeerimiskeeltes. Need saavad serveriga ĂŒhendust luua ja sealt andmeid lugeda.

AitÀh, et lugesite artiklit!

Skillbox soovitab:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster