
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
