Pagtukod ug sistema sa pag-ila sa nawong base sa Golang ug OpenCV

Pagtukod ug sistema sa pag-ila sa nawong base sa Golang ug OpenCV
Ang OpenCV usa ka librarya nga gihimo alang sa mga proyekto sa panan-awon sa kompyuter. Mga 20 anyos na siya. Gigamit nako kini sa kolehiyo ug gigamit gihapon kini alang sa akong C++ ug Python nga mga proyekto tungod kay kini adunay maayong suporta alang sa mga pinulongan.

Apan sa dihang nagsugod ko sa pagkat-on ug paggamit sa Go, naghunahuna ko kon ang OpenCV magamit ba sa pagtrabaho niini nga pinulongan. Nianang panahona aduna nay mga pananglitan ug mga panudlo sa paghiusa, apan alang kanako kini komplikado kaayo. Wala madugay, nakit-an nako ang usa ka wrapper nga gihimo sa The Hybrid Group. Sa kini nga artikulo, ipakita ko kanimo kung giunsa pagsugod ang GoCV pinaagi sa paghimo usa ka yano nga sistema sa pag-ila sa nawong gamit ang Haar Cascades.

Girekomenda sa Skillbox: Praktikal nga kurso "Python developer gikan sa scratch".

Gipahinumduman namon ikaw: alang sa tanan nga mga magbabasa sa "Habr" - usa ka diskwento sa 10 nga mga rubles kung nagpalista sa bisan unsang kurso sa Skillbox gamit ang code sa promosyon nga "Habr".

Unsa ang gikinahanglan:

  • Lakaw;
  • OpenCV (mga link sa installer sa ubos);
  • web o regular nga camcorder.

Pag-instalar

sa panig-ingnan 1

Sa una nga pananglitan, sulayan namon ang paghimo usa ka aplikasyon nga nagbukas sa usa ka bintana nga adunay stream sa video sa camera.

Una kinahanglan nimo nga i-import ang mga librarya nga kinahanglan nimo nga pagtrabaho.

import (
"log"
"gocv.io/x/gocv"
)

Pagkahuman niana, kinahanglan nimo nga maghimo usa ka butang nga VideoCapture gamit ang function sa VideoCaptureDevice. Ang ulahi nagpaposible sa pagkuha sa usa ka video stream gamit ang usa ka camera. Ang function nagkinahanglan og integer isip parameter (kini nagrepresentar sa device ID).

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

Karon kinahanglan namong maghimo ug n-dimensional matrix. Itago niini ang mga imahe nga gibasa gikan sa camera.

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

Aron ipakita ang video stream, kinahanglan nimo nga maghimo usa ka bintana - mahimo kini gamit ang function sa NewWindow.

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

Karon magpadayon kita sa labing makapaikag nga bahin.

Tungod kay ang video usa ka padayon nga stream sa mga frame sa imahe, kinahanglan namon nga maghimo usa ka walay katapusan nga loop aron walay katapusan nga mabasa ang video stream sa camera. Kini nagkinahanglan sa Basahon nga paagi sa VideoCapture matang. Magdahom kini nga usa ka Mat type (ang matrix nga among gibuhat sa ibabaw), nga nagbalik ug boolean nga nagpaila kung ang usa ka frame gikan sa VideoCapture malampuson nga nabasa o wala.

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

Karon kinahanglan natong ipakita ang frame sa gibuhat nga bintana. Paghunong aron mobalhin sa sunod nga frame - 50 ms.

bintana.IMShow(img)
bintana.WaitKey(50)

Pagkahuman sa paglansad sa aplikasyon, usa ka bintana nga adunay usa ka stream sa video gikan sa camera maablihan.

Pagtukod ug sistema sa pag-ila sa nawong base sa Golang ug 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)
}
}

sa panig-ingnan 2

Sa kini nga pananglitan, atong gamiton ang miaging pananglitan ug maghimo usa ka sistema sa pag-ila sa nawong base sa Haar Cascades.

Ang Haar cascades kay mga cascaded classifiers nga gibansay base sa Haar wavelet technique. Gi-analisar nila ang mga pixel sa usa ka imahe aron pangitaon ang piho nga mga bahin. Aron mahibal-an ang dugang bahin sa Haar Cascades, palihug sunda ang mga link sa ubos.

Viola-Jones object detection framework
Mga klasipikasyon sa Cascading
Haar-sama nga bahin

I-download ang nabansay na nga mga kaskad posible kini dinhi. Sa kasamtangan nga pananglitan, ang mga kaskad gamiton aron mailhan ang nawong sa usa ka tawo sa atubangan.

Aron mahimo kini, kinahanglan nimo nga maghimo usa ka classifier ug pakan-a kini usa ka nabansay na nga file (ang link gihatag sa ibabaw). Na-upload na nako ang pencv_haarcascade_frontalface_default.xml file sa direktoryo diin nahimutang ang among programa.

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

Aron makit-an ang mga nawong sa usa ka imahe, kinahanglan nimo nga gamiton ang pamaagi DetectMultiScale. Kini nga function nagkinahanglan og frame (sa tipo nga Mat) nga bag-o lang nabasa gikan sa video stream sa camera ug nagbalik sa usa ka han-ay sa tipo nga Rectangle. Ang gidak-on sa array nagrepresentar sa gidaghanon sa mga nawong nga ang classifier nakahimo sa pag-ila sa frame. Dayon, aron masiguro nga makita nato kung unsa ang nakit-an niini, atong balikon ang listahan sa mga rectangle ug i-print ang Rectangle nga butang ngadto sa console, paghimo og utlanan sa palibot sa nakit-an nga rectangle. Mahimo kini gamit ang Rectangle function. Kuhaon niini ang Mat nga gibasa sa camera, ang Rectangle nga butang nga gibalik sa DetectMultiScale nga pamaagi, ug ang kolor ug gibag-on alang sa utlanan.

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

Pagtukod ug sistema sa pag-ila sa nawong base sa Golang ug OpenCV

Pagtukod ug sistema sa pag-ila sa nawong base sa Golang ug 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)
}
}

Ug ... oo, ang tanan nagtrabaho! Naa na miy simple nga face recognition system nga gisulat sa Go. Sa umaabot nga umaabot, plano nako nga ipadayon kini nga mga eksperimento ug maghimo bag-ong mga cool nga butang pinaagi sa paghiusa sa Go ug OpenCV.

Kung interesado ka, palihug rate gRPC web server, nga akong gisulat sa Python ug OpenCV. Nag-stream kini sa datos sa diha nga ang usa ka nawong nakit-an. Kini ang sukaranan sa paghimo sa lainlaing mga kliyente sa lainlaing mga sinultian nga programming. Makakonektar sila sa server ug makabasa sa datos gikan niini.

Salamat sa pagbasa sa artikulo!

Girekomenda sa Skillbox:

Source: www.habr.com

Idugang sa usa ka comment