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

Ostke DDoS-kaitsega saitide jaoks usaldusvÀÀrne hostimine, VPS VDS-serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega, VPS VDS serverid | ProHoster