Ukwakha isistimu yokubona ubuso esekelwe ku-Golang ne-OpenCV

Ukwakha isistimu yokubona ubuso esekelwe ku-Golang ne-OpenCV
I-OpenCV iwumtapo wolwazi oklanyelwe amaphrojekthi ombono wekhompyutha. Useneminyaka engaba ngu-20. Ngayisebenzisa ekolishi futhi ngisayisebenzisela amaphrojekthi wami we-C++ kanye nePython ngoba inokusekelwa okuhle kwalezo zilimi.

Kodwa lapho ngiqala ukufunda nokusebenzisa i-Go, ngaba nentshisekelo yokuthi i-OpenCV ingasetshenziswa yini ukusebenza ngalolu limi. Ngaleso sikhathi, kwase kunezibonelo kanye nezifundo zokuhlanganisa, kodwa kwakubonakala sengathi zaziyinkimbinkimbi kakhulu. Kamuva, ngahlangana ne-wrapper eyakhiwe ithimba le-The Hybrid Group. Kulesi sihloko, ngizokukhombisa ukuthi ungaqala kanjani nge-GoCV ngokwakha uhlelo olulula lokuqaphela ubuso nge-Haar Cascades.

I-Skillbox iyancoma: Isifundo esiwusizo "Python developer kusukela ekuqaleni".

Siyakukhumbuza: kubo bonke abafundi be-"Habr" - isaphulelo sama-ruble angu-10 lapho ubhalisa kunoma yisiphi isifundo se-Skillbox usebenzisa ikhodi yephromoshini ethi "Habr".

Okudingayo:

  • Hamba;
  • OpenCV (izixhumanisi zesifaki ngezansi);
  • iwebhu noma ikhamera yevidiyo evamile.

setting

Isibonelo se-1

Esibonelweni sokuqala, sizozama ukudala uhlelo lokusebenza oluvula iwindi elibonisa ukusakazwa kwevidiyo yekhamera.

Okokuqala udinga ukungenisa imitapo yolwazi edingekayo emsebenzini.

ngenisa (
"log"
“gocv.io/x/gocv”
)

Ngemuva kwalokhu, udinga ukudala into ye-VideoCapture usebenzisa umsebenzi we-VideoCaptureDevice. Lokhu kwakamuva kwenza kube nokwenzeka ukuthwebula ukusakazwa kwevidiyo kusetshenziswa ikhamera. Umsebenzi usebenzisa inombolo ephelele njengepharamitha (imele i-ID yedivayisi).

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

Manje sidinga ukudala i-matrix engu-n-dimensional. Izogcina izithombe ezifundwa kukhamera.

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

Ukuze ubonise ukusakazwa kwevidiyo, udinga ukwakha iwindi - lokhu kungenziwa ngokusebenzisa umsebenzi we-NewWindow.

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

Manje ake siqhubekele engxenyeni ethakazelisa kakhulu.

Njengoba ividiyo iwukusakazwa okuqhubekayo kwamafreyimu ezithombe, sizodinga ukudala iluphu engapheli ukuze sifunde ngokungapheli ukusakaza kwevidiyo yekhamera. Ukuze wenze lokhu, udinga indlela yokufunda yohlobo lwe-VideoCapture. Izolindela uhlobo lwe-Mat (i-matrix esiyidalile ngenhla), ukubuyisela inani le-boolean elibonisa ukuthi uhlaka olusuka ku-VideoCapture lufundwe ngempumelelo noma cha.

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

Manje udinga ukukhombisa ifreyimu efasiteleni elidaliwe. Ikhefu lokuya kuhlaka olulandelayo ngu-50 ms.

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

Ngemva kokwethula uhlelo, iwindi elinokusakaza kwevidiyo elivela kukhamera lizovuleka.

Ukwakha isistimu yokubona ubuso esekelwe ku-Golang ne-OpenCV

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

Isibonelo se-2

Kulesi sibonelo, masisebenzise isibonelo sangaphambilini futhi sakhe isistimu yokuqaphela ubuso ngokusekelwe ku-Haar Cascades.

I-Haar cascades izigaba ze-cascade eziqeqeshwe kusetshenziswa indlela ye-Haar wavelet. Bahlaziya amaphikseli esithombeni ukuze bathole izici ezithile. Ukuze uthole okwengeziwe nge-Haar Cascades, sicela ulandele izixhumanisi ezingezansi.

Uhlaka lokutholwa kwento ye-Viola-Jones
I-Cascading classifiers
Isici esifana ne-haar

Landa ama-cascade asevele aqeqeshiwe kungaba lapha. Esibonelweni samanje, ama-cascade azosetshenziswa ukukhomba ubuso bomuntu kusukela ngaphambili.

Ukuze wenze lokhu, udinga ukwakha isihlukanisi futhi usinikeze ifayela eliqeqeshiwe kakade (isixhumanisi sinikezwe ngenhla). Sengivele ngililayishile ifayela le-pencv_haarcascade_frontalface_default.xml kumkhombandlela lapho uhlelo lwethu lukhona.

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

Ukuze uthole ubuso esithombeni, udinga ukusebenzisa indlela I-DetectMultiScale. Lo msebenzi uthatha ifremu (uhlobo lwe-Mat) esanda kufundwa ekusakazweni kwevidiyo yekhamera bese ibuyisela uhlu lohlobo lukanxande. Usayizi wamalungu afanayo umelela inombolo yobuso umdidiyeli akwazile ukubuthola kuhlaka. Bese, ukuze siqiniseke ukuthi siyabona ukuthi yini ekutholile, ake siphindaphinde ohlwini lonxande futhi siphrinte into engunxande kukhonsoli, senze umngcele ozungeza unxande otholiwe. Lokhu kungenziwa kusetshenziswa umsebenzi we-Rectangle. Izokwamukela i-Mat efundwe yikhamera, into engunxande ebuyiselwe indlela ye-DetectMultiScale, umbala nokujiya komngcele.

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

Ukwakha isistimu yokubona ubuso esekelwe ku-Golang ne-OpenCV

Ukwakha isistimu yokubona ubuso esekelwe ku-Golang ne-OpenCV

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

Futhi... yebo, konke kwaphumelela! Manje sinesistimu elula yokubona ubuso ebhalwe kokuthi Go. Maduze ngihlela ukuqhubeka nalezi zivivinyo futhi ngidale izinto ezintsha ezinhle ngokuhlanganisa i-Go ne-OpenCV.

Uma unentshisekelo, sicela ukale Iseva yewebhu ye-gRPC, engibhale ku-Python naku-OpenCV. Isakaza idatha lapho ubuso butholwa khona. Lesi isisekelo sokudala amaklayenti ahlukene ngezilimi ezahlukene zokuhlela. Bazokwazi ukuxhuma kuseva futhi bafunde idatha kuyo.

Ngiyabonga ngokufunda lesi sihloko!

I-Skillbox iyancoma:

Source: www.habr.com

Engeza amazwana