
OpenCV â njĂ« bibliotekĂ« e zhvilluar pĂ«r projekte nĂ« vizionin kompjuterik. Ajo ekziston prej rreth 20 vjetĂ«sh. E kam pĂ«rdorur qĂ« nĂ« kolegj dhe akoma e pĂ«rdor pĂ«r 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Ă« interesoi nĂ«se mund tâi aplikoj OpenCV pĂ«r kĂ«tĂ« gjuhĂ«. NĂ« atĂ« kohĂ« ishin tashmĂ« disa shembuj dhe tutoriale pĂ«r integrim, por mĂ« dukeshin shumĂ« tĂ« komplikuara. Pak mĂ« vonĂ« kalova nĂ« duar njĂ« wrapper tĂ« krijuar nga ekipi i 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 rublej pĂ«r regjistrimin nĂ« çdo kurs Skillbox me kodin promocional "Habr".
ĂfarĂ« do tĂ« nevojitet:
- Go;
- OpenCV (linket për instaluesin më poshtë);
- kamera web ose kamera e zakonshme.
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ë rrjedhës video të kamerës.
Së pari, duhet të importojmë bibliotekat e nevojshme për punë.
import (
"log"
"gocv.io/x/gocv"
)
Pasi të krijoni objektin VideoCapture duke përdorur funksionin VideoCaptureDevice. Ky i fundit lejon kapjen e videostream-it nga kamera. Funksioni përdor një numër të plotë si parametër (i cili përfaqëson ID-në e pajisjes).
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf(âgabim nĂ« hapjen e kamerĂ«s: %vâ, err)
}
defer webcam.Close()Tani nevojitet të krijoni një matricë n-dimensionale. Ajo do të ruajë imazhet e lexuara nga kamera.
img := gocv.NewMat()
defer img.Close()PĂ«r tĂ« shfaqur videopotimin nevojitet tĂ« krijoni njĂ« dritare â kjo mund tĂ« bĂ«het duke pĂ«rdorur funksionin NewWindow.
window := gocv.NewWindow(âwebcamwindowâ)
defer window.Close()Tani kalojmë në pjesën më interesante.
Pasi video përbën një stream të vazhdueshëm të kadrove-imazhe, do të nevojitet të krijoni një cikël të pafund për të lexuar vazhdimisht videopotimin e kamerës. Për këtë, nevojitet metoda Read e tipit VideoCapture. Ajo do të presë tipin Mat (matricën që krijuam më sipër), duke kthyer një vlerë logjike që tregon nëse kadri nga VideoCapture u lexua me sukses apo jo.
for {
if ok := webcam.Read(&img); !ok || img.Empty( {
log.Println(âNuk arriti tĂ« lexojĂ« nga kamerajaâ) continue
}
.
.
.
}Tani duhet tĂ« shfaqim kornizĂ«n nĂ« dritaren e krijuar. PavarĂ«sia pĂ«r kalimin nĂ« kornizĂ«n tjetĂ«r â 50 ms.
window.IMShow(img)
window.WaitKey(50)
Pas nisjes së aplikacionit, do të hapet një dritare me rrjedhën e videos 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("Nuk mund të lexoj nga webcam")
continue
}
window.IMShow(img)
window.WaitKey(50)
}
}Shembulli 2
Në këtë shembull, le ta përdorim shembullin e mëparshëm dhe krijojmë një sistem për njohjen e fytyrës duke u bazuar në Haar Cascades (kaskadat Haar).
Kaskadat Haar janë klasifikues kaskadë që trajnohen duke përdorur teknikën e valeve Haar. 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 më poshtë.
Shkarkoni kaskadat e stërvitura më parë . Në shembullin aktual, kaskadat do të përdoren për identifikimin e fytyrës së një personi nga përpara.
Për ta bërë këtë, nevojitet të krijojmë një klasifikues dhe t'i japim atij një skedar të trajnuar më parë (linku është dhënë më lart). Unë tashmë kam ngarkuar skedarin pencv_haarcascade_frontalface_default.xml në direktorinë 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, nevojitet të përdorim metodën . Kjo funksion merr një kadër (tipi Mat), i cili sapo është lexuar nga burimi i kamerës dhe kthen një varg të tipit Rectangle. Madhësia e vargut përfaqëson numrin e fytyrave që klasifikuesi arriti të zbulojë në kadrin e dhënë. Më pas, për t'u siguruar se po shohim atë që ai ka gjetur, le të kalojmë përmes listës së drejtkëndëshave dhe të nxjerrim objektin Rectangle në konsolë, duke krijuar një kufizim rreth drejtkëndëshit të zbuluar. Kjo mund të bëhet me anë të funksionit Rectangle. Ai do të marrë Mat, që është lexuar nga kamera, objektin Rectangle që është kthyer nga metoda DetectMultiScale, ngjyrën dhe trashësinë për kufizimin.
për _, r := range rects {
fmt.Println(âzbuluarâ, r)
gocv.Rectangle(&img, r, color, 2)
} 

paket 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 mund të lexoj nga pajisja")
continue
}
rects := classifier.DetectMultiScale(img)
for _, r := range rects {
fmt.Println("e zbuluar", r)
gocv.Rectangle(&img, r, color, 3)
}
window.IMShow(img)
window.WaitKey(50)
}
}Po⊠ia dolëm! Tani kemi një sistem të thjeshtë njohjeje të fytyrës të shkruar në Go. Në të ardhmen, planifikoj të vazhdoj këto eksperimentime dhe të krijoj gjëra të reja të mrekullueshme duke kombinuar Go dhe OpenCV.
Nëse jeni të interesuar, vlerësoni , i shkruar në Python dhe OpenCV. Ai streamon 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 programuese. Ata do të kenë mundësinë të lidhen me serverin dhe të lexojnë të dhënat prej tij.
Faleminderit që e lexuat artikullin!
Skillbox rekomandon:
- Kurs praktik dyvjeçar .
- Kurs online edukativ .
- Kurs praktik njëvjeçar .
Burimi: habr.com
