
OpenCV — knižnica, vytvorená pre projekty v oblasti počítačového videnia. Existuje už približne 20 rokov. Používal som ju ešte na vysokej škole a dodnes ju aplikujem vo svojich projektoch v C++ a Pythone, pretože má dobrú podporu týchto jazykov.
Ale keď som začal študovať a používať Go, zaujímalo ma, či je možné aplikovať OpenCV pre 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š zložité. O niečo neskôr sa mi dostal do rúk wrapper vytvorený tímom The Hybrid Group. V tomto článku ukážem, ako začať s GoCV, vyvinutím jednoduchého systému rozpoznávania tvárí s Haarovými kaskádami.
Skillbox odporúča: Praktický kurz .
Pripomíname: pre všetkých čitateľov „Habr“ — zľava 10 000 rubľov pri zapísaní na akýkoľvek kurz Skillbox s promo kódom „Habr“.
Čo bude potrebné:
- Go;
- OpenCV (odkazy na inštalačný súbor nižšie);
- webová alebo bežná videokamera.
Inštalácia
- Linux:
- macOS:
- Windows:
Príklad 1
V prvom príklade sa pokúsime vytvoriť aplikáciu, ktorá otvorí okno s demonštráciou videostreamu kamery.
Najprv je potrebné importovať knižnice potrebné na prácu.
import (
“log”
“gocv.io/x/gocv”
)
Potom je potrebné vytvoriť objekt VideoCapture pomocou funkcie VideoCaptureDevice. Táto funkcia umožňuje zachytávať videostream pomocou kamery. V funkcii sa používa celé číslo ako parameter (predstavuje ID zariadenia).
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf(“error opening web cam: %v”, err)
}
defer webcam.Close()Teraz je potrebné vytvoriť n-rozmernú maticu. Táto matica bude uchovávať obrázky prečítané z kamery.
img := gocv.NewMat()
defer img.Close()Na zobrazenie videostreamu je potrebné vytvoriť okno — to je možné dosiahnuť pomocou funkcie NewWindow.
window := gocv.NewWindow(“webcamwindow”)
defer window.Close()Teraz prejdeme k najzaujímavejšej časti.
Keďže video predstavuje nepretržitý prúd snímok-obrázkov, musíme vytvoriť nekonečný cyklus na nepretržité čítanie videostreamu kamery. Na to potrebujeme metódu Read typu VideoCapture. Táto metóda bude očakávať typ Mat (matrica, ktorú sme vytvorili vyššie), vracajúca logickú hodnotu, ktorá indikuje, či bola snímka z VideoCapture úspešne prečítaná alebo nie.
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println(“Unable to read from the webcam”) continue
}
.
.
.
}Teraz je potrebné zobraziť snímku v vytvorenom okne. Pauza pre prechod k nasledujúcej snímke — 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 využijeme predchádzajúci príklad a vybudujeme systém na rozpoznávanie tvárí na základe Haar Cascades.
Haar Cascades sú kaskádové klasifikátory, ktoré sa trénujú na základe techniky Haar wavelet. Analyzujú pixely v obrázku na detekciu určitých rysov. Viac informácií o Haar Cascades nájdete v nižšie uvedených odkazoch.
Stiahnuť už natrénované kaskády . V aktuálnom príklade budú kaskády použité na identifikáciu tváre človeka čelom.
Aby sme to dosiahli, musíme vytvoriť klasifikátor a poskytnúť mu už natrénovaný súbor (odkaz je uvedený vyššie). Už som nahrál súbor opencv_haarcascade_frontalface_default.xml do adresára, kde sa nachádza náš program.
harrcascade := “opencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()Na detekciu tvárí na obrázku musíme použiť metódu . Táto funkcia prijíma snímku (typ Mat), ktorá bola práve prečítaná z videostreamu kamery a vracia pole typu Rectangle. Veľkosť poľa predstavuje počet tvárí, ktoré klasifikátor dokázal odhaliť v snímke. Potom, aby sme sa uistili, že vidíme to, čo našiel, prejdeme zoznamom obdĺžnikov a vypíšeme objekt Rectangle na konzolu vytvorením rámčeka okolo odhaleného obdĺžnika. To môžeme urobiť pomocou funkcie Rectangle. Bude prijímať Mat, prečítaný kamerou, objekt Rectangle, ktorý bol vrátený metódou DetectMultiScale, farbu a hrúbku rámčeka.
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)
}
}Áno, podarilo sa to! Teraz máme jednoduchý systém rozpoznávania tváre napísaný v Go. Čoskoro plánujem pokračovať v týchto experimentoch a vytvoriť ďalšie skvelé veci kombinovaním Go a OpenCV.
Ak vás to zaujíma, ohodnoťte to , ktorý som napísal v jazyku Python a OpenCV. Streamuje dáta v okamihu, keď je tvár rozpoznaná. Je to základ pre vytvorenie rôznych klientov v rôznych programovacích jazykoch. Budú sa môcť pripojiť k serveru a čítať z neho údaje.
Ďakujem, že ste si prečítali článok!
Skillbox odporúča:
- Dvojročný praktický kurz .
- Vzdelávací online kurz .
- Praktický ročný kurz .
Zdroj: habr.com
