Kuunda mfumo wa utambuzi wa uso kulingana na Golang na OpenCV

Kuunda mfumo wa utambuzi wa uso kulingana na Golang na OpenCV
OpenCV ni maktaba iliyoundwa kwa ajili ya miradi ya maono ya kompyuta. Tayari ana miaka 20 hivi. Niliitumia chuoni na bado ninaitumia kwa miradi yangu ya C++ na Python kwa sababu ina msaada mzuri kwa lugha hizo.

Lakini nilipoanza kujifunza na kutumia Go, nilivutiwa kujua ikiwa OpenCV inaweza kutumika kufanya kazi na lugha hii. Wakati huo, tayari kulikuwa na mifano na mafunzo juu ya ushirikiano, lakini ilionekana kwangu kuwa walikuwa ngumu sana. Baadaye kidogo, nilikutana na karatasi iliyoundwa na timu ya The Hybrid Group. Katika makala haya, nitakuonyesha jinsi ya kuanza na GoCV kwa kutengeneza mfumo rahisi wa utambuzi wa uso na Haar Cascades.

Skillbox inapendekeza: Kozi ya vitendo "Mtengenezaji wa chatu kutoka mwanzo".

Tunakukumbusha: kwa wasomaji wote wa "Habr" - punguzo la rubles 10 wakati wa kujiandikisha katika kozi yoyote ya Skillbox kwa kutumia msimbo wa uendelezaji wa "Habr".

Inahitajika nini:

  • Nenda;
  • OpenCV (viungo vya kisakinishi hapa chini);
  • mtandao au kamera ya video ya kawaida.

Ufungaji

mfano 1

Katika mfano wa kwanza, tutajaribu kuunda programu inayofungua dirisha inayoonyesha mkondo wa video ya kamera.

Kwanza unahitaji kuagiza maktaba zinazohitajika kwa kazi.

kuagiza (
"logi"
"gocv.io/x/gocv"
)

Baada ya hayo, unahitaji kuunda kitu cha VideoCapture kwa kutumia kazi ya VideoCaptureDevice. Mwisho hufanya uwezekano wa kunasa mkondo wa video kwa kutumia kamera. Chaguo za kukokotoa hutumia nambari kamili kama kigezo (inawakilisha kitambulisho cha kifaa).

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

Sasa tunahitaji kuunda matrix ya n-dimensional. Itahifadhi picha zilizosomwa kutoka kwa kamera.

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

Ili kuonyesha mkondo wa video, unahitaji kuunda dirisha - hii inaweza kufanyika kwa kutumia kazi ya NewWindow.

window := gocv.NewWindow(β€œwebcamwindow”)
defer window.Close()

Sasa hebu tuendelee kwenye sehemu ya kuvutia zaidi.

Kwa kuwa video ni mtiririko unaoendelea wa fremu za picha, tutahitaji kuunda kitanzi kisicho na kikomo ili kusoma mfululizo wa video wa kamera. Ili kufanya hivyo, unahitaji njia ya Kusoma ya aina ya VideoCapture. Itatarajia aina ya Mat (tumbo tulilounda hapo juu), kurudisha thamani ya boolean inayoonyesha ikiwa fremu kutoka kwa VideoCapture ilisomwa kwa mafanikio au la.

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

Sasa unahitaji kuonyesha sura kwenye dirisha iliyoundwa. Kusitisha kwa kuhamia fremu inayofuata ni 50 ms.

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

Baada ya kuzindua programu, dirisha na mkondo wa video kutoka kwa kamera itafunguliwa.

Kuunda mfumo wa utambuzi wa uso kulingana na Golang na 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)
}
}

mfano 2

Katika mfano huu, hebu tutumie mfano uliopita na tujenge mfumo wa utambuzi wa uso kulingana na Haar Cascades.

Cascades ya Haar ni waainishaji wa mteremko ambao wamefunzwa kwa kutumia mbinu ya Haar wavelet. Wanachanganua saizi kwenye picha ili kugundua vipengele fulani. Ili kujua zaidi kuhusu Haar Cascades, tafadhali fuata viungo vilivyo hapa chini.

Mfumo wa kutambua kitu cha Viola-Jones
Cascading classifiers
Kipengele kinachofanana na Haar

Pakua cascades tayari zilizofunzwa inaweza kuwa hapa. Katika mfano wa sasa, cascades itatumika kutambua uso wa mtu kutoka mbele.

Ili kufanya hivyo, unahitaji kuunda kiainishaji na kulisha faili iliyofunzwa tayari (kiungo kimepewa hapo juu). Tayari nimepakia faili ya pencv_haarcascade_frontalface_default.xml kwenye saraka ambapo programu yetu iko.

harrcascade := β€œopencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()

Ili kugundua nyuso kwenye picha, unahitaji kutumia njia TambuaMultiScale. Chaguo hili la kukokotoa huchukua fremu (aina ya Mat) ambayo ilikuwa imesomwa hivi punde kutoka kwa mtiririko wa video wa kamera na kurejesha safu ya aina ya Mstatili. Saizi ya mkusanyiko inawakilisha idadi ya nyuso ambazo kiainishaji kiliweza kugundua kwenye fremu. Kisha, ili kuhakikisha kuwa tunaona kile kilichopata, hebu turudie kupitia orodha ya mistatili na kuchapisha kitu cha Mstatili kwenye console, na kuunda mpaka karibu na mstatili uliogunduliwa. Hii inaweza kufanywa kwa kutumia kazi ya Mstatili. Itakubali Mat iliyosomwa na kamera, kitu cha Mstatili ambacho kilirejeshwa kwa mbinu ya DetectMultiScale, rangi na unene wa mpaka.

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

Kuunda mfumo wa utambuzi wa uso kulingana na Golang na OpenCV

Kuunda mfumo wa utambuzi wa uso kulingana na Golang na 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)
}
}

Na ... ndio, kila kitu kilifanyika! Sasa tuna mfumo rahisi wa utambuzi wa uso ulioandikwa katika Go. Hivi karibuni ninapanga kuendeleza majaribio haya na kuunda mambo mapya mazuri kwa kuchanganya Go na OpenCV.

Ikiwa una nia, tafadhali kadiria seva ya wavuti ya gRPC, ambayo niliandika katika Python na OpenCV. Hutiririsha data pindi uso unapotambuliwa. Huu ndio msingi wa kuunda wateja tofauti katika lugha tofauti za programu. Wataweza kuunganisha kwenye seva na kusoma data kutoka kwayo.

Asante kwa kusoma makala!

Skillbox inapendekeza:

Chanzo: mapenzi.com

Kuongeza maoni