Dhisida nidaamka aqoonsiga wajiga oo ku salaysan Golang iyo OpenCV

Dhisida nidaamka aqoonsiga wajiga oo ku salaysan Golang iyo OpenCV
OpenCV waa maktabad loogu talagalay mashaariicda aragga kombiyuutarka. Durba waa ilaa 20 jir. Waxaan u isticmaalay kuleejka oo wali waxaan u isticmaalayaa mashaariicdayda C++ iyo Python sababtoo ah waxay taageero fiican u haysaa luqadahaas.

Laakiin markii aan bilaabay barashada iyo adeegsiga Go, waxaan xiisaynayay in OpenCV loo isticmaali karo in lagu shaqeeyo luuqadan. Waqtigaas, waxaa hore u jiray tusaalayaal iyo casharro ku saabsan isdhexgalka, laakiin waxay ii muuqatay inay aad u adag yihiin. Wax yar ka dib, waxaan la kulmay duubo ay sameeyeen kooxda Hybrid Group. Maqaalkan, waxaan ku tusi doonaa sida loo bilaabo GoCV adoo horumarinaya nidaam aqoonsi waji fudud oo leh Haar Cascades.

Skillbox waxay ku talinaysaa: Koorso wax ku ool ah "Horumariyaha Python meel eber ah".

Waxaan xusuusineynaa: dhammaan akhristayaasha "Habr" - qiimo dhimis ah 10 rubles marka la qorayo koorso kasta oo Skillbox ah iyadoo la adeegsanayo koodhka xayeysiinta "Habr".

Waxa loo baahan yahay:

  • Tag;
  • OpenCV (ku xidhidhiyeyaasha hoose);
  • web ama kamarad muuqaal caadi ah.

Ku rakibida

tusaale ahaan 1

Tusaalaha ugu horreeya, waxaan isku dayi doonaa inaan abuurno codsi furaya daaqad muujinaya qulqulka muuqaalka kamarada.

Marka hore waxaad u baahan tahay inaad soo dejiso maktabadaha shaqada looga baahan yahay.

soo dejin (
"log"
"gocv.io/x/gocv"
)

Taas ka dib, waxaad u baahan tahay inaad abuurto shay VideoCapture adoo isticmaalaya shaqada VideoCaptureDevice. Midda dambe waxay suurtogal ka dhigaysaa in la qabto muuqaal muuqaal ah iyadoo la isticmaalayo kamarad. Shaqadu waxay isticmaashaa halbeeg ahaan halbeeg ahaan (waxay u taagan tahay aqoonsiga aaladda).

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

Hadda waxaan u baahanahay inaan abuurno matrix n-cabbir ah. Waxay kaydin doontaa sawirada laga akhriyay kamarada.

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

Si aad u muujiso qulqulka fiidiyowga, waxaad u baahan tahay inaad abuurto daaqad - tan waxaa lagu samayn karaa iyadoo la adeegsanayo shaqada NewWindow.

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

Hadda aan u gudubno qaybta ugu xiisaha badan.

Mar haddii fiidyowgu yahay socod joogto ah oo muuqaallo muuqaal ah, waxaan u baahan doonnaa inaan abuurno wareeg aan dhammaad lahayn si aan dhammaadka lahayn u akhrino qulqulka fiidyaha ee kamaradda. Si tan loo sameeyo, waxaad u baahan tahay habka Akhriska ee nooca VideoCapture. Waxay filan doontaa nooca Mat (matrix-ka aan kor ku abuurnay), soo celinta qiimaha boolean-ka oo muujinaya in qaab-dhismeedka VideoCapture si guul leh loo akhriyay iyo in kale.

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

Hadda waxaad u baahan tahay inaad ku muujiso jir daaqadda la abuuray. Hakinta u dhaqaaqida jir ka xiga waa 50 ms.

daaqada.IMShow(img)
daaqada.WaitKey(50)

Ka dib markii la bilaabay codsiga, daaqad leh muuqaal fiidiyoow ah oo kaamerada ayaa furmi doona.

Dhisida nidaamka aqoonsiga wajiga oo ku salaysan Golang iyo 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)
}
}

tusaale ahaan 2

Tusaalahan, aynu isticmaalno tusaalihii hore oo aynu dhisno nidaamka aqoonsiga wajiga oo ku salaysan Haar Cascades.

Haar cascades waa kala-soocida cascade kuwaas oo lagu tababaray farsamada mawjadaha Haar. Waxay falanqeeyaan pixels-ka sawirka si ay u ogaadaan sifooyinka qaarkood. Si aad wax badan uga ogaato Haar Cascades, fadlan raac xiriirka hoose.

Viola-Jones qaabka ogaanshaha shayga
Kalasaarayaasha cascading
Haar u eg

Soo deji kascades hore u tababaran halkaan joogi karaa. Tusaalaha hadda jira, cascades ayaa loo isticmaali doonaa in lagu garto wejiga qofka xagga hore.

Si tan loo sameeyo, waxaad u baahan tahay inaad abuurto kala-saare oo aad ku quudiso fayl hore loo tababaray (xidhiidhka ayaa kor lagu sheegay). Waxaan horey u soo galiyay faylka pencv_haarcascade_frontalface_default.xml tusaha uu barnaamijkeenu ku yaalo.

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

Si loo ogaado wejiyada sawirka, waxaad u baahan tahay inaad isticmaasho habka DetectMultiScale. Hawshani waxay qaadanaysaa firam (nooca Mat) kaas oo hadda laga akhriyay qulqulka fiidyaha ee kamarada oo soo celinaysa noocyo kala duwan oo leydi ah. Cabbirka habayntu waxa uu ka dhigan yahay tirada weji ee kala soociyuhu uu awooday in uu ku ogaado qaabka. Dabadeed, si aan u hubinno inaan aragno waxa ay heshay, aan ku celcelinno liiska leydiyada oo aan ku daabacno shayga leydiga ah konsole-ka, anagoo abuurayna soohdin ku wareegsan leydi la ogaaday. Tan waxaa lagu samayn karaa iyadoo la isticmaalayo shaqada leydi. Waxay aqbali doontaa Mat ay kaamiradu akhrido, shayga leydiga ah ee lagu soo celiyay habka DetectMultiScale, midabka iyo dhumucda xadka.

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

Dhisida nidaamka aqoonsiga wajiga oo ku salaysan Golang iyo OpenCV

Dhisida nidaamka aqoonsiga wajiga oo ku salaysan Golang iyo 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)
}
}

Oo... haa, wax walba way shaqeeyeen! Hadda waxaan haynaa hab fudud oo lagu aqoonsan karo wajiga oo ku qoran Go. Mar dhow waxaan qorsheynayaa inaan sii wado tijaabooyinkan oo aan abuuro waxyaabo cusub oo wanaagsan aniga oo isku daraya Go iyo OpenCV.

Haddii aad xiisaynayso, fadlan qiimee gRPC server-ka, oo aan ku qoray Python iyo OpenCV. Waxay soo gudbisaa xogta marka wejiga la ogaado. Tani waa aasaaska abuurista macaamiil kala duwan oo ku hadla luqadaha barnaamijyada kala duwan. Waxay awoodi doonaan inay ku xidhmaan server-ka oo ay akhriyaan xogta.

Waad ku mahadsan tahay akhrinta maqaalka!

Skillbox waxay ku talinaysaa:

Source: www.habr.com

Add a comment