
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 .
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
- Linux:
- macOS:
- Windows:
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.

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.
Laadige alla juba koolitatud kaskaadid . 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 . 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)
} 

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 , 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:
- Kaheaastane praktiline kursus .
- Hariv veebikursus .
- Praktilise aasta kursus .
Allikas: www.habr.com
