Custruì un sistema di ricunniscenza facciale basatu annantu à Golang è OpenCV

Custruì un sistema di ricunniscenza facciale basatu annantu à Golang è OpenCV
OpenCV hè una biblioteca pensata per i prughjetti di visione per computer. Ella hà digià circa 20 anni. L'aghju utilizatu in l'università è l'utilizanu sempre per i mo prughjetti C++ è Python perchè hà un bonu supportu per queste lingue.

Ma quandu aghju cuminciatu à amparà è aduprà Go, aghju avutu interessatu à se OpenCV puderia esse usatu per travaglià cù questa lingua. À quellu tempu, ci era digià esempi è tutoriali nantu à l'integrazione, ma mi paria chì eranu troppu cumplicati. Un pocu dopu, aghju scontru un wrapper creatu da u gruppu Hybrid Group. In questu articulu, vi mustrarà cumu per cumincià cù GoCV sviluppendu un sistema simplice di ricunniscenza faccia cù Haar Cascades.

Skillbox consiglia: Corso praticu "Sviluppatore Python da zero".

Ramintemu: per tutti i lettori di "Habr" - un scontu di 10 000 rubles quandu si iscrizzione in ogni cursu Skillbox cù u codice promozionale "Habr".

Cosa hè necessariu:

  • Andà;
  • OpenCV (ligami di l'installazione sottu);
  • Web o camera video normale.

rimarchevuli

esempiu 1

In u primu esempiu, pruvaremu à creà una applicazione chì apre una finestra chì mostra un flussu di video camera.

Prima avete bisognu di impurtà e librerie necessarie per u travagliu.

impurtà (
"log"
"gocv.io/x/gocv"
)

Dopu questu, avete bisognu di creà un oggettu VideoCapture cù a funzione VideoCaptureDevice. L'ultime permette di catturà un flussu di video cù una camera. A funzione usa un interu cum'è paràmetru (rapprisenta l'ID di u dispusitivu).

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

Avà avemu bisognu di creà una matrice n-dimensionale. Guardarà l'imaghjini letti da a camera.

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

Per vede un flussu di video, avete bisognu di creà una finestra - questu pò esse fattu cù a funzione NewWindow.

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

Avà andemu à a parte più interessante.

Siccomu u video hè un flussu cuntinuu di fotogrammi di l'imaghjini, avemu bisognu di creà un ciclu infinitu per leghje senza fine u flussu di video di a camera. Per fà questu, avete bisognu di u metudu Read di u tipu VideoCapture. Ci hà da s'aspittava un tipu Mat (a matrice avemu creatu sopra), riturnà un valore boolean indicà s'ellu u quadru da u VideoCapture hè statu lettu successu o micca.

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

Avà avete bisognu di vede u quadru in a finestra creata. A pausa per passà à u prossimu quadru hè 50 ms.

finestra.IMShow(img)
finestra.WaitKey (50)

Dopu avè lanciatu l'applicazione, si apre una finestra cù un flussu di video da a camera.

Custruì un sistema di ricunniscenza facciale basatu annantu à Golang è OpenCV

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

esempiu 2

In questu esempiu, usemu l'esempiu precedente è custruiscenu un sistema di ricunniscenza facciale basatu annantu à Haar Cascades.

E cascate Haar sò classificatori di cascata chì sò addestrati cù a tecnica di wavelet Haar. Analizanu i pixelli in una maghjina per detectà certe funziunalità. Per sapè di più nantu à Haar Cascades, seguite i ligami sottu.

Quadru di rilevazione di l'ughjettu Viola-Jones
Classificatori in cascata
Funzione simile à Haar

Scaricate cascate digià addestrate pò esse quì. In l'esempiu attuale, i cascati seranu usati per identificà a faccia di una persona da u fronte.

Per fà questu, avete bisognu di creà un classificatore è alimentallu un schedariu digià furmatu (u ligame hè datu sopra). Aghju digià caricatu u schedariu pencv_haarcascade_frontalface_default.xml in u cartulare induve u nostru prugramma hè situatu.

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

Per detectà facci in una maghjina, avete bisognu di utilizà u metudu DetectMultiScale. Questa funzione piglia un quadru (tipu Mat) chì hè statu appena lettu da u flussu di video di a camera è torna un array di tipu Rectangle. A dimensione di l'array rapprisenta u numeru di facce chì u classificatore hà sappiutu detectà in u quadru. Allora, per assicurà chì vedemu ciò chì hà truvatu, iteratemu a lista di rectanguli è stampate l'ughjettu Rectangle à a cunsola, creendu un cunfini intornu à u rectangulu rilevatu. Questu pò esse fattu cù a funzione Rectangle. Acceptarà u Mat lettu da a camera, l'ughjettu Rectangle chì hè statu tornatu da u metudu DetectMultiScale, u culore è u grossu per u cunfini.

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

Custruì un sistema di ricunniscenza facciale basatu annantu à Golang è OpenCV

Custruì un sistema di ricunniscenza facciale basatu annantu à Golang è OpenCV

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è, tuttu hè andatu ! Avemu avà un sistema simplice di ricunniscenza faciale scrittu in Go. Prestu aghju pensatu di cuntinuà sti esperimenti è di creà novi cose cool cumminendu Go è OpenCV.

Sè site interessatu, per piacè valutate servitore web gRPC, chì aghju scrittu in Python è OpenCV. Trasmette dati in u mumentu chì una faccia hè rilevata. Questa hè a basa per creà diversi clienti in diverse lingue di prugrammazione. Puderanu cunnette à u servitore è leghje e dati da ellu.

Grazie per leghje l'articulu!

Skillbox consiglia:

Source: www.habr.com

Add a comment