
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 .
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
- Linux:
- macOS 15 all on rakendatud uusi ekraani- ja akna jagamise valikufunktsioone. macOS 14 tugi lisatakse hiljem.
- Windows:
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.

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

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 , 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:
- Kaks aastat praktilist kursust .
- Haridusalane veebikursus .
- Praktiline aastakursus .
Allikas: habr.com
