
OpenCV Àr ett bibliotek som utvecklats för projekt inom datorseende. Det har nu funnits i ungefÀr 20 Är. Jag anvÀnde det redan pÄ universitetet och anvÀnder det fortfarande för mina projekt i C++ och Python, eftersom det har ett bra stöd för dessa sprÄk.
Men nÀr jag började utforska och anvÀnda Go blev jag nyfiken pÄ om man kunde anvÀnda OpenCV med detta sprÄk. Det fanns redan exempel och tutorials för integration vid det tillfÀllet, men jag tyckte att de var för komplicerade. Lite senare kom jag i kontakt med en wrapper som skapats av teamet pÄ The Hybrid Group. I den hÀr artikeln kommer jag att visa hur man börjar med GoCV genom att utveckla ett enkelt ansiktsigenkÀnningssystem med Haar Cascades.
Skillbox rekommenderar: Praktisk kurs .
PĂ„minnelse: för alla lĂ€sare av "Habr" â 10 000 rubel rabatt vid registrering för vilken kurs som helst pĂ„ Skillbox med rabattkoden "Habr".
Vad som behövs:
- Go;
- OpenCV (lÀnkar till installerare nedan);
- en webbkamera eller vanlig kamera.
Installation
- Linux:
- macOS:
- Windows:
Exempel 1
I det första exemplet kommer vi att försöka skapa en applikation som öppnar ett fönster med en demonstration av videoströmmen frÄn kameran.
Först mÄste vi importera de bibliotek som behövs för att arbeta.
import (
âlogâ
âgocv.io/x/gocvâ
)
DÀrefter behöver vi skapa ett VideoCapture-objekt med hjÀlp av funktionen VideoCaptureDevice. Denna ger oss möjlighet att fÄnga videoströmmen med hjÀlp av kameran. Funktionen anvÀnder ett heltal som parameter (det representerar enhetens ID).
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf(âfel vid öppning av webbkameran: %vâ, err)
}
defer webcam.Close()Nu behöver vi skapa en n-dimensionell matris. Den kommer att lagra bilder som lÀses in frÄn kameran.
img := gocv.NewMat()
defer img.Close()För att visa videoströmmen behöver vi skapa ett fönster â detta kan göras med funktionen NewWindow.
window := gocv.NewWindow(âwebcamwindowâ)
defer window.Close()Nu gÄr vi vidare till den mest intressanta delen.
Eftersom videon Àr en kontinuerlig ström av bildrutor behöver vi skapa en oÀndlig loop för att kontinuerligt lÀsa videoströmmen frÄn kameran. För detta behövs metoden Read av typen VideoCapture. Den kommer att förvÀnta sig en typ Mat (matrisen vi skapade ovan), och returnera ett booleskt vÀrde som indikerar om en bildruta frÄn VideoCapture har lÀsts in framgÄngsrikt eller inte.
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println(âKunde inte lĂ€sa frĂ„n webbkameranâ) continue
}
.
.
.
}Nu behöver vi visa ramen i det skapade fönstret. Paus för att gĂ„ till nĂ€sta ram â 50 ms.
window.IMShow(img)
window.WaitKey(50)
NÀr applikationen körs öppnas ett fönster med videoströmmen frÄn kameran.

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)
}
}Exempel 2
I det hÀr exemplet ska vi anvÀnda det föregÄende exemplet och bygga ett system för ansiktsigenkÀnning baserat pÄ Haar Cascades.
Haar Cascades Àr kaskadklassificerare som trÀnas med hjÀlp av Haar-vÄgletetekniken. De analyserar pixlar i en bild för att upptÀcka specifika funktioner. För att lÀra dig mer om Haar Cascades kan du följa lÀnkarna nedan.
Ladda ner redan trÀnade kaskader . I det aktuella exemplet kommer kaskaderna att anvÀndas för att identifiera ett ansikte pÄ en person i frontprofil.
För att göra detta mÄste du skapa en klassificerare och mata den med en redan trÀnad fil (lÀnken ovan ger mer information). Jag har redan laddat upp filen opencv_haarcascade_frontalface_default.xml i katalogen dÀr vÄrt program finns.
harrcascade := "opencv_haarcascade_frontalface_default.xml"classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()För att upptÀcka ansikten i en bild mÄste du anvÀnda metoden . Denna funktion tar en bild (typ Mat) som just har lÀsts in frÄn kamerans videoström och returnerar en array av typen Rectangle. Storleken pÄ arrayen representerar antalet ansikten som klassificeraren kunde upptÀcka i bilden. För att se att vi faktiskt ser vad den har upptÀckt, lÄt oss gÄ igenom listan av rektanglar och skriva ut objektet Rectangle pÄ konsolen genom att skapa en kant runt den upptÀckta rektangeln. Detta kan göras med hjÀlp av funktionen Rectangle. Den tar Mat, som lÀsts in av kameran, objektet Rectangle som returnerades av metoden DetectMultiScale, fÀrgen och tjockleken för kanten.
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)
}
}Och ja, det blev bra! Nu har vi ett enkelt system för ansiktsigenkÀnning skrivet i Go. Snart planerar jag att fortsÀtta med dessa experiment och skapa nya coola grejer genom att kombinera Go och OpenCV.
Om du Àr intresserad, ge en bedömning , som jag skrev i Python och OpenCV. Den strÀmmar data i realtid nÀr den upptÀcker ett ansikte. Detta Àr grunden för att skapa olika klienter pÄ olika programmeringssprÄk. De kommer att kunna ansluta till servern och lÀsa data frÄn den.
Tack för att du lÀste artikeln!
Skillbox rekommenderar:
- TvÄÄrig praktisk kurs .
- Utbildningskurs online .
- Praktisk Ärskurs .
KĂ€lla: habr.com
