Izdelava sistema za prepoznavanje obrazov, ki temelji na Golangu in OpenCV

Izdelava sistema za prepoznavanje obrazov, ki temelji na Golangu in OpenCV
OpenCV je knjižnica, zasnovana za projekte računalniškega vida. Stara je že okoli 20 let. Uporabljal sem ga na fakulteti in ga še vedno uporabljam za svoje projekte C++ in Python, ker ima dobro podporo za te jezike.

Toda ko sem se začel učiti in uporabljati Go, me je začelo zanimati, ali je mogoče OpenCV uporabiti za delo s tem jezikom. Takrat so že obstajali primeri in vaje o integraciji, a so se mi zdele preveč zapletene. Malo kasneje sem naletel na ovoj, ki ga je ustvarila ekipa The Hybrid Group. V tem članku vam bom pokazal, kako začeti uporabljati GoCV z razvojem preprostega sistema za prepoznavanje obrazov s Haar Cascades.

Skillbox priporoča: Praktični tečaj "Python razvijalec iz nič".

Spomnimo: za vse bralce "Habr" - popust v višini 10 rubljev ob vpisu v kateri koli tečaj Skillbox s promocijsko kodo "Habr".

Kaj je potrebno:

  • Pojdi;
  • OpenCV (namestitvene povezave spodaj);
  • spletna ali navadna video kamera.

Namestitev

Primer 1

V prvem primeru bomo poskušali ustvariti aplikacijo, ki odpre okno, ki prikazuje video tok kamere.

Najprej morate uvoziti knjižnice, potrebne za delo.

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

Po tem morate s funkcijo VideoCaptureDevice ustvariti objekt VideoCapture. Slednji omogoča zajem video toka s kamero. Funkcija kot parameter uporablja celo število (predstavlja ID naprave).

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

Sedaj moramo ustvariti n-dimenzionalno matriko. Shranil bo slike, prebrane iz kamere.

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

Če želite prikazati video tok, morate ustvariti okno - to lahko storite s funkcijo NewWindow.

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

Zdaj pa preidimo na najbolj zanimiv del.

Ker je video neprekinjen tok slikovnih okvirjev, bomo morali ustvariti neskončno zanko za neskončno branje video toka kamere. Če želite to narediti, potrebujete metodo Read vrste VideoCapture. Pričakoval bo tip Mat (matriko, ki smo jo ustvarili zgoraj), ki bo vrnil logično vrednost, ki označuje, ali je bil okvir iz VideoCapture prebran uspešno ali ne.

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

Zdaj morate prikazati okvir v ustvarjenem oknu. Premor za prehod na naslednji okvir je 50 ms.

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

Po zagonu aplikacije se odpre okno z video tokom iz kamere.

Izdelava sistema za prepoznavanje obrazov, ki temelji na Golangu in 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)
}
}

Primer 2

V tem primeru uporabimo prejšnji primer in zgradimo sistem za prepoznavanje obrazov, ki temelji na Haar Cascades.

Haarove kaskade so kaskadni klasifikatorji, ki se usposabljajo z uporabo Haarjeve valovne tehnike. Analizirajo slikovne pike na sliki, da zaznajo določene značilnosti. Če želite izvedeti več o Haar Cascades, sledite spodnjim povezavam.

Ogrodje za odkrivanje objektov Viola-Jones
Kaskadni klasifikatorji
Haarju podobna lastnost

Prenesite že usposobljene kaskade lahko tukaj. V trenutnem primeru bodo kaskade uporabljene za prepoznavanje obraza osebe od spredaj.

Če želite to narediti, morate ustvariti klasifikator in mu dati že naučeno datoteko (povezava je navedena zgoraj). Datoteko pencv_haarcascade_frontalface_default.xml sem že naložil v imenik, kjer se nahaja naš program.

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

Če želite zaznati obraze na sliki, morate uporabiti metodo DetectMultiScale. Ta funkcija vzame okvir (vrsta Mat), ki je bil pravkar prebran iz videotoka kamere, in vrne matriko tipa Rectangle. Velikost niza predstavlja število obrazov, ki jih je klasifikator uspel zaznati v okvirju. Nato, da zagotovimo, da vidimo, kaj je našel, ponovimo seznam pravokotnikov in natisnimo objekt Rectangle na konzolo ter ustvarimo obrobo okoli zaznanega pravokotnika. To lahko storite s funkcijo Rectangle. Sprejel bo Mat, ki ga je prebrala kamera, objekt Rectangle, ki ga je vrnila metoda DetectMultiScale, barvo in debelino obrobe.

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

Izdelava sistema za prepoznavanje obrazov, ki temelji na Golangu in OpenCV

Izdelava sistema za prepoznavanje obrazov, ki temelji na Golangu in 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)
}
}

In ... ja, vse se je izšlo! Zdaj imamo preprost sistem za prepoznavanje obraza, napisan v Go. Kmalu nameravam nadaljevati te poskuse in ustvariti nove kul stvari s kombinacijo Go in OpenCV.

Če vas zanima, ocenite spletni strežnik gRPC, ki sem ga napisal v Pythonu in OpenCV. Podatke pretaka v trenutku, ko je zaznan obraz. To je osnova za ustvarjanje različnih odjemalcev v različnih programskih jezikih. Lahko se bodo povezali s strežnikom in brali podatke z njega.

Hvala, ker ste prebrali članek!

Skillbox priporoča:

Vir: www.habr.com

Dodaj komentar