Avakirina pergalek nasîna rûyê ku li ser bingeha Golang û OpenCV-ê ye

Avakirina pergalek nasîna rûyê ku li ser bingeha Golang û OpenCV-ê ye
OpenCV pirtûkxaneyek e ku ji bo projeyên dîtina komputerê hatî çêkirin. Ew jixwe nêzîkî 20 salî ye. Min ew li zanîngehê bikar anî û hîn jî ji bo projeyên xwe yên C++ û Python bikar tîne ji ber ku ji bo wan zimanan piştgirîyek baş heye.

Lê gava ku min dest bi fêrbûn û karanîna Go kir, min eleqedar kir ka OpenCV dikare ji bo xebatê bi vî zimanî were bikar anîn. Wê demê, jixwe mînak û dersên entegrasyonê hebûn, lê ji min re xuya bû ku ew pir tevlihev bûn. Demek şûnda, ez rastî pêçekek hatim ku ji hêla tîmê Koma Hybrid ve hatî afirandin. Di vê gotarê de, ez ê nîşanî we bidim ka meriv çawa dest bi GoCV-ê bi pêşxistina pergalek nasîna rûyê hêsan a bi Haar Cascades re dike.

Skillbox pêşniyar dike: Kursa pratîk "Pêşvebirê Python ji sifirê".

Em bînin bîra xwe: ji bo hemî xwendevanên "Habr" - dema ku hûn beşdarî qursek Skillbox-ê bi karanîna koda danasînê ya "Habr" têne qeyd kirin 10 rubleyan dakêşin.

Çi hewce ye:

  • Çûyin;
  • OpenCV (girêdanên sazkerê li jêr);
  • web an kameraya vîdyoyê ya birêkûpêk.

mîhengê

nimûne 1

Di mînaka yekem de, em ê hewl bidin ku serîlêdanek biafirînin ku pencereyek vedike ku vîdyoyek kamerayê nîşan dide.

Pêşî hûn hewce ne ku pirtûkxaneyên ku ji bo xebatê hewce ne îtxal bikin.

anîn(
"rojname"
"gocv.io/x/gocv"
)

Piştî vê yekê, hûn hewce ne ku bi karanîna fonksiyona VideoCaptureDevice ve tiştek VideoCapture biafirînin. Ya paşîn gengaz dike ku meriv bi kamerayek vîdyoyek vîdyoyê bigire. Fonksîyonek yekjimar wekî pîvanek bikar tîne (ew nasnameya cîhazê temsîl dike).

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

Naha divê em matrixek n-alî biafirînin. Ew ê wêneyên ku ji kamerayê hatine xwendin hilîne.

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

Ji bo xuyangkirina vîdyoyek vîdyoyê, hûn hewce ne ku pencereyek biafirînin - ev dikare bi karanîna fonksiyona NewWindow were kirin.

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

Niha em werin ser beşa herî balkêş.

Ji ber ku vîdyoyê herikînek domdar a çarçoveyên wêneyan e, em ê hewce ne ku pêlekek bêdawî biafirînin da ku bêdawî weşana vîdyoya kamerayê bixwînin. Ji bo vê yekê, hûn hewceyê rêbaza Read ya cureyê VideoCapture hewce ne. Ew ê li bendê be ku celebek Mat (matrixa ku me li jor afirandiye), nirxek boolean vegerîne ku destnîşan dike ka çarçoveyek ji VideoCapture bi serfirazî hate xwendin an na.

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

Naha hûn hewce ne ku çarçovê di pencereya çêkirî de nîşan bidin. Rawestandina ji bo çûyîna çarçoweya din 50 ms e.

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

Piştî destpêkirina serîlêdanê, dê pencereyek bi vîdyoyek ji kamerayê vebe.

Avakirina pergalek nasîna rûyê ku li ser bingeha Golang û OpenCV-ê ye

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

nimûne 2

Di vê nimûneyê de, em mînaka berê bikar bînin û li ser bingeha Haar Cascades pergalek nasîna rû ava bikin.

Kaskadên Haar dabeşkerên kaskadê ne ku bi teknîka pêlên Haar-ê têne perwerde kirin. Ew pixelên di wêneyekê de analîz dikin da ku hin taybetmendiyan nas bikin. Ji bo bêtir agahdarî li ser Haar Cascades, ji kerema xwe lînkên jêrîn bişopînin.

Çarçoveya tespîtkirina objeyê ya Viola-Jones
Tesnîfkerên Cascading
Taybetmendiya mîna Haar

Kaskadên jixwe perwerdekirî dakêşin dikarin li vir bin. Di mînaka heyî de, kaskadan dê werin bikar anîn da ku rûyê kesek ji pêş de nas bikin.

Ji bo ku hûn vê yekê bikin, hûn hewce ne ku dabeşkerek biafirînin û pelek jixwe perwerdekirî jê re têr bikin (girêdan li jor tê dayîn). Min berê pelê pencv_haarcascade_frontalface_default.xml li pelrêça ku bernameya me lê ye barkiriye.

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

Ji bo tespîtkirina rûyên di wêneyekê de, hûn hewce ne ku rêbazê bikar bînin DetectMultiScale. Vê fonksiyonê çarçoveyek (type Mat) ku tenê ji weşana vîdyoya kamerayê hatî xwendin digire û komek ji celebê Rectangle vedigerîne. Mezinahiya array hejmara rûyên ku dabeşker karîbû di çarçovê de bibîne destnîşan dike. Dûv re, ji bo ku em pê bawer bin ka ew çi dîtiye, em di nav navnîşa çargoşeyan de dubare bikin û tiştek Rectangle li ser konsolê çap bikin, li dora çargoşeya hatî tespîtkirin sînorek çêbikin. Ev dikare bi karanîna fonksiyona Rectangle were kirin. Ew ê Matê ku ji hêla kamerayê ve hatî xwendin, tişta Rectangle ya ku bi rêbaza DetectMultiScale ve hatî vegerandin, reng û qalindahiya sînor qebûl bike.

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

Avakirina pergalek nasîna rûyê ku li ser bingeha Golang û OpenCV-ê ye

Avakirina pergalek nasîna rûyê ku li ser bingeha Golang û OpenCV-ê ye

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

Û... erê, her tişt derket! Naha me pergalek nasîna rûyê hêsan a li Go-yê hatî nivîsandin heye. Di nêzîk de ez plan dikim ku van ceribandinan bidomînim û bi tevlihevkirina Go û OpenCV-ê tiştên nû yên xweş biafirînim.

Ger bala we dikişîne, ji kerema xwe binirxînin servera malperê gRPC, ku min di Python û OpenCV de nivîsand. Dema ku rûyek tê dîtin ew daneyan diherike. Ev bingeh ji bo afirandina xerîdarên cihêreng ên di zimanên bernamesaziyê yên cihêreng de ye. Ew ê karibin bi serverê ve girêbidin û daneyan jê bixwînin.

Spas ji bo xwendina gotarê!

Skillbox pêşniyar dike:

Source: www.habr.com

Add a comment