Budovanie systému rozpoznávania tvárí založeného na Golang a OpenCV
OpenCV je knižnica určená pre projekty počítačového videnia. Má už asi 20 rokov. Používal som ho na vysokej škole a stále ho používam pre svoje projekty C++ a Python, pretože má dobrú podporu pre tieto jazyky.
Ale keď som sa začal učiť a používať Go, začalo ma zaujímať, či by sa OpenCV dalo použiť na prácu s týmto jazykom. V tom čase už existovali príklady a návody na integráciu, ale zdalo sa mi, že sú príliš komplikované. O niečo neskôr som narazil na obal vytvorený tímom The Hybrid Group. V tomto článku vám ukážem, ako začať s GoCV vyvinutím jednoduchého systému na rozpoznávanie tváre s Haar Cascades.
V prvom príklade sa pokúsime vytvoriť aplikáciu, ktorá otvorí okno zobrazujúce stream videa z kamery.
Najprv musíte importovať knižnice potrebné pre prácu.
importovať (
"log"
"gocv.io/x/gocv"
)
Potom musíte vytvoriť objekt VideoCapture pomocou funkcie VideoCaptureDevice. Ten umožňuje zachytiť video stream pomocou kamery. Funkcia používa ako parameter celé číslo (predstavuje ID zariadenia).
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf(“error opening web cam: %v”, err)
}
defer webcam.Close()
Teraz musíme vytvoriť n-rozmernú maticu. Uloží obrázky načítané z fotoaparátu.
img := gocv.NewMat()
defer img.Close()
Ak chcete zobraziť stream videa, musíte vytvoriť okno - to je možné vykonať pomocou funkcie NewWindow.
Keďže video je nepretržitý tok snímok, budeme musieť vytvoriť nekonečnú slučku, aby sme mohli donekonečna čítať tok videa z kamery. Na to potrebujete metódu Read typu VideoCapture. Očakáva typ Mat (maticu, ktorú sme vytvorili vyššie), vracajúcu booleovskú hodnotu označujúcu, či bola snímka z VideoCapture načítaná úspešne alebo nie.
for {
if ok := webcam.Read(&img); !ok || img.Empty( {
log.Println(“Unable to read from the webcam”) continue
}
.
.
.
}
Teraz musíte zobraziť rám vo vytvorenom okne. Pauza na prechod na ďalšiu snímku je 50 ms.
window.IMShow(img)
window.WaitKey(50)
Po spustení aplikácie sa otvorí okno s videostreamom z kamery.
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)
}
}
Príklad 2
V tomto príklade použijeme predchádzajúci príklad a zostavme systém rozpoznávania tvárí založený na Haar Cascades.
Haarove kaskády sú kaskádové klasifikátory, ktoré sú trénované pomocou Haarovej vlnkovej techniky. Analyzujú pixely v obraze, aby zistili určité funkcie. Ak sa chcete dozvedieť viac o kaskádach Haar, kliknite na nižšie uvedené odkazy.
Stiahnite si už natrénované kaskády môže byť tu. V aktuálnom príklade sa na identifikáciu tváre osoby spredu použijú kaskády.
Aby ste to mohli urobiť, musíte vytvoriť klasifikátor a odovzdať mu už natrénovaný súbor (odkaz je uvedený vyššie). Súbor pencv_haarcascade_frontalface_default.xml som už nahral do adresára, kde sa nachádza náš program.
Ak chcete rozpoznať tváre na obrázku, musíte použiť metódu DetectMultiScale. Táto funkcia vezme snímku (typ Mat), ktorá bola práve načítaná z video streamu kamery, a vráti pole typu Rectangle. Veľkosť poľa predstavuje počet tvárí, ktoré bol klasifikátor schopný rozpoznať v rámci. Potom, aby sme sa uistili, že vidíme, čo našiel, prejdeme zoznamom obdĺžnikov a vytlačíme objekt Rectangle do konzoly, čím vytvoríme orámovanie okolo rozpoznaného obdĺžnika. Môžete to urobiť pomocou funkcie Obdĺžnik. Bude akceptovať podložku načítanú kamerou, objekt Rectangle, ktorý vrátila metóda DetectMultiScale, farbu a hrúbku okraja.
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)
}
}
A... áno, všetko vyšlo! Teraz máme jednoduchý systém rozpoznávania tváre napísaný v Go. Čoskoro plánujem pokračovať v týchto experimentoch a vytvárať nové skvelé veci kombináciou Go a OpenCV.
Ak máte záujem, ohodnoťte webový server gRPC, ktorý som napísal v Pythone a OpenCV. Streamuje údaje v momente, keď je rozpoznaná tvár. Toto je základ pre vytváranie rôznych klientov v rôznych programovacích jazykoch. Budú sa môcť pripojiť k serveru a čítať z neho údaje.