Arcfelismerő rendszer építése Golang és OpenCV alapján

Arcfelismerő rendszer építése Golang és OpenCV alapján
Az OpenCV egy számítógépes látásprojektekhez kifejlesztett könyvtár. Már körülbelül 20 éves. Az egyetemen használtam, és még mindig használom a C++ és Python projektjeimhez, mert jól támogatja ezeket a nyelveket.

De amikor elkezdtem tanulni és használni a Go-t, azon tűnődtem, hogy az OpenCV használható-e ezzel a nyelvvel. Akkoriban már voltak példák és oktatóanyagok az integrációról, de nekem túl bonyolultnak tűntek. Kicsit később a The Hybrid Group által készített wrapperre bukkantam. Ebben a cikkben megmutatom, hogyan kezdje el a GoCV-t egy egyszerű arcfelismerő rendszer kifejlesztésével a Haar Cascades segítségével.

A Skillbox a következőket ajánlja: Gyakorlati tanfolyam "Python fejlesztő a semmiből".

Emlékeztetünk: a "Habr" minden olvasója számára - 10 000 rubel kedvezmény, ha a "Habr" promóciós kóddal bármely Skillbox tanfolyamra jelentkezik.

Mi szükséges:

  • Megy;
  • OpenCV (a telepítő linkjei alább);
  • webes vagy normál videokamera.

Telepítés

Példa 1

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

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

import(
"napló"
„gocv.io/x/gocv”
)

Ezt követően létre kell hoznia egy VideoCapture objektumot a VideoCaptureDevice funkció segítségével. Ez utóbbi lehetővé teszi a videó stream rögzítését kamera segítségével. A függvény egy egész számot vesz fel paraméterként (az eszközazonosítót jelenti).

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

Most egy n-dimenziós mátrixot kell létrehoznunk. Tárolja a kamerából olvasott képeket.

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

A videofolyam megjelenítéséhez létre kell hozni egy ablakot - ezt a NewWindow funkcióval lehet megtenni.

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

Most pedig térjünk át a legérdekesebb részre.

Mivel a videó képkockák folyamatos folyama, végtelen hurkot kell létrehoznunk, hogy végtelenül olvashassuk a kamera videofolyamát. Ehhez a VideoCapture típusú Read metódusra van szükség. Mat típusra számít (a fentebb létrehozott mátrix), amely egy logikai értéket ad vissza, jelezve, hogy a VideoCapture-ből származó képkocka beolvasása sikeres volt-e vagy sem.

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

Most meg kell jelenítenünk a keretet a létrehozott ablakban. Szünet a következő képkockára lépéshez – 50 ms.

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

Az alkalmazás elindítása után megnyílik egy ablak a kamerából származó videofolyammal.

Arcfelismerő rendszer építése Golang és OpenCV alapján

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)
}
}

Példa 2

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

A Haar kaszkádok lépcsőzetes osztályozók, amelyeket a Haar wavelet technika alapján képeznek ki. Elemezik a kép képpontjait, hogy konkrét jellemzőket keressenek. Ha többet szeretne megtudni a Haar Cascades-ról, kérjük, kövesse az alábbi linkeket.

Viola-Jones objektumészlelési keretrendszer
Lépcsőzetes osztályozók
Haar-szerű tulajdonság

Töltse le a már betanított kaszkádokat itt lehet. A jelenlegi példában kaszkádokat használunk az elöl lévő személy arcának azonosítására.

Ehhez létre kell hoznia egy osztályozót, és betáplálnia kell egy már betanított fájlt (a hivatkozás fent található). A pencv_haarcascade_frontalface_default.xml fájlt már feltöltöttem abba a könyvtárba, ahol a programunk található.

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

Az arcok képen való észleléséhez a módszert kell használnia DetectMultiScale. Ez a funkció egy (Mat típusú) keretet vesz fel, amelyet éppen beolvasott a kamera videofolyamából, és egy Rectangle típusú tömböt ad vissza. A tömb mérete azon arcok számát jelenti, amelyeket az osztályozó képes volt észlelni a keretben. Ezután, hogy biztosan látjuk, mit talált, ismételjük át a téglalapok listáját, és nyomtassuk ki a Rectangle objektumot a konzolra, és hozzunk létre egy szegélyt a talált téglalap körül. Ezt a Téglalap funkcióval lehet megtenni. Ehhez szüksége lesz a kamera által beolvasott szőnyegre, a DetectMultiScale metódus által visszaadott Rectangle objektumra, valamint a szegély színére és vastagságára.

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

Arcfelismerő rendszer építése Golang és OpenCV alapján

Arcfelismerő rendszer építése Golang és OpenCV alapján

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)
}
}

És... igen, minden sikerült! Most egy egyszerű arcfelismerő rendszerünk van Go-ban. A közeljövőben azt tervezem, hogy folytatom ezeket a kísérleteket, és új klassz dolgokat készítek a Go és az OpenCV kombinálásával.

Ha érdekel, kérlek értékeld gRPC webszerver, amit Pythonban és OpenCV-ben írtam. Adatfolyamot küld, amint arcot észlel. Ez az alapja a különböző kliensek létrehozásának különböző programozási nyelveken. Képesek lesznek csatlakozni a szerverhez és adatokat olvasni róla.

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

A Skillbox a következőket ajánlja:

Forrás: will.com

Hozzászólás