Izgradnja sistema za prepoznavanje lica zasnovanog na Golangu i OpenCV-u

Izgradnja sistema za prepoznavanje lica zasnovanog na Golangu i OpenCV-u
OpenCV je biblioteka dizajnirana za projekte kompjuterskog 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 kada sam počeo da učim i koristim Go, zainteresovao sam se da li se OpenCV može koristiti za rad sa ovim jezikom. U to vrijeme su već postojali primjeri i tutorijali o integraciji, ali mi se činilo da su previše komplikovani. Nešto kasnije, naišao sam na omot koji je kreirao tim The Hybrid Group. U ovom članku ću vam pokazati kako da počnete sa GoCV razvojem jednostavnog sistema za prepoznavanje lica sa Haar Cascades.

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

Podsećamo: za sve čitaoce "Habra" - popust od 10 rubalja pri upisu na bilo koji Skillbox kurs koristeći "Habr" promotivni kod.

Šta će biti potrebno:

  • Idi;
  • OpenCV (linkovi za instalaciju ispod);
  • web ili obična video kamera.

postavljanje

primjer 1

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

Prvo morate uvesti biblioteke potrebne za rad.

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

Nakon toga, trebate kreirati VideoCapture objekat koristeći funkciju VideoCaptureDevice. Ovo poslednje omogućava snimanje video toka 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 treba da kreiramo n-dimenzionalnu matricu. On će pohraniti slike pročitane sa kamere.

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

Da biste prikazali video stream, morate kreirati prozor - to se može učiniti pomoću funkcije NewWindow.

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

Pređimo sada na najzanimljiviji dio.

Budući da je video kontinuirani tok okvira slike, morat ćemo stvoriti beskonačnu petlju kako bismo beskonačno čitali video tok kamere. Da biste to učinili, potrebna vam je metoda Read tipa VideoCapture. Očekivat će Mat tip (matrica koju smo kreirali iznad), vraćajući booleovu vrijednost koja pokazuje da li je okvir iz VideoCapturea uspješno pročitan 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 kreiranom prozoru. Pauza za prelazak na sljedeći okvir je 50 ms.

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

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

Izgradnja sistema za prepoznavanje lica zasnovanog 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 napravimo sistem za prepoznavanje lica baziran na Haar Cascades.

Haar kaskade su kaskadni klasifikatori koji su obučeni koristeći Haar wavelet tehniku. Oni analiziraju piksele na slici kako bi otkrili određene karakteristike. Da biste saznali više o Haar Cascades, slijedite donje veze.

Viola-Jones okvir za detekciju objekata
Kaskadni klasifikatori
Karakteristika slična Haaru

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

Da biste to učinili, morate kreirati klasifikator i ubaciti ga u već obučeni fajl (link je dat iznad). Već sam uploadovao pencv_haarcascade_frontalface_default.xml datoteku u direktorij u kojem se nalazi naš program.

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

Da biste otkrili lica na slici, morate koristiti 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 mogao otkriti u okviru. Zatim, da bismo bili sigurni da vidimo šta je pronašao, idemo kroz listu pravougaonika i odštampati objekat Rectangle na konzoli, kreirajući ivicu oko otkrivenog pravougaonika. To se može učiniti pomoću funkcije Rectangle. Prihvatit će Mat koji čita kamera, objekt Rectangle koji je vraćen metodom DetectMultiScale, boju i debljinu ivice.

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

Izgradnja sistema za prepoznavanje lica zasnovanog na Golangu i OpenCV-u

Izgradnja sistema za prepoznavanje lica zasnovanog 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 ispalo! Sada imamo jednostavan sistem za prepoznavanje lica napisan u Go. Uskoro planiram da nastavim ove eksperimente i kreiram nove cool stvari kombinovanjem Go i OpenCV.

Ako ste zainteresirani, ocijenite gRPC web server, koji sam napisao u Python-u i OpenCV-u. Prenosi podatke u trenutku kada je lice otkriveno. Ovo je osnova za kreiranje različitih klijenata u različitim programskim jezicima. Moći će se povezati na server i čitati podatke sa njega.

Hvala vam što ste pročitali članak!

Skillbox preporučuje:

izvor: www.habr.com

Dodajte komentar