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