Vybudování systému rozpoznávání obličeje založeného na Golang a OpenCV
OpenCV je knihovna určená pro projekty počítačového vidění. Už je jí asi 20 let. Používal jsem ho na vysoké škole a stále používám pro své projekty v C++ a Pythonu, protože má pro tyto jazyky dobrou podporu.
Když jsem se ale začal učit a používat Go, začalo mě zajímat, zda by se OpenCV dalo použít pro práci s tímto jazykem. V té době už existovaly příklady a návody na integraci, ale zdály se mi příliš složité. O něco později jsem narazil na obal vytvořený týmem The Hybrid Group. V tomto článku vám ukážu, jak začít s GoCV vývojem jednoduchého systému pro rozpoznávání obličeje s Haar Cascades.
V prvním příkladu se pokusíme vytvořit aplikaci, která otevře okno zobrazující stream videa z kamery.
Nejprve je potřeba naimportovat knihovny potřebné pro práci.
import(
"log"
"gocv.io/x/gocv"
)
Poté musíte pomocí funkce VideoCaptureDevice vytvořit objekt VideoCapture. Ten umožňuje zachytit video stream pomocí kamery. Funkce používá jako parametr celé číslo (představuje ID zařízení).
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf(“error opening web cam: %v”, err)
}
defer webcam.Close()
Nyní potřebujeme vytvořit n-rozměrnou matici. Bude ukládat snímky načtené z fotoaparátu.
img := gocv.NewMat()
defer img.Close()
Chcete-li zobrazit video stream, musíte vytvořit okno - to lze provést pomocí funkce NewWindow.
Protože video je nepřetržitý proud obrazových snímků, budeme muset vytvořit nekonečnou smyčku, abychom mohli nekonečně číst video stream z kamery. K tomu potřebujete metodu Read typu VideoCapture. Očekává typ Mat (matici, kterou jsme vytvořili výše), vracející booleovskou hodnotu indikující, zda byl snímek z VideoCapture přečten úspěšně 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 rámeček ve vytvořeném okně. Pauza pro přechod na další snímek je 50 ms.
window.IMShow(img)
window.WaitKey(50)
Po spuštění aplikace se otevře okno s video streamem 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 použijeme předchozí příklad a postavme systém rozpoznávání obličejů založený na Haar Cascades.
Haarovy kaskády jsou kaskádové klasifikátory, které jsou trénovány pomocí techniky Haarových vlnek. Analyzují pixely v obraze, aby detekovaly určité funkce. Chcete-li se dozvědět více o Haar Cascades, klikněte na níže uvedené odkazy.
Stáhněte si již natrénované kaskády může být tady. V aktuálním příkladu budou kaskády použity k identifikaci obličeje osoby zepředu.
Chcete-li to provést, musíte vytvořit klasifikátor a vložit do něj již trénovaný soubor (odkaz je uveden výše). Již jsem nahrál soubor pencv_haarcascade_frontalface_default.xml do adresáře, kde se nachází náš program.
Chcete-li detekovat tváře na snímku, musíte použít metodu DetectMultiScale. Tato funkce vezme snímek (typ Mat), který byl právě přečten z video streamu kamery, a vrátí pole typu Rectangle. Velikost pole představuje počet tváří, které byl klasifikátor schopen detekovat v rámci. Poté, abychom se ujistili, že vidíme, co našel, projdeme seznam obdélníků a vytiskneme objekt Rectangle do konzoly, čímž vytvoříme ohraničení kolem detekovaného obdélníku. To lze provést pomocí funkce Obdélník. Přijme Mat čtenou kamerou, objekt Rectangle, který byl vrácen metodou DetectMultiScale, barvu a tloušťku okraje.
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 klaplo! Nyní máme jednoduchý systém rozpoznávání obličeje napsaný v Go. Brzy plánuji pokračovat v těchto experimentech a vytvářet nové skvělé věci kombinací Go a OpenCV.
V případě zájmu ohodnoťte webový server gRPC, který jsem napsal v Pythonu a OpenCV. Přenáší data v okamžiku, kdy je detekován obličej. To je základ pro vytváření různých klientů v různých programovacích jazycích. Budou se moci připojit k serveru a číst z něj data.