
OpenCV — knihovna vyvinutá pro projekty v oblasti počítačového vidění. Je stará již více než 20 let. Používal jsem ji ještě na vysoké škole a dodnes ji aplikuji ve svých projektech v C++ a Pythonu, protože má slušnou podporu pro tyto jazyky.
A když jsem začal studovat a používat Go, zajímalo mě, zda je možné použít OpenCV pro práci s tímto jazykem. V té době už existovaly příklady a tutoriály na integraci, ale zdály se mi příliš složité. O něco později jsem objevil wrapper vytvořený týmem The Hybrid Group. V tomto článku ukážu, jak začít s GoCV a vyvinout jednoduchý systém rozpoznávání obličejů pomocí Haar cascades.
Skillbox doporučuje: Praktický kurz .
Připomínáme: pro všechny čtenáře "Habra" – sleva 10 000 korun při registraci na jakýkoli kurz Skillbox s promokódem "Habr".
Co bude potřeba:
- Go;
- OpenCV (odkazy na instalátor níže);
- webová nebo běžná kamera.
Instalace
- Linux:
- macOS:
- Webové aplikace
Příklad 1
V prvním příkladu se pokusíme vytvořit aplikaci, která otevře okno s demonstrací videostreamu z kamery.
Nejprve je nutné importovat knihovny potřebné pro práci.
import (
"log"
"gocv.io/x/gocv"
)
Poté je potřeba vytvořit objekt VideoCapture pomocí funkce VideoCaptureDevice. Ta umožňuje zachytit videostream pomocí kamery. Ve funkci se používá celé číslo jako parametr (reprezentuje ID zařízení).
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf("error opening web cam: %v", err)
}
defer webcam.Close()Nyní je potřeba vytvořit n-rozměrnou matici. Ta bude uchovávat obrázky načtené z kamery.
img := gocv.NewMat()
defer img.Close()Pro zobrazení videostreamu je potřeba vytvořit okno — to lze udělat pomocí funkce NewWindow.
window := gocv.NewWindow("webcamwindow")
defer window.Close()Nyní přejdeme k té nejzajímavější části.
Protože video představuje nepřetržitý tok snímků-obrázků, budeme potřebovat vytvořit nekonečnou smyčku pro nekonečné čtení videostreamu z kamery. K tomu je potřeba metoda Read typu VideoCapture. Ta bude očekávat typ Mat (matrice, kterou jsme vytvořili výše), a vrátí logickou hodnotu, která naznačuje, zda byl snímek z VideoCapture úspěšně načten nebo ne.
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Unable to read from the webcam") continue
}
.
.
.
}Nyní je potřeba zobrazit snímek v vytvořeném okně. Pauza pro přechod k dalšímu snímku — 50 ms.
window.IMShow(img)
window.WaitKey(50)
Po spuštění aplikace se otevře okno s videostreamem 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)
}
}Příklad 2
V tomto příkladu využijeme předchozí příklad a vytvoříme systém pro rozpoznávání obličejů na základě Haarových kaskád.
Haarovy kaskády jsou kaskádové klasifikátory, které se trénují na základě Haarovy vlnkové techniky. Analyzují pixely v obraze, aby odhalily určité rysy. Chcete-li se dozvědět více o Haarových kaskádách, můžete navštívit odkazy níže.
Stáhnout již natrénované kaskády . V aktuálním příkladu budou kaskády použity k identifikaci obličeje člověka zepředu.
Abychom to udělali, musíme vytvořit klasifikátor a poskytnout mu již natrénovaný soubor (viz odkaz výše). Již jsem nahrál soubor opencv_haarcascade_frontalface_default.xml do adresáře, kde se nachází náš program.
harrcascade := "opencv_haarcascade_frontalface_default.xml"classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()Pro detekci obličejů v obraze je potřeba použít metodu . Tato funkce přijímá snímek (typ Mat), který byl právě přečten z videostreamu kamery, a vrací pole typu Rectangle. Velikost pole představuje počet obličejů, které klasifikátor dokázal detekovat ve snímku. Poté, abychom se ujistili, že vidíme to, co našel, projdeme seznamem obdélníků a vypíšeme objekt Rectangle na konzoli, čímž vytvoříme obvod kolem nalezeného obdélníku. To lze provést pomocí funkce Rectangle. Ta vezme Mat, který byla přečten z kamery, objekt Rectangle, který byl vrácen metodou DetectMultiScale, barvu a tloušťku pro obvod.
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… ano, všechno se podařilo! Teď máme jednoduchý systém rozpoznávání obličejů napsaný v Go. Brzy plánuji pokračovat v těchto experimentech a vytvořit nové skvělé věci kombinující Go a OpenCV.
Pokud máte zájem, ohodnoťte to , který jsem napsal v Pythonu a OpenCV. Streamuje data v okamžiku detekce obličeje. To je základ pro vytváření různých klientů v různých programovacích jazycích. Ty se budou moci připojit k serveru a číst z něj data.
Děkuji, že jste si přečetli článek!
Skillbox doporučuje:
- Dvouroční praktický kurz .
- Vzdělávací online kurz .
- Praktický roční kurz .
Zdroj: habr.com
