Gina tsarin gane fuska bisa Golang da OpenCV

Gina tsarin gane fuska bisa Golang da OpenCV
OpenCV ɗakin karatu ne da aka haɓaka don ayyukan hangen nesa na kwamfuta. Ta riga ta kai kimanin shekaru 20. Na yi amfani da shi a kwaleji kuma har yanzu ina amfani da shi don ayyukan C++ da Python saboda yana da kyakkyawan tallafi ga waɗannan harsuna.

Amma lokacin da na fara koyo da amfani da Go, na yi mamakin ko za a iya amfani da OpenCV don yin aiki da wannan harshe. A wancan lokacin an riga an sami misalai da koyarwa game da haɗin kai, amma ga alama sun kasance masu rikitarwa. Daga baya kadan, na ci karo da wani abin rufe fuska wanda The Hybrid Group ya kirkira. A cikin wannan labarin, zan nuna muku yadda ake farawa da GoCV ta haɓaka tsarin gano fuska mai sauƙi tare da Haar Cascades.

Skillbox yana ba da shawarar: Hakikanin hanya "Python developer daga karce".

Muna tunatarwa: ga duk masu karatu na "Habr" - rangwame na 10 rubles lokacin yin rajista a kowane kwas na Skillbox ta amfani da lambar talla "Habr".

Abin da ake bukata:

  • Ku tafi;
  • OpenCV (hanyoyi zuwa mai sakawa a ƙasa);
  • yanar gizo ko na camcorder na yau da kullun.

saitin

misali 1

A misali na farko, za mu yi ƙoƙarin ƙirƙirar aikace-aikacen da ke buɗe taga tare da rafi na bidiyo na kyamara.

Da farko kuna buƙatar shigo da dakunan karatu da kuke buƙatar aiki.

shigo da (
"log"
"gocv.io/x/gocv"
)

Bayan haka, kuna buƙatar ƙirƙirar abun VideoCapture ta amfani da aikin VideoCaptureDevice. Ƙarshen yana ba da damar ɗaukar rafin bidiyo ta amfani da kyamara. Aikin yana ɗaukar lamba a matsayin ma'auni (yana wakiltar ID ɗin na'urar).

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

Yanzu muna buƙatar ƙirƙirar matrix n-dimensional. Zai adana hotunan da aka karanta daga kamara.

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

Don nuna rafin bidiyo, kuna buƙatar ƙirƙirar taga - ana iya yin wannan ta amfani da aikin NewWindow.

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

Yanzu bari mu matsa zuwa mafi ban sha'awa bangare.

Tun da bidiyon ci gaba da rafi ne na firam ɗin hoto, za mu buƙaci ƙirƙirar madauki mara iyaka don karanta rafin bidiyo na kamara mara iyaka. Wannan yana buƙatar hanyar karanta nau'in BidiyoCapture. Zai yi tsammanin nau'in Mat (matrix ɗin da muka ƙirƙira a sama), yana dawo da boolean da ke nuna ko an karanta firam daga VideoCapture cikin nasara ko a'a.

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

Yanzu muna buƙatar nuna firam a cikin taga da aka halicce. Dakata don matsawa zuwa firam na gaba - 50 ms.

taga.IMShow(img)
taga.WaitKey(50)

Bayan ƙaddamar da aikace-aikacen, taga mai rafin bidiyo daga kyamara zai buɗe.

Gina tsarin gane fuska bisa Golang da 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)
}
}

misali 2

A cikin wannan misalin, bari mu yi amfani da misalin da ya gabata kuma mu gina tsarin gane fuska bisa Haar Cascades.

Haar cascades ƙwanƙwasa ne waɗanda aka horar da su bisa fasahar Haar wavelet. Suna nazarin pixels a cikin hoto don neman takamaiman fasali. Don ƙarin koyo game da Haar Cascades, da fatan za a bi hanyoyin haɗin da ke ƙasa.

Tsarin gano abu na Viola-Jones
Cascading classifiers
Siffa mai kama da Haar

Zazzage ƙwanƙwasa da aka riga aka horar na iya zama anan. A cikin misalin da ke yanzu, za a yi amfani da tarkace don gano fuskar mutum a gaba.

Don yin wannan, kuna buƙatar ƙirƙirar ƙira kuma ku ciyar da shi fayil ɗin da aka riga aka horar (an ba da hanyar haɗin gwiwa a sama). Na riga na loda fayil ɗin pencv_haarcascade_frontalface_default.xml zuwa kundin adireshi inda shirinmu yake.

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

Don gano fuskoki a cikin hoto, kuna buƙatar amfani da hanyar GaneMultiScale. Wannan aikin yana ɗaukar firam (nau'in Mat) wanda aka karanta yanzu daga rafin bidiyo na kyamara kuma ya dawo da nau'in nau'in Rectangle. Girman jeri yana wakiltar adadin fuskokin da mai rarraba ya iya ganowa a cikin firam ɗin. Bayan haka, don tabbatar da mun ga abin da ya samo, bari mu gwada ta cikin jerin rectangles kuma mu buga abu Rectangle zuwa na'ura mai kwakwalwa, samar da iyaka a kusa da rectangle da aka samo. Ana iya yin wannan ta amfani da aikin Rectangle. Zai ɗauki Mat ɗin da kyamara ta karanta, abu na Rectangle ya dawo da hanyar DetectMultiScale, da launi da kauri don iyakar.

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

Gina tsarin gane fuska bisa Golang da OpenCV

Gina tsarin gane fuska bisa Golang da 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)
}
}

Kuma ... a, duk abin da ya yi aiki! Yanzu muna da tsarin gane fuska mai sauƙi da aka rubuta a cikin Go. Nan gaba kadan, na shirya ci gaba da waɗannan gwaje-gwajen da ƙirƙirar sabbin abubuwa masu daɗi ta hanyar haɗa Go da OpenCV.

Idan kuna sha'awar, da fatan za a kimanta uwar garken gidan yanar gizo gRPC, wanda na rubuta a Python da OpenCV. Yana watsa bayanai da zarar an gano fuska. Wannan shine tushen ƙirƙirar abokan ciniki daban-daban a cikin harsunan shirye-shirye daban-daban. Za su iya haɗawa da uwar garken kuma su karanta bayanai daga gare ta.

Na gode da karanta labarin!

Skillbox yana ba da shawarar:

source: www.habr.com

Add a comment