
OpenCV er et bibliotek designet for datasynsprosjekter. Hun er allerede rundt 20 Är gammel. Jeg brukte den pÄ college og bruker den fortsatt til C++- og Python-prosjektene mine fordi den har god stÞtte for disse sprÄkene.
Men da jeg begynte Ä lÊre og bruke Go, ble jeg interessert i om OpenCV kunne brukes til Ä jobbe med dette sprÄket. PÄ den tiden fantes det allerede eksempler og veiledninger om integrering, men det virket for meg som om de var for kompliserte. Litt senere kom jeg over en innpakning laget av The Hybrid Group-teamet. I denne artikkelen skal jeg vise deg hvordan du kommer i gang med GoCV ved Ä utvikle et enkelt ansiktsgjenkjenningssystem med Haar Cascades.
Skillbox anbefaler: Praktisk kurs .
Vi minner om: for alle lesere av "Habr" - en rabatt pÄ 10 000 rubler nÄr du melder deg pÄ et hvilket som helst Skillbox-kurs ved Ä bruke kampanjekoden "Habr".
Hva vil vĂŠre nĂždvendig:
- GĂ„;
- OpenCV (installasjonslenker nedenfor);
- web eller vanlig videokamera.
Installasjon
- Linux:
- macOS:
- Windows:
Eksempel 1
I det fÞrste eksemplet vil vi prÞve Ä lage en applikasjon som Äpner et vindu som viser en kameravideostrÞm.
FÞrst mÄ du importere bibliotekene som trengs for arbeid.
importere (
"Logg"
«gocv.io/x/gocv»
)
Etter dette mÄ du lage et VideoCapture-objekt ved hjelp av VideoCaptureDevice-funksjonen. Sistnevnte gjÞr det mulig Ä fange en videostrÞm ved hjelp av et kamera. Funksjonen bruker et heltall som en parameter (den representerer enhets-IDen).
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf(âerror opening web cam: %vâ, err)
}
defer webcam.Close()NÄ mÄ vi lage en n-dimensjonal matrise. Den vil lagre bilder lest fra kameraet.
img := gocv.NewMat()
defer img.Close()For Ä vise en videostrÞm, mÄ du opprette et vindu - dette kan gjÞres ved Ä bruke NewWindow-funksjonen.
window := gocv.NewWindow(âwebcamwindowâ)
defer window.Close()La oss nÄ gÄ videre til den mest interessante delen.
Siden video er en kontinuerlig strÞm av bilderammer, mÄ vi lage en uendelig slÞyfe for uendelig Ä lese kameraets videostrÞm. For Ä gjÞre dette trenger du lesemetoden av typen VideoCapture. Den vil forvente en Mat-type (matrisen vi opprettet ovenfor), som returnerer en boolsk verdi som indikerer om rammen fra VideoCapture ble lest vellykket eller ikke.
for {
if ok := webcam.Read(&img); !ok || img.Empty( {
log.Println(âUnable to read from the webcamâ) continue
}
.
.
.
}NÄ mÄ du vise rammen i det opprettede vinduet. Pausen for Ä gÄ til neste bilde er 50 ms.
window.IMShow(img)
window.WaitKey(50)
Etter Ä ha startet programmet, Äpnes et vindu med en videostrÞm fra kameraet.

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)
}
}Eksempel 2
I dette eksemplet, la oss bruke det forrige eksemplet og bygge et ansiktsgjenkjenningssystem basert pÄ Haar Cascades.
Haar-kaskader er kaskadeklassifiserere som er trent ved hjelp av Haar wavelet-teknikken. De analyserer pikslene i et bilde for Ă„ oppdage visse funksjoner. For Ă„ finne ut mer om Haar Cascades, fĂžlg lenkene nedenfor.
Last ned allerede trente kaskader . I det gjeldende eksemplet vil kaskader brukes til Ă„ identifisere en persons ansikt forfra.
For Ä gjÞre dette, mÄ du lage en klassifisering og mate den med en allerede opplÊrt fil (lenken er gitt ovenfor). Jeg har allerede lastet opp filen pencv_haarcascade_frontalface_default.xml til katalogen der programmet vÄrt ligger.
harrcascade := âopencv_haarcascade_frontalface_default.xmlâclassifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()For Ä oppdage ansikter i et bilde, mÄ du bruke metoden . Denne funksjonen tar en ramme (type Mat) som nettopp ble lest fra kameraets videostrÞm og returnerer en rekke av typen Rektangel. MatrisestÞrrelsen representerer antall ansikter som klassifisereren var i stand til Ä oppdage i rammen. Deretter, for Ä vÊre sikker pÄ at vi ser hva den fant, la oss iterere gjennom listen over rektangler og skrive ut Rectangle-objektet til konsollen, og lage en kant rundt det oppdagede rektangelet. Dette kan gjÞres ved Ä bruke rektangelfunksjonen. Den vil godta matten som er lest av kameraet, rektangelobjektet som ble returnert av DetectMultiScale-metoden, fargen og tykkelsen for kantlinjen.
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)
}
}Og... ja, alt ordnet seg! Vi har nÄ et enkelt ansiktsgjenkjenningssystem skrevet i Go. Snart planlegger jeg Ä fortsette disse eksperimentene og lage nye kule ting ved Ä kombinere Go og OpenCV.
Hvis du er interessert, vennligst vurder , som jeg skrev i Python og OpenCV. Den strÞmmer data i det Þyeblikket et ansikt oppdages. Dette er grunnlaget for Ä lage forskjellige klienter pÄ forskjellige programmeringssprÄk. De vil kunne koble til serveren og lese data fra den.
Takk for at du leste artikkelen!
Skillbox anbefaler:
- ToÄrig praktisk kurs .
- Pedagogisk nettkurs .
- Praktisk Ärskurs .
Kilde: www.habr.com
