
OpenCV — o bibliotecă dezvoltată pentru proiecte de viziune computerizată. Are deja aproximativ 20 de ani. Am folosit-o încă din facultate și o aplic și acum pentru proiectele mele în C++ și Python, deoarece oferă un suport destul de bun pentru aceste limbaje.
Dar când am început să învăț și să folosesc Go, m-a interesat dacă pot aplica OpenCV pentru a lucra cu acest limbaj. Atunci existau deja exemple și tutoriale pentru integrare, dar mi s-a părut că erau prea complicate. Mai târziu, mi-a căzut în mâini un wrapper creat de echipa The Hybrid Group. În acest articol, voi arăta cum să începi cu GoCV, dezvoltând un sistem simplu de recunoaștere facială folosind cascade Haar.
Skillbox recomandă: Curs practic .
Vă reamintim: pentru toți cititorii „Habr” — reducere de 10.000 de ruble la înscrierea la orice curs Skillbox cu codul de promovare „Habr”.
Ce va fi necesar:
- Go;
- OpenCV (linkuri pentru instalator mai jos);
- cameră web sau video obișnuită.
Instalare
- Linux:
- macOS:
- Windows:
Exemplu 1
În primul exemplu, vom încerca să creăm o aplicație care deschide o fereastră cu o demonstrație a fluxului video al camerei.
Mai întâi trebuie să importăm bibliotecile necesare pentru funcționare.
import (
“log”
“gocv.io/x/gocv”
)
După aceea, trebuie să creăm un obiect VideoCapture folosind funcția VideoCaptureDevice. Aceasta permite capturarea fluxului video utilizând cameră. Funcția folosește un număr întreg ca parametru (acesta reprezintă ID-ul dispozitivului).
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf(“eroare la deschiderea camerei web: %v”, err)
}
defer webcam.Close()Acum trebuie să creăm o matrice n-dimensională. Aceasta va stoca imaginile citite de la cameră.
img := gocv.NewMat()
defer img.Close()Pentru a afișa fluxul video, trebuie să creăm o fereastră — acest lucru poate fi realizat prin funcția NewWindow.
window := gocv.NewWindow(“webcamwindow”)
defer window.Close()Acum să trecem la cea mai interesantă parte.
Dat fiind că video-ul reprezintă un flux continuu de cadre-imagini, va trebui să creăm o buclă infinită pentru a citi continuu fluxul video al camerei. Pentru aceasta, este nevoie de metoda Read de tip VideoCapture. Aceasta va aștepta un tip Mat (matricea pe care am creat-o mai sus), returnând o valoare booleană care indică dacă cadrul din VideoCapture a fost citit cu succes sau nu.
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println(“Imposibil de citit de la camera web”) continue
}
.
.
.
}Acum trebuie să afișăm cadrul în fereastra creată. Pauza pentru a trece la următorul cadru este de 50 ms.
window.IMShow(img)
window.WaitKey(50)
După ce aplicația este lansată, se va deschide o fereastră cu fluxul video de la cameră.

package main
import (
"log"
"gocv.io/x/gocv"
)
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("eroare la deschiderea dispozitivului: %v", err)
}
defer webcam.Close()
img := gocv.NewMat()
defer img.Close()
window := gocv.NewWindow("fereastawindows")
defer window.Close()
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Imposibil de citit de la webcam")
continue
}
window.IMShow(img)
window.WaitKey(50)
}
}Exemplu 2
În acest exemplu, să folosim exemplul anterior și să construim un sistem de recunoaștere facială bazat pe Haar Cascades.
Cascadele Haar sunt clasificatoare în cascadă care sunt antrenate pe baza tehnicii wavelet Haar. Ele analizează pixelii din imagine pentru a detecta anumite caracteristici. Pentru a afla mai multe despre Haar Cascades, puteți accesa linkurile de mai jos.
Descărcați cascadele deja antrenate . În exemplul curent, cascadele vor fi utilizate pentru a identifica fața unei persoane din față.
Pentru a face acest lucru, trebuie să creați un clasificator și să îi oferiți un fișier deja antrenat (linkul de mai sus). Am încărcat fișierul opencv_haarcascade_frontalface_default.xml în directorul unde se află programul nostru.
harrcascade := "opencv_haarcascade_frontalface_default.xml"classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()Pentru a detecta fețele din imagine, trebuie să folosiți metoda . Această funcție primește un cadru (de tip Mat), care a fost citit recent din fluxul video al camerei, și returnează un array de tip Rectangle. Dimensiunea array-ului reprezintă numărul de fețe pe care clasificatorul le-a putut detecta în cadru. Apoi, pentru a ne asigura că vedem ceea ce a găsit, să parcurgem lista de dreptunghiuri și să afișăm obiectul Rectangle în consolă, creând o margine în jurul dreptunghiului detectat. Acest lucru se poate face cu ajutorul funcției Rectangle. Ea va accepta Mat-ul citit de cameră, obiectul Rectangle returnat de metoda DetectMultiScale, culoarea și grosimea pentru margine.
for _, r := range rects {
fmt.Println("detectat", 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... da, a ieșit! Acum avem un sistem simplu de recunoaștere facială scris în Go. În curând, planific să continui aceste experimente și să creez lucruri noi interesante, combinând Go și OpenCV.
Dacă te interesează, te rog să evaluezi , pe care l-am scris în Python și OpenCV. Acesta transmite date în momentul detectării feței. Este baza pentru crearea diferitelor clienți în diferite limbaje de programare. Aceștia se vor putea conecta la server și vor citi date de la acesta.
Mulțumesc că ai citit articolul!
Skillbox recomandă:
- Curs practic de doi ani .
- Curs online educațional .
- Curs practic anual .
Sursa: habr.com
