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