Adeiladu system adnabod wynebau yn seiliedig ar Golang ac OpenCV

Adeiladu system adnabod wynebau yn seiliedig ar Golang ac OpenCV
Llyfrgell yw OpenCV a ddyluniwyd ar gyfer prosiectau gweledigaeth gyfrifiadurol. Mae hi eisoes tua 20 oed. Roeddwn i'n ei ddefnyddio yn y coleg ac yn dal i'w ddefnyddio ar gyfer fy mhrosiectau C++ a Python oherwydd bod ganddo gefnogaeth dda i'r ieithoedd hynny.

Ond pan ddechreuais i ddysgu a defnyddio Go, dechreuais ymddiddori a oedd modd defnyddio OpenCV i weithio gyda'r iaith hon. Bryd hynny, roedd enghreifftiau a thiwtorialau eisoes ar integreiddio, ond roedd yn ymddangos i mi eu bod yn rhy gymhleth. Ychydig yn ddiweddarach, deuthum ar draws deunydd lapio a grëwyd gan dîm The Hybrid Group. Yn yr erthygl hon, byddaf yn dangos i chi sut i ddechrau gyda GoCV trwy ddatblygu system adnabod wynebau syml gyda Haar Cascades.

Mae Skillsbox yn argymell: Cwrs ymarferol "Datblygwr Python o'r dechrau".

Rydym yn atgoffa: i holl ddarllenwyr "Habr" - gostyngiad o 10 rubles wrth gofrestru ar unrhyw gwrs Skillbox gan ddefnyddio'r cod hyrwyddo "Habr".

Yr hyn sy'n ofynnol:

  • Ewch;
  • OpenCV (dolenni gosodwr isod);
  • gwe neu gamera fideo rheolaidd.

Gosod

Enghraifft 1

Yn yr enghraifft gyntaf, byddwn yn ceisio creu cymhwysiad sy'n agor ffenestr sy'n dangos ffrwd fideo camera.

Yn gyntaf mae angen i chi fewnforio'r llyfrgelloedd sydd eu hangen ar gyfer gwaith.

mewnforio (
"log"
“gocv.io/x/gocv”
)

Ar ôl hyn, mae angen i chi greu gwrthrych VideoCapture gan ddefnyddio'r swyddogaeth VideoCaptureDevice. Mae'r olaf yn ei gwneud hi'n bosibl dal ffrwd fideo gan ddefnyddio camera. Mae'r swyddogaeth yn defnyddio cyfanrif fel paramedr (mae'n cynrychioli ID y ddyfais).

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

Nawr mae angen i ni greu matrics n-dimensiwn. Bydd yn storio delweddau a ddarllenwyd o'r camera.

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

I arddangos ffrwd fideo, mae angen i chi greu ffenestr - gellir gwneud hyn gan ddefnyddio'r swyddogaeth NewWindow.

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

Nawr, gadewch i ni symud ymlaen at y rhan fwyaf diddorol.

Gan fod fideo yn ffrwd barhaus o fframiau delwedd, bydd angen i ni greu dolen ddiddiwedd i ddarllen ffrwd fideo'r camera yn ddiddiwedd. I wneud hyn, mae angen y dull Darllen o'r math VideoCapture arnoch chi. Bydd yn disgwyl math Mat (y matrics a grëwyd gennym uchod), yn dychwelyd gwerth boolean yn nodi a ddarllenwyd y ffrâm o'r VideoCapture yn llwyddiannus ai peidio.

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

Nawr mae angen i chi arddangos y ffrâm yn y ffenestr a grëwyd. Yr saib ar gyfer symud i'r ffrâm nesaf yw 50 ms.

ffenestr.IMShow(img)
ffenestr.WaitKey(50)

Ar ôl lansio'r cais, bydd ffenestr gyda ffrwd fideo o'r camera yn agor.

Adeiladu system adnabod wynebau yn seiliedig ar Golang ac 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)
}
}

Enghraifft 2

Yn yr enghraifft hon, gadewch i ni ddefnyddio'r enghraifft flaenorol ac adeiladu system adnabod wynebau yn seiliedig ar Haar Cascades.

Mae rhaeadrau Haar yn ddosbarthwyr rhaeadru sy'n cael eu hyfforddi gan ddefnyddio techneg tonfedd Haar. Maent yn dadansoddi'r picseli mewn delwedd i ganfod rhai nodweddion. I ddarganfod mwy am Haar Cascades, dilynwch y dolenni isod.

Fframwaith canfod gwrthrychau Viola-Jones
Dosbarthwyr rhaeadru
Nodwedd tebyg i Haar

Lawrlwythwch rhaeadrau sydd eisoes wedi'u hyfforddi yn gallu bod yma. Yn yr enghraifft bresennol, defnyddir rhaeadrau i adnabod wyneb person o'r tu blaen.

Er mwyn gwneud hyn, mae angen i chi greu dosbarthwr a'i fwydo i ffeil sydd eisoes wedi'i hyfforddi (rhoddir y ddolen uchod). Rwyf eisoes wedi uwchlwytho'r ffeil pencv_haarcascade_frontalface_default.xml i'r cyfeiriadur lle mae ein rhaglen wedi'i lleoli.

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

I ganfod wynebau mewn delwedd, mae angen i chi ddefnyddio'r dull CanfodAmLraddfa. Mae'r swyddogaeth hon yn cymryd ffrâm (math Mat) a ddarllenwyd o ffrwd fideo'r camera ac yn dychwelyd amrywiaeth o Rectangle Math. Mae maint yr arae yn cynrychioli nifer yr wynebau yr oedd y dosbarthwr yn gallu eu canfod yn y ffrâm. Yna, i wneud yn siŵr ein bod yn gweld yr hyn a ddarganfuwyd, gadewch i ni ailadrodd trwy'r rhestr o betryalau ac argraffu'r gwrthrych Petryal i'r consol, gan greu ffin o amgylch y petryal a ganfuwyd. Gellir gwneud hyn gan ddefnyddio'r swyddogaeth Petryal. Bydd yn derbyn y Mat a ddarllenwyd gan y camera, y gwrthrych Rectangle a ddychwelwyd gan y dull DetectMultiScale, y lliw a'r trwch ar gyfer y ffin.

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

Adeiladu system adnabod wynebau yn seiliedig ar Golang ac OpenCV

Adeiladu system adnabod wynebau yn seiliedig ar Golang ac 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)
}
}

A... do, fe weithiodd popeth allan! Bellach mae gennym system adnabod wynebau syml wedi'i hysgrifennu yn Go. Yn fuan rwy'n bwriadu parhau â'r arbrofion hyn a chreu pethau cŵl newydd trwy gyfuno Go ac OpenCV.

Os oes gennych ddiddordeb, rhowch sgôr gweinydd gwe gRP, a ysgrifennais yn Python ac OpenCV. Mae'n ffrydio data yr eiliad y canfyddir wyneb. Dyma'r sail ar gyfer creu gwahanol gleientiaid mewn gwahanol ieithoedd rhaglennu. Byddant yn gallu cysylltu â'r gweinydd a darllen data ohono.

Diolch am ddarllen yr erthygl!

Mae Skillsbox yn argymell:

Ffynhonnell: hab.com

Ychwanegu sylw