
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 .
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
- Linux:
- Megvalósítva lett
- Az about:support oldalra
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.

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.
Töltse le az előképzett cascades-okat . 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: . 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)
} 

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. , 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:
- Kétéves gyakorlati tanfolyam .
- Oktatási online kurzus .
- Gyakorlati éves kurzus .
Forrás: habr.com
