Izrada sustava za prepoznavanje lica temeljenog na Golangu i OpenCV-u

Izrada sustava za prepoznavanje lica temeljenog na Golangu i OpenCV-u
OpenCV je biblioteka dizajnirana za projekte računalnog vida. Ona već ima oko 20 godina. Koristio sam ga na koledžu i još uvijek ga koristim za svoje C++ i Python projekte jer ima dobru podršku za te jezike.

Ali kad sam počeo učiti i koristiti Go, zainteresirao sam se može li se OpenCV koristiti za rad s ovim jezikom. U to vrijeme već su postojali primjeri i tutoriali o integraciji, ali činilo mi se da su previše komplicirani. Nešto kasnije, naišao sam na omot koji je kreirao tim The Hybrid Group. U ovom članku ću vam pokazati kako započeti s GoCV-om razvijanjem jednostavnog sustava za prepoznavanje lica s Haar Cascades.

Skillbox preporučuje: Praktični tečaj "Python programer od nule".

Podsjećamo: za sve čitatelje "Habra" - popust od 10 000 rubalja pri upisu na bilo koji tečaj Skillbox koristeći promotivni kod "Habr".

Što je potrebno:

  • Ići;
  • OpenCV (veze za instalaciju ispod);
  • web ili obična video kamera.

Instalacija

Primjer 1

U prvom primjeru pokušat ćemo napraviti aplikaciju koja otvara prozor koji prikazuje video stream kamere.

Prvo morate uvesti biblioteke potrebne za rad.

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

Nakon toga trebate izraditi objekt VideoCapture pomoću funkcije VideoCaptureDevice. Potonji omogućuje snimanje video streama pomoću kamere. Funkcija koristi cijeli broj kao parametar (predstavlja ID uređaja).

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

Sada moramo stvoriti n-dimenzionalnu matricu. Pohranit će slike očitane s kamere.

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

Za prikaz video streama morate stvoriti prozor - to se može učiniti pomoću funkcije NewWindow.

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

Sada prijeđimo na najzanimljiviji dio.

Budući da je video kontinuirani tok okvira slike, morat ćemo stvoriti beskonačnu petlju za beskrajno čitanje video toka kamere. Da biste to učinili, potrebna vam je metoda Read vrste VideoCapture. Očekivat će tip Mat (matrica koju smo stvorili gore), vraćajući booleovu vrijednost koja pokazuje je li okvir iz VideoCapturea pročitan uspješno ili ne.

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

Sada morate prikazati okvir u stvorenom prozoru. Pauza za prelazak na sljedeći okvir je 50 ms.

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

Nakon pokretanja aplikacije otvorit će se prozor s video streamom s kamere.

Izrada sustava za prepoznavanje lica temeljenog na Golangu i OpenCV-u

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

Primjer 2

U ovom primjeru upotrijebimo prethodni primjer i izgradimo sustav za prepoznavanje lica temeljen na Haar Cascades.

Haarove kaskade su kaskadni klasifikatori koji se treniraju koristeći Haarovu tehniku ​​valića. Oni analiziraju piksele na slici kako bi otkrili određene značajke. Kako biste saznali više o Haar Cascades, molimo slijedite poveznice u nastavku.

Okvir za otkrivanje objekata Viola-Jones
Kaskadni klasifikatori
Značajka slična Haaru

Preuzmite već obučene kaskade mogu biti ovdje. U trenutnom primjeru, kaskade će se koristiti za identifikaciju lica osobe s prednje strane.

Da biste to učinili, morate stvoriti klasifikator i unijeti mu već obučenu datoteku (veza je navedena gore). Već sam učitao datoteku pencv_haarcascade_frontalface_default.xml u direktorij u kojem se nalazi naš program.

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

Za otkrivanje lica na slici morate upotrijebiti metodu DetectMultiScale. Ova funkcija uzima okvir (tip Mat) koji je upravo pročitan iz video toka kamere i vraća niz tipa Rectangle. Veličina niza predstavlja broj lica koje je klasifikator uspio otkriti u okviru. Zatim, kako bismo bili sigurni da vidimo što je pronašao, idemo iterirati kroz popis pravokutnika i ispisati objekt Rectangle na konzoli, stvarajući obrub oko otkrivenog pravokutnika. To se može učiniti pomoću funkcije Rectangle. Prihvatit će Mat koji očitava kamera, objekt Rectangle koji je vraćen metodom DetectMultiScale, boju i debljinu obruba.

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

Izrada sustava za prepoznavanje lica temeljenog na Golangu i OpenCV-u

Izrada sustava za prepoznavanje lica temeljenog na Golangu i OpenCV-u

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

I... da, sve je uspjelo! Sada imamo jednostavan sustav za prepoznavanje lica napisan u Go. Uskoro planiram nastaviti s ovim eksperimentima i stvarati nove cool stvari kombinirajući Go i OpenCV.

Ako ste zainteresirani, ocijenite gRPC web poslužitelj, koji sam napisao u Pythonu i OpenCV-u. Usmjerava podatke u trenutku kada se otkrije lice. Ovo je osnova za kreiranje različitih klijenata u različitim programskim jezicima. Moći će se spojiti na poslužitelj i čitati podatke s njega.

Hvala što ste pročitali članak!

Skillbox preporučuje:

Izvor: www.habr.com

Dodajte komentar