Bati yon sistèm rekonesans figi ki baze sou Golang ak OpenCV

Bati yon sistèm rekonesans figi ki baze sou Golang ak OpenCV
OpenCV se yon bibliyotèk ki fèt pou pwojè vizyon òdinatè. Li deja gen anviwon 20 an. Mwen te itilize li nan kolèj epi mwen toujou sèvi ak li pou pwojè C++ ak Python mwen yo paske li gen bon sipò pou lang sa yo.

Men, lè mwen te kòmanse aprann ak itilize Go, mwen te vin enterese konnen si OpenCV ta ka itilize pou travay ak lang sa a. Nan epòk sa a, te deja egzanp ak leson patikilye sou entegrasyon, men mwen te sanble ke yo te twò konplike. Yon ti kras pita, mwen te vin atravè yon wrapper kreye pa ekip Hybrid Group la. Nan atik sa a, mwen pral montre w kouman pou w kòmanse ak GoCV lè w devlope yon senp sistèm rekonesans figi ak Haar Cascades.

Skillbox rekòmande: Kou pratik "Python devlopè nan grafouyen".

Nou raple: pou tout lektè "Habr" - yon rabè nan 10 rubles lè w ap enskri nan nenpòt kou Skillbox lè l sèvi avèk kòd pwomosyon "Habr".

Ki sa ki nesesè:

  • Ale;
  • OpenCV (lyen enstale anba a);
  • entènèt oswa kamera videyo regilye.

Enstalasyon

1 Egzanp

Nan premye egzanp lan, nou pral eseye kreye yon aplikasyon ki louvri yon fenèt ki montre yon kouran videyo kamera.

Premye ou bezwen enpòte bibliyotèk ki nesesè pou travay.

enpòte (
"log"
"gocv.io/x/gocv"
)

Apre sa, ou bezwen kreye yon objè VideoCapture lè l sèvi avèk fonksyon VideoCaptureDevice. Lèt la fè li posib pou pran yon kouran videyo lè l sèvi avèk yon kamera. Fonksyon an sèvi ak yon nonb nonb kòm yon paramèt (li reprezante ID aparèy la).

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

Koulye a, nou bezwen kreye yon matris n-dimansyon. Li pral estoke imaj li nan kamera a.

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

Pou montre yon kouran videyo, ou bezwen kreye yon fenèt - sa a ka fè lè l sèvi avèk fonksyon NewWindow.

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

Koulye a, ann ale nan pati ki pi enteresan an.

Depi videyo se yon kouran kontinyèl nan ankadreman imaj, nou pral bezwen kreye yon bouk enfini pou li san rete videyo kouran kamera a. Pou fè sa, ou bezwen metòd Read nan kalite VideoCapture. Li pral atann yon kalite Mat (matris nou te kreye pi wo a), retounen yon valè boolean ki endike si ankadreman an soti nan VideoCapture la te li avèk siksè oswa ou pa.

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

Koulye a, ou bezwen montre ankadreman an nan fenèt la kreye. Pòz la pou deplase nan pwochen ankadreman an se 50 ms.

window.IMShow(img)
fenèt.WaitKey(50)

Apre lanse aplikasyon an, yon fenèt ak yon kouran videyo soti nan kamera a ap louvri.

Bati yon sistèm rekonesans figi ki baze sou Golang ak 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)
}
}

2 Egzanp

Nan egzanp sa a, ann sèvi ak egzanp anvan an epi bati yon sistèm rekonesans figi ki baze sou Haar Cascades.

Kaskad Haar yo se klasifikasyon kaskad ki resevwa fòmasyon lè l sèvi avèk teknik wavelet Haar. Yo analize piksèl yo nan yon imaj pou detekte sèten karakteristik. Pou jwenn plis enfòmasyon sou Haar Cascades, tanpri swiv lyen ki anba yo.

Viola-Jones kad deteksyon objè
Klasifikasyon kaskad
Karakteristik tankou Haar

Telechaje kaskad deja antrene ka isit la. Nan egzanp aktyèl la, kaskad yo pral itilize pou idantifye figi yon moun nan devan an.

Pou fè sa, ou bezwen kreye yon klasifikasyon epi bay li yon fichye ki deja resevwa fòmasyon (yo bay lyen an pi wo a). Mwen deja telechaje fichye pencv_haarcascade_frontalface_default.xml nan anyè kote pwogram nou an ye a.

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

Pou detekte figi nan yon imaj, ou bezwen sèvi ak metòd la DetectMultiScale. Fonksyon sa a pran yon ankadreman (kalite Mat) ki te jis li nan kouran videyo kamera a epi li retounen yon etalaj de kalite Rektang. Gwosè etalaj la reprezante kantite figi ke klasifikasyon an te kapab detekte nan ankadreman an. Lè sa a, pou asire w ke nou wè sa li te jwenn, ann repete nan lis la nan rektang epi enprime objè a Rektang nan konsole a, kreye yon fwontyè alantou rektang detekte a. Sa a ka fè lè l sèvi avèk fonksyon an Rektang. Li pral aksepte Mat li pa kamera a, objè a Rektang ki te retounen pa metòd la DetectMultiScale, koulè a ​​ak epesè pou fwontyè a.

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

Bati yon sistèm rekonesans figi ki baze sou Golang ak OpenCV

Bati yon sistèm rekonesans figi ki baze sou Golang ak 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)
}
}

Epi... wi, tout bagay te mache byen! Kounye a nou gen yon senp sistèm rekonesans vizaj ekri nan Go. Byento mwen planifye pou kontinye eksperyans sa yo ak kreye nouvo bagay fre nan konbine Go ak OpenCV.

Si w enterese, tanpri to sèvè entènèt gRPC, ke mwen te ekri nan Python ak OpenCV. Li difize done nan moman yo detekte yon figi. Sa a se baz pou kreye kliyan diferan nan lang pwogramasyon diferan. Yo pral kapab konekte ak sèvè a epi li done ki soti nan li.

Mèsi paske w li atik la!

Skillbox rekòmande:

Sous: www.habr.com

Achte hosting serye pou sit ki gen pwoteksyon DDoS, sèvè VPS VDS 🔥 Achte yon hébergement sit entènèt serye ak pwoteksyon DDoS, sèvè VPS VDS | ProHoster