Bini ta' sistema ta' rikonoxximent tal-wiċċ ibbażata fuq Golang u OpenCV
OpenCV hija librerija ddisinjata għal proġetti ta’ viżjoni bil-kompjuter. Diġà għandha madwar 20 sena. Użajtha fil-kulleġġ u għadni nużaha għall-proġetti tiegħi C++ u Python għax għandha appoġġ tajjeb għal dawk il-lingwi.
Imma meta bdejt nitgħallem u nuża l-Go, bdejt ninteressa ruħi jekk OpenCV jistax jintuża biex jaħdem b’din il-lingwa. Dak iż-żmien, diġà kien hemm eżempji u tutorials dwar l-integrazzjoni, iżda deherli li kienu kkumplikati wisq. Ftit wara, iltqajt ma' wrapper maħluq mit-tim ta' The Hybrid Group. F'dan l-artikolu, ser nuruk kif tibda bil-GoCV billi tiżviluppa sistema sempliċi ta' rikonoxximent tal-wiċċ b'Haar Cascades.
Infakkrukom:għall-qarrejja kollha ta '"Habr" - skont ta' 10 rublu meta tirreġistra fi kwalunkwe kors ta 'Skillbox billi tuża l-kodiċi promozzjonali "Habr".
Fl-ewwel eżempju, se nippruvaw noħolqu applikazzjoni li tiftaħ tieqa li turi nixxiegħa tal-vidjo tal-kamera.
L-ewwel trid timporta l-libreriji meħtieġa għax-xogħol.
importa (
"zokk maqtugħ"
“gocv.io/x/gocv”
)
Wara dan, għandek bżonn toħloq oġġett VideoCapture billi tuża l-funzjoni VideoCaptureDevice. Dan tal-aħħar jagħmilha possibbli li jinqabad video stream bl-użu ta 'kamera. Il-funzjoni tuża numru sħiħ bħala parametru (jirrappreżenta l-ID tal-apparat).
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf(“error opening web cam: %v”, err)
}
defer webcam.Close()
Issa għandna bżonn noħolqu matriċi n-dimensjonali. Se taħżen immaġini moqrija mill-kamera.
img := gocv.NewMat()
defer img.Close()
Biex turi nixxiegħa tal-vidjo, trid toħloq tieqa - dan jista 'jsir bl-użu tal-funzjoni NewWindow.
Peress li l-vidjo huwa fluss kontinwu ta 'frejms ta' l-immaġini, ser ikollna bżonn noħolqu linja infinita biex naqraw bla tmiem in-nixxiegħa tal-vidjo tal-kamera. Biex tagħmel dan, għandek bżonn il-metodu Aqra tat-tip VideoCapture. Se jistenna tip Mat (il-matriċi li ħloqna hawn fuq), li jirritorna valur boolean li jindika jekk il-qafas mill-VideoCapture inqrax b'suċċess jew le.
for {
if ok := webcam.Read(&img); !ok || img.Empty( {
log.Println(“Unable to read from the webcam”) continue
}
.
.
.
}
Issa għandek bżonn turi l-qafas fit-tieqa maħluqa. Il-pawża biex timxi għall-qafas li jmiss hija ta' 50 ms.
tieqa.IMShow(img)
tieqa.WaitKey(50)
Wara li tniedi l-applikazzjoni, tinfetaħ tieqa bi fluss tal-vidjo mill-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 Eżempju
F'dan l-eżempju, ejja nużaw l-eżempju preċedenti u nibnu sistema ta 'rikonoxximent tal-wiċċ ibbażata fuq Haar Cascades.
Il-kaskati Haar huma klassifikaturi tal-kaskati li huma mħarrġa bl-użu tat-teknika tal-wavelet Haar. Huma janalizzaw il-pixels f'immaġini biex jiskopru ċerti karatteristiċi. Biex issir taf aktar dwar Haar Cascades, jekk jogħġbok segwi l-links hawn taħt.
Niżżel kaskati diġà mħarrġa jista 'jkun hawn. Fl-eżempju attwali, kaskati se jintużaw biex jidentifikaw wiċċ persuna minn quddiem.
Sabiex tagħmel dan, għandek bżonn toħloq klassifikatur u tmigħlu fajl diġà mħarreġ (il-link hija mogħtija hawn fuq). Diġà tellajt il-fajl pencv_haarcascade_frontalface_default.xml fid-direttorju fejn jinsab il-programm tagħna.
Biex tiskopri uċuħ f'immaġini, trid tuża l-metodu DetectMultiScale. Din il-funzjoni tieħu qafas (tip Mat) li kien għadu kemm jinqara mill-fluss tal-vidjo tal-kamera u jirritorna firxa tat-tip Rettangolu. Id-daqs tal-firxa jirrappreżenta n-numru ta 'uċuħ li l-klassifikatur seta' jiskopri fil-qafas. Imbagħad, biex niżguraw li naraw dak li sabet, ejja ngħaddu mill-lista ta 'rettangoli u tipprintja l-oġġett Rettangolu fuq il-console, u noħolqu fruntiera madwar ir-rettangolu misjuba. Dan jista 'jsir bl-użu tal-funzjoni Rettangolu. Se jaċċetta t-Tapit moqri mill-kamera, l-oġġett Rettangolu li ġie rritornat mill-metodu DetectMultiScale, il-kulur u l-ħxuna għall-fruntiera.
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)
}
}
U... iva, kollox ħareġ! Issa għandna sistema sempliċi ta’ rikonoxximent tal-wiċċ miktuba f’Go. Dalwaqt nippjana li nkompli dawn l-esperimenti u noħloq affarijiet ġodda ġodda billi ngħaqqad Go u OpenCV.
Jekk inti interessat, jekk jogħġbok rata server tal-web gRPC, li ktibt f'Python u OpenCV. Jixxandar dejta fil-mument li wiċċ jiġi skopert. Din hija l-bażi għall-ħolqien ta 'klijenti differenti f'lingwi ta' programmar differenti. Huma jkunu jistgħu jikkonnettjaw mas-server u jaqraw id-dejta minnu.