Bini ta' sistema ta' rikonoxximent tal-wiċċ ibbażata fuq Golang u OpenCV

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.

Skillbox jirrakkomanda: Kors prattiku "Żviluppatur Python mill-bidu".

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".

X'se jkun meħtieġ:

  • Mur;
  • OpenCV (links tal-installatur hawn taħt);
  • web jew kamera tal-vidjo regolari.

Installazzjoni

1 Eżempju

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.

window := gocv.NewWindow(“webcamwindow”)
defer window.Close()

Issa ejja ngħaddu għall-aktar parti interessanti.

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.

Bini ta' sistema ta' rikonoxximent tal-wiċċ ibbażata fuq Golang u OpenCV

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.

Qafas ta 'skoperta ta' oġġetti Viola-Jones
Klassifikaturi kaskati
Karatteristika bħal Haar

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.

harrcascade := “opencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()

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)
}

Bini ta' sistema ta' rikonoxximent tal-wiċċ ibbażata fuq Golang u OpenCV

Bini ta' sistema ta' rikonoxximent tal-wiċċ ibbażata fuq Golang u OpenCV

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.

Grazzi talli qrajt l-artiklu!

Skillbox jirrakkomanda:

Sors: www.habr.com

Żid kumment