
OpenCV është një bibliotekë e krijuar për projekte të vizionit kompjuterik. Ajo tashmë është rreth 20 vjeç. E kam përdorur në kolegj dhe ende e përdor për projektet e mia C++ dhe Python sepse ka mbështetje të mirë për ato gjuhë.
Por kur fillova të mësoj dhe të përdor Go, u interesova nëse OpenCV mund të përdoret për të punuar me këtë gjuhë. Në atë kohë, tashmë kishte shembuj dhe mësime për integrimin, por më dukej se ishin shumë të ndërlikuara. Pak më vonë, hasa në një mbështjellës të krijuar nga ekipi i Grupit Hybrid. Në këtë artikull, unë do t'ju tregoj se si të filloni me GoCV duke zhvilluar një sistem të thjeshtë të njohjes së fytyrës me Haar Cascades.
Skillbox rekomandon: Kurse praktike .
Kujtojmë: për të gjithë lexuesit e "Habr" - një zbritje prej 10 rubla kur regjistroheni në çdo kurs Skillbox duke përdorur kodin promovues "Habr".
Çfarë ju duhet:
- Shko;
- OpenCV (lidhjet e instaluesit më poshtë);
- kamera web ose video e zakonshme.
Instalim
- Linux:
- macOS:
- Windows:
1 Shembull
Në shembullin e parë, ne do të përpiqemi të krijojmë një aplikacion që hap një dritare që tregon një transmetim video me kamerë.
Së pari ju duhet të importoni bibliotekat e nevojshme për punë.
import (
"log"
"gocv.io/x/gocv"
)
Pas kësaj, duhet të krijoni një objekt VideoCapture duke përdorur funksionin VideoCaptureDevice. Kjo e fundit bën të mundur kapjen e një transmetimi video duke përdorur një aparat fotografik. Funksioni përdor një numër të plotë si parametër (ai përfaqëson ID-në e pajisjes).
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf(“error opening web cam: %v”, err)
}
defer webcam.Close()Tani duhet të krijojmë një matricë n-dimensionale. Do të ruajë imazhet e lexuara nga kamera.
img := gocv.NewMat()
defer img.Close()Për të shfaqur një transmetim video, duhet të krijoni një dritare - kjo mund të bëhet duke përdorur funksionin NewWindow.
window := gocv.NewWindow(“webcamwindow”)
defer window.Close()Tani le të kalojmë në pjesën më interesante.
Meqenëse video është një rrjedhë e vazhdueshme e kornizave të imazhit, do të na duhet të krijojmë një lak të pafund për të lexuar pafundësisht transmetimin e videos së kamerës. Për ta bërë këtë, ju nevojitet metoda Read të llojit VideoCapture. Do të presë një lloj Mat (matrica që krijuam më lart), duke kthyer një vlerë boolean që tregon nëse korniza nga VideoCapture është lexuar me sukses apo jo.
for {
if ok := webcam.Read(&img); !ok || img.Empty( {
log.Println(“Unable to read from the webcam”) continue
}
.
.
.
}Tani duhet të shfaqni kornizën në dritaren e krijuar. Pauza për të kaluar në kuadrin tjetër është 50 ms.
dritare.IMShow(img)
dritare.WaitKey(50)
Pas nisjes së aplikacionit, do të hapet një dritare me një transmetim video nga kamera.

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)
}
}2 Shembull
Në këtë shembull, le të përdorim shembullin e mëparshëm dhe të ndërtojmë një sistem të njohjes së fytyrës bazuar në Haar Cascades.
Kaskadat Haar janë klasifikues kaskadë që janë trajnuar duke përdorur teknikën e valëzimit Haar. Ata analizojnë pikselët në një imazh për të zbuluar veçori të caktuara. Për të mësuar më shumë rreth Haar Cascades, ju lutemi ndiqni lidhjet e mëposhtme.
Shkarkoni kaskada të trajnuara tashmë . Në shembullin aktual, kaskadat do të përdoren për të identifikuar fytyrën e një personi nga përpara.
Për ta bërë këtë, duhet të krijoni një klasifikues dhe ta ushqeni atë me një skedar tashmë të trajnuar (lidhja është dhënë më lart). Unë e kam ngarkuar tashmë skedarin pencv_haarcascade_frontalface_default.xml në drejtorinë ku ndodhet programi ynë.
harrcascade := “opencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()Për të zbuluar fytyrat në një imazh, duhet të përdorni metodën . Ky funksion merr një kornizë (lloji Mat) që sapo u lexua nga transmetimi i videos së kamerës dhe kthen një grup të tipit Rectangle. Madhësia e grupit përfaqëson numrin e fytyrave që klasifikuesi ishte në gjendje të zbulonte në kornizë. Pastaj, për t'u siguruar që shohim se çfarë gjeti, le të përsërisim listën e drejtkëndëshave dhe të printojmë objektin Rectangle në tastierë, duke krijuar një kufi rreth drejtkëndëshit të zbuluar. Kjo mund të bëhet duke përdorur funksionin Rectangle. Do të pranojë Matin e lexuar nga kamera, objektin Rectangle që është kthyer me metodën DetectMultiScale, ngjyrën dhe trashësinë për kufirin.
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)
}
}Dhe... po, gjithçka funksionoi! Tani kemi një sistem të thjeshtë të njohjes së fytyrës të shkruar në Go. Së shpejti kam në plan të vazhdoj këto eksperimente dhe të krijoj gjëra të reja interesante duke kombinuar Go dhe OpenCV.
Nëse jeni të interesuar, ju lutemi vlerësoni , të cilën e kam shkruar në Python dhe OpenCV. Ai transmeton të dhëna në momentin që zbulohet një fytyrë. Kjo është baza për krijimin e klientëve të ndryshëm në gjuhë të ndryshme programimi. Ata do të jenë në gjendje të lidhen me serverin dhe të lexojnë të dhëna prej tij.
Faleminderit që lexuat artikullin!
Skillbox rekomandon:
- Kurse praktike dyvjeçare .
- Kurs edukativ online .
- Kursi praktik i vitit .
Burimi: www.habr.com
