
OpenCV — një bibliotekë e zhvilluar për projekte në vizionin kompjuterik. Ajo është rreth 20 vjeçare. E kam përdorur që në kolegj dhe vazhdoj ta aplikoj në projektet e mia në C++ dhe Python, pasi ka mbështetje të mirë për këto gjuhë.
Por kur fillova të studioja dhe të përdorja Go, m’u bë interesant të di nëse mund të aplikoj OpenCV me këtë gjuhë. Në atë kohë ishin të pranishëm shembuj dhe tutoriale për integrimin, por më dukeshin shumë të komplikuara. Pak më vonë më ra në dorë një wrapper i krijuar nga ekipi The Hybrid Group. Në këtë artikull do të tregoj se si të filloni me GoCV, duke zhvilluar një sistem të thjeshtë për njohjen e fytyrave me kaskadat Haar (Haar Cascades).
Skillbox rekomandon: Kurs praktik .
Kujtojmë: për të gjithë lexuesit e «Habra» — zbritje prej 10,000 rublesh për regjistrimin në çdo kurs Skillbox me kodin promovues «Habr».
Çfarë do të kërkohet:
- Go;
- OpenCV (linkat për instaluesin më poshtë);
- një kamerë web ose normale.
Instalimi
- Linux:
- macOS:
- Windows:
Shembulli 1
Në shembullin e parë do të përpiqemi të krijojmë një aplikacion që hap një dritare me një demonstrim të videokanalit nga kamera.
Së pari duhet të importojmë bibliotekat e nevojshme për funksionim.
import (
“log”
“gocv.io/x/gocv”
)
Më pas, duhet të krijojmë një objekt VideoCapture duke përdorur funksionin VideoCaptureDevice. Ky i fundit lejon kapjen e videokanalit përmes kamerës. Në funksion përdoret një numër i plotë si parametër (ai paraqet 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. Ajo do të ruajë imazhet e lexuara nga kamera.
img := gocv.NewMat()
defer img.Close()Për të shfaqur videokanalin, duhet të krijojmë një dritare — kjo mund të bëhet me funksionin NewWindow.
window := gocv.NewWindow(“webcamwindow”)
defer window.Close()Tani kalojmë në pjesën më interesante.
Duke qenë se video është një rrjedhë e vazhdueshme e кадров, do të na duhet të krijojmë një cikël të pafund për të lexuar vazhdimisht videokanalin e kamerës. Për këtë është i nevojshëm metoda Read e tipit VideoCapture. Ajo do të presë një tip Mat (matrica që krijuam më sipër), duke kthyer një vlerë logjike që tregon nëse кадр nga VideoCapture u lexua me sukses ose jo.
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println(“Unable to read from the webcam”) continue
}
.
.
.
}Tani duhet të shfaqim кадр në dritaren e krijuar. Ndalesa për kalimin në кадр tjetër — 50 ms.
window.IMShow(img)
window.WaitKey(50)
Pas nisjes së aplikacionit, do të hapet një dritare me videokanalin nga kamera.

paketa kryesore
import (
"log"
"gocv.io/x/gocv"
)
func kryesore() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("gabim në hapjen e pajisjes: %v", err)
}
defer webcam.Close()
img := gocv.NewMat()
defer img.Close()
window := gocv.NewWindow("window_webcam")
defer window.Close()
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Nuk mund të lexojmë nga webcam")
continue
}
window.IMShow(img)
window.WaitKey(50)
}
}Shembulli 2
Në këtë shembull, le të përdorim shembullin e mëparshëm dhe të ndërtojmë një sistem për njohjen e fytyrave bazuar në Haar Cascades.
Haar Cascades janë klasifikues kaskadë, të cilët trajnohen në bazë të teknikës Haar wavelets. Ato analizojnë pikselët në imazh për të zbuluar karakteristika të caktuara. Për të mësuar më shumë rreth Haar Cascades, mund të ndiqni lidhjet e mëposhtme.
Shkarkoni klasifikuesit e stërvitur tashmë . Në shembullin aktual, klasifikuesit do të përdoren për identifikimin e fytyrës së një personi nga balli.
Për ta bërë këtë, duhet të krijoni një klasifikues dhe t'i ushqeni atij një skedar të stërvitur (linku i mësipërm jepet). Unë tashmë kam ngarkuar skedarin opencv_haarcascade_frontalface_default.xml në direktoriumin 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ë imazh, duhet të përdorni metodën . Kjo funksion merr një kadër (tip Mat), i cili sapo është lexuar nga video-streami i kamerës dhe kthen një array të tipit Rectangle. Madhësia e array-t tregon numrin e fytyrave që klasifikuesi ka arritur të zbulojë në kadër. Pastaj, për t'u siguruar se ne shohim atë që ai ka gjetur, le të kalojmë përmes listës së drejtkëndëshëve dhe të nxjerrim objektin Rectangle në konsolë, duke krijuar një kufi përreth drejtkëndëshit të zbuluar. Kjo mund të bëhet me anë të funksionit Rectangle. Ai do të pranojë Mat, të lexuar nga kamera, objektin Rectangle, i cili u kthye nga metoda DetectMultiScale, ngjyrën dhe trashësinë për kufirin.
for _, r := range rects {
fmt.Println("zbuluar", r)
gocv.Rectangle(&img, r, color, 2)
} 

pako kryesor
import (
"fmt"
"image/color"
"log"
"gocv.io/x/gocv"
)
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("gabim në hapjen e kamerës: %v", err)
}
defer webcam.Close()
img := gocv.NewMat()
defer img.Close()
window := gocv.NewWindow("dritarja e kamerës")
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("Nuk arritëm të lexojmë nga pajisja")
continue
}
rects := classifier.DetectMultiScale(img)
for _, r := range rects {
fmt.Println("e identifikuar", r)
gocv.Rectangle(&img, r, color, 3)
}
window.IMShow(img)
window.WaitKey(50)
}
}Po… ia dolëm! Tani kemi një sistem të thjeshtë për njohjen e fytyrave, të shkruar në Go. Së shpejti planifikoj të vazhdoj këto eksperimente dhe të krijoj gjëra të reja interesante duke kombinuar Go dhe OpenCV.
Nëse jeni të interesuar, ju lutem vlerësoni , i cili e kam shkruar në Python dhe OpenCV. Ai transmeton të dhëna në momentin e zbulesës së fytyrës. Kjo është baza për krijimin e klientëve të ndryshëm në gjuhë të ndryshme programimi. Ata do të mund të lidhen me serverin dhe të nxjerrin të dhëna nga ai.
Faleminderit që e lexuat artikullin!
Skillbox rekomandon:
- Kursi praktik dyvjeçar .
- Kurs online edukativ .
- Kurs praktik njëvjeçar .
Burimi: habr.com
