Arcazonosító rendszert építünk Golang és OpenCV alapjain

Arcazonosító rendszert építünk Golang és OpenCV alapjain
Az OpenCV egy könyvtár, amelyet számítógépes látás projektekhez fejlesztettek ki. Már körülbelül 20 éve létezik. Még a főiskolán használtam, és azóta is alkalmazom a C++ és Python projektjeimben, mivel jól támogatja ezeket a nyelveket.

De amikor elkezdtem tanulmányozni és használni a Go-t, érdekelt, alkalmazható-e az OpenCV ezzel a nyelvvel. Akkor már léteztek integrációs példák és útmutatók, de úgy tűnt, hogy túl bonyolultak. Később a kezembe került egy wrapper, amit a The Hybrid Group csapata készített. Ebben a cikkben bemutatom, hogyan kezdjünk bele a GoCV-be, fejlesztve egy egyszerű arcfelismerő rendszert Haar-kaskádokkal.

A Skillbox ajánlja: Gyakorlati kurzus „Python fejlesztő nulláról”.

Emlékeztetjük: minden «Habr» olvasónak 10 000 rubeles kedvezmény jár bármely Skillbox kurzus jelentkezésekor a «Habr» promóciós kód felhasználásával.

Mire lesz szükség:

  • Go;
  • OpenCV (az alábbi telepítőlinkek);
  • web- vagy hagyományos videokamera.

Telepítés

1. példa

Az első példában megpróbálunk létrehozni egy alkalmazást, amely megnyit egy ablakot, bemutatva a kamera videófolyamát.

Először importálni kell a szükséges könyvtárakat.

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

Ezután létre kell hozni egy VideoCapture objektumot a VideoCaptureDevice funkció használatával. Az utóbbi lehetőséget ad a videófolyam rögzítésére a kamerán keresztül. A funkciónak egy egész számot kell átadni paraméterként (ez az eszköz azonosítóját képviseli).

webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf("webkamera megnyitási hiba: %v", err)
}
defer webcam.Close()

Most létre kell hoznunk egy n-dimenziós mátrixot. Ez fogja tárolni a kamerából olvasott képeket.

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

A videófolyam megjelenítéséhez először létre kell hoznunk egy ablakot — ezt a NewWindow funkció segítségével tehetjük meg.

window := gocv.NewWindow("webcamwindow")
defer window.Close()

Most lépjünk a legizgalmasabb részhez.

Mivel a videó folyamatos képfolyamot jelent, végtelen ciklust kell létrehoznunk a videófolyam folyamatos olvasásához. Ehhez a VideoCapture típusú Read metódusra van szükség. Ez várni fog egy Mat típust (a mátrix, amit előbb létrehoztunk), és logikai értéket ad vissza, amely jelzi, hogy a VideoCapture-ből sikeresen olvasott-e képet vagy sem.

for { 
 if ok := webcam.Read(&img); !ok || img.Empty() {
 log.Println("Nem sikerült a webkamerából olvasni") continue
 }
.
.
.
}

Most meg kell jelenítenünk a képkockát a létrehozott ablakban. A következő képkockára való átmenethez 50 ms szünetet adunk.

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

Az alkalmazás elindítása után egy ablak nyílik meg, amely a kamera videófolyamát jeleníti meg.

Arcazonosító rendszert építünk Golang és OpenCV alapjain

package main
 
import (
"log"
 
"gocv.io/x/gocv"
)
 
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
    log.Fatalf("esemény a készülék megnyitásakor: %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("Nem sikerült olvasni a webkamerából")
continue
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

Példa 2

Ebben a példában használjuk az előző példát, és építünk egy arcfelismerő rendszert Haar Cascades alapjain.

A Haar Cascades egy cascades klasszifikáló, amely a Haar-válet technikáján alapul. Ezek elemzik a képen található pixeleket, hogy meghatározott jellemzőket észleljenek. További információkhoz a Haar Cascades-ről az alábbi linkeken keresztül juthat el.

Viola-Jones objektum-észlelési keretrendszer
Cascading klasszifikátorok
Haar-szerű jelleg

Töltse le az előképzett cascades-okat itt. A jelenlegi példában a cascades-okat az arcok azonosítására fogjuk használni.

Ehhez létre kell hoznunk egy klasszifikálót, és be kell táplálnunk neki a már betanított fájlt (a fenti linkek egyike). Már betöltöttem a fájlt opencv_haarcascade_frontalface_default.xml a mappába, ahol a programunk található.

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

Az arcok észleléséhez a következő módszert kell alkalmazni: DetectMultiScale. Ez a funkció fogad egy keretet (Mat típus), amelyet éppen most olvastunk be a kamera videófolyamából, és visszaad egy Rectangle típusú tömböt. A tömb mérete azt jelzi, hogy hány arcot tudott észlelni a klasszifikáló a keretben. Ezután, hogy megbizonyosodjunk arról, amit talált, nézzük át a téglalapok listáját, és írjuk ki a konzolra a Rectangle objektumot, létrehozva egy keretet a felfedezett téglalap körül. Ezt a Rectangle függvénnyel végezhetjük el. Ez fogadja a kamerával olvasott Mat-t, a DetectMultiScale módszer által visszaadott Rectangle objektumot, a színt és a vastagságot a kerethez.

for _, r := range rects {
fmt.Println("észlelve", r)
gocv.Rectangle(&img, r, color, 2)
}

Arcazonosító rendszert építünk Golang és OpenCV alapjain

Arcazonosító rendszert építünk Golang és OpenCV alapjain

csomag main

import (
"fmt"
"image/color"
"log"

"gocv.io/x/gocv"
)

func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("hiba a webkamera megnyitásakor: %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("Nem sikerült olvasni az eszközből")
continue
}

rects := classifier.DetectMultiScale(img)
for _, r := range rects {
fmt.Println("észlelt", r)
gocv.Rectangle(&img, r, color, 3)
}

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

Igen, sikerült! Most már van egy egyszerű arcfelismerő rendszer a Go nyelven. Hamarosan szeretném folytatni ezeket a kísérleteket, és új klassz dolgokat létrehozni a Go és az OpenCV kombinálásával.

Ha érdekel, értékeld. gRPC web server, amit Pythonban és OpenCV ben írtam. Ez közvetíti az adatokat, amikor arcot észlel. Ez alapja különböző kliensek létrehozásának különböző programozási nyelveken. Ezek csatlakozhatnak a szerverhez és adatokat olvashatnak róla.

Köszönöm, hogy elolvastad a cikket!

A Skillbox ajánlja:

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster