{"id":36726,"date":"2019-10-31T22:13:23","date_gmt":"2019-10-31T19:13:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/stroim-sistemu-raspoznavaniya-lits-na-osnove-golang-i-opencv\/"},"modified":"2019-10-31T22:13:23","modified_gmt":"2019-10-31T19:13:23","slug":"stroim-sistemu-raspoznavaniya-lits-na-osnove-golang-i-opencv","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sk\/blog\/news\/stroim-sistemu-raspoznavaniya-lits-na-osnove-golang-i-opencv","title":{"rendered":"Staviame syst\u00e9m rozpozn\u00e1vania tv\u00e1re na z\u00e1klade Golang a OpenCV","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Staviame syst\u00e9m rozpozn\u00e1vania tv\u00e1re na z\u00e1klade Golang a OpenCV\" src=\"\/wp-content\/uploads\/2019\/08\/053427f29ed319ede4498f2239044341.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOpenCV \u2014 kni\u017enica, vytvoren\u00e1 pre projekty v oblasti po\u010d\u00edta\u010dov\u00e9ho videnia. Existuje u\u017e pribli\u017ene 20 rokov. Pou\u017e\u00edval som ju e\u0161te na vysokej \u0161kole a dodnes ju aplikujem vo svojich projektoch v C++ a Pythone, preto\u017ee m\u00e1 dobr\u00fa podporu t\u00fdchto jazykov.<\/p>\n<p>Ale ke\u010f som za\u010dal \u0161tudova\u0165 a pou\u017e\u00edva\u0165 Go, zauj\u00edmalo ma, \u010di je mo\u017en\u00e9 aplikova\u0165 OpenCV pre pr\u00e1cu s t\u00fdmto jazykom. V tom \u010dase u\u017e existovali pr\u00edklady a n\u00e1vody na integr\u00e1ciu, ale zdalo sa mi, \u017ee s\u00fa pr\u00edli\u0161 zlo\u017eit\u00e9. O nie\u010do nesk\u00f4r sa mi dostal do r\u00fak wrapper vytvoren\u00fd t\u00edmom The Hybrid Group. V tomto \u010dl\u00e1nku uk\u00e1\u017eem, ako za\u010da\u0165 s GoCV, vyvinut\u00edm jednoduch\u00e9ho syst\u00e9mu rozpozn\u00e1vania tv\u00e1r\u00ed s Haarov\u00fdmi kask\u00e1dami.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox odpor\u00fa\u010da:<\/b> Praktick\u00fd kurz <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/python\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=PTNDEV&amp;utm_content=articles&amp;utm_term=govideo\">\u201ePython-developer od nuly\u201c<\/a><\/noindex>.<\/p>\n<p><b>Pripom\u00edname:<\/b> <i>pre v\u0161etk\u00fdch \u010ditate\u013eov \u201eHabr\u201c \u2014 z\u013eava 10 000 rub\u013eov pri zap\u00edsan\u00ed na ak\u00fdko\u013evek kurz Skillbox s promo k\u00f3dom \u201eHabr\u201c.<\/i>\n<\/p><\/blockquote>\n<p>\n<b>\u010co bude potrebn\u00e9:<\/b><\/p>\n<ul>\n<li>Go;<\/li>\n<li>OpenCV (odkazy na in\u0161tala\u010dn\u00fd s\u00fabor ni\u017e\u0161ie);<\/li>\n<li>webov\u00e1 alebo be\u017en\u00e1 videokamera.<\/li>\n<\/ul>\n<p>\n<b>In\u0161tal\u00e1cia<\/b><\/p>\n<ul>\n<li>Linux: <noindex><a rel=\"nofollow\" href=\"https:\/\/gocv.io\/getting-started\/linux\/\">gocv.io\/getting-started\/linux<\/a><\/noindex><\/li>\n<li>macOS: <noindex><a rel=\"nofollow\" href=\"https:\/\/gocv.io\/getting-started\/macos\/\">gocv.io\/getting-started\/macos<\/a><\/noindex><\/li>\n<li>Windows: <noindex><a rel=\"nofollow\" href=\"https:\/\/gocv.io\/getting-started\/windows\/\">gocv.io\/getting-started\/windows<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<h3>Pr\u00edklad 1<\/h3>\n<p>\nV prvom pr\u00edklade sa pok\u00fasime vytvori\u0165 aplik\u00e1ciu, ktor\u00e1 otvor\u00ed okno s demon\u0161tr\u00e1ciou videostreamu kamery.<\/p>\n<p>Najprv je potrebn\u00e9 importova\u0165 kni\u017enice potrebn\u00e9 na pr\u00e1cu.<\/p>\n<p><i>import (<br \/>\n \u201clog\u201d<br \/>\n \u201cgocv.io\/x\/gocv\u201d<br \/>\n)<\/i><\/p>\n<p>Potom je potrebn\u00e9 vytvori\u0165 objekt VideoCapture pomocou funkcie VideoCaptureDevice. T\u00e1to funkcia umo\u017e\u0148uje zachyt\u00e1va\u0165 videostream pomocou kamery. V funkcii sa pou\u017e\u00edva cel\u00e9 \u010d\u00edslo ako parameter (predstavuje ID zariadenia).<\/p>\n<pre><code class=\"go\">webcam, err := gocv.VideoCaptureDevice(0)\nif err != nil {    log.Fatalf(\u201cerror opening web cam: %v\u201d, err)\n}\ndefer webcam.Close()<\/code><\/pre>\n<p>\nTeraz je potrebn\u00e9 vytvori\u0165 n-rozmern\u00fa maticu. T\u00e1to matica bude uchov\u00e1va\u0165 obr\u00e1zky pre\u010d\u00edtan\u00e9 z kamery.<\/p>\n<pre><code class=\"go\">img := gocv.NewMat()\ndefer img.Close()<\/code><\/pre>\n<p>\nNa zobrazenie videostreamu je potrebn\u00e9 vytvori\u0165 okno \u2014 to je mo\u017en\u00e9 dosiahnu\u0165 pomocou funkcie NewWindow.<\/p>\n<pre><code class=\"go\">window := gocv.NewWindow(\u201cwebcamwindow\u201d)\ndefer window.Close()<\/code><\/pre>\n<p>\nTeraz prejdeme k najzauj\u00edmavej\u0161ej \u010dasti.<\/p>\n<p>Ke\u010f\u017ee video predstavuje nepretr\u017eit\u00fd pr\u00fad sn\u00edmok-obr\u00e1zkov, mus\u00edme vytvori\u0165 nekone\u010dn\u00fd cyklus na nepretr\u017eit\u00e9 \u010d\u00edtanie videostreamu kamery. Na to potrebujeme met\u00f3du Read typu VideoCapture. T\u00e1to met\u00f3da bude o\u010dak\u00e1va\u0165 typ Mat (matrica, ktor\u00fa sme vytvorili vy\u0161\u0161ie), vracaj\u00faca logick\u00fa hodnotu, ktor\u00e1 indikuje, \u010di bola sn\u00edmka z VideoCapture \u00faspe\u0161ne pre\u010d\u00edtan\u00e1 alebo nie.<\/p>\n<pre><code class=\"go\">for {     \n        if ok := webcam.Read(&amp;img); !ok || img.Empty() {\n        log.Println(\u201cUnable to read from the webcam\u201d)    continue\n     }\n.\n.\n.\n}<\/code><\/pre>\n<p>\nTeraz je potrebn\u00e9 zobrazi\u0165 sn\u00edmku v vytvorenom okne. Pauza pre prechod k nasleduj\u00facej sn\u00edmke \u2014 50 ms.<\/p>\n<p><i>window.IMShow(img)<br \/>\nwindow.WaitKey(50)<\/i><\/p>\n<p>Po spusten\u00ed aplik\u00e1cie sa otvor\u00ed okno s videostreamom z kamery.<\/p>\n<p><img decoding=\"async\" alt=\"Staviame syst\u00e9m rozpozn\u00e1vania tv\u00e1re na z\u00e1klade Golang a OpenCV\" src=\"\/wp-content\/uploads\/2019\/08\/02677722c3c3fb867f73917c53031f07.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<pre><code class=\"go\">package main\n \nimport (\n\"log\"\n \n\"gocv.io\/x\/gocv\"\n)\n \nfunc main() {\nwebcam, err := gocv.VideoCaptureDevice(0)\nif err != nil {\n    log.Fatalf(\"error opening device: %v\", err)\n}\ndefer webcam.Close()\n \nimg := gocv.NewMat()\ndefer img.Close()\n \nwindow := gocv.NewWindow(\"webcamwindow\")\ndefer window.Close()\n \nfor {\nif ok := webcam.Read(&amp;img); !ok || img.Empty() {\nlog.Println(\"Unable to read from the webcam\")\ncontinue\n}\n \nwindow.IMShow(img)\nwindow.WaitKey(50)\n}\n}<\/code><\/pre>\n<p><\/p>\n<h3>Pr\u00edklad 2<\/h3>\n<p>\nV tomto pr\u00edklade vyu\u017eijeme predch\u00e1dzaj\u00faci pr\u00edklad a vybudujeme syst\u00e9m na rozpozn\u00e1vanie tv\u00e1r\u00ed na z\u00e1klade Haar Cascades.<\/p>\n<p>Haar Cascades s\u00fa kask\u00e1dov\u00e9 klasifik\u00e1tory, ktor\u00e9 sa tr\u00e9nuj\u00fa na z\u00e1klade techniky Haar wavelet. Analyzuj\u00fa pixely v obr\u00e1zku na detekciu ur\u010dit\u00fdch rysov. Viac inform\u00e1ci\u00ed o Haar Cascades n\u00e1jdete v ni\u017e\u0161ie uveden\u00fdch odkazoch.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.cs.ubc.ca\/~lowe\/425\/slides\/13-ViolaJones.pdf?source=post_page---------------------------\">R\u00e1mec detekcie objektov Viola-Jones<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Cascading_classifiers?source=post_page---------------------------\">Kask\u00e1dov\u00e9 klasifik\u00e1tory<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Haar-like_feature?source=post_page---------------------------\">Haar-like rys<\/a><\/noindex><\/p>\n<p>Stiahnu\u0165 u\u017e natr\u00e9novan\u00e9 kask\u00e1dy <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opencv\/opencv\/tree\/master\/data\/haarcascades?source=post_page---------------------------\">m\u00f4\u017eete tu<\/a><\/noindex>. V aktu\u00e1lnom pr\u00edklade bud\u00fa kask\u00e1dy pou\u017eit\u00e9 na identifik\u00e1ciu tv\u00e1re \u010dloveka \u010delom.<\/p>\n<p>Aby sme to dosiahli, mus\u00edme vytvori\u0165 klasifik\u00e1tor a poskytn\u00fa\u0165 mu u\u017e natr\u00e9novan\u00fd s\u00fabor (odkaz je uveden\u00fd vy\u0161\u0161ie). U\u017e som nahr\u00e1l s\u00fabor opencv_haarcascade_frontalface_default.xml do adres\u00e1ra, kde sa nach\u00e1dza n\u00e1\u0161 program.<\/p>\n<pre><code class=\"go\">harrcascade := \u201copencv_haarcascade_frontalface_default.xml\u201dclassifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)\ndefer classifier.Close()<\/code><\/pre>\n<p>\nNa detekciu tv\u00e1r\u00ed na obr\u00e1zku mus\u00edme pou\u017ei\u0165 met\u00f3du <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hybridgroup\/gocv\/blob\/master\/objdetect.go?source=post_page---------------------------#L51\">DetectMultiScale<\/a><\/noindex>. T\u00e1to funkcia prij\u00edma sn\u00edmku (typ Mat), ktor\u00e1 bola pr\u00e1ve pre\u010d\u00edtan\u00e1 z videostreamu kamery a vracia pole typu Rectangle. Ve\u013ekos\u0165 po\u013ea predstavuje po\u010det tv\u00e1r\u00ed, ktor\u00e9 klasifik\u00e1tor dok\u00e1zal odhali\u0165 v sn\u00edmke. Potom, aby sme sa uistili, \u017ee vid\u00edme to, \u010do na\u0161iel, prejdeme zoznamom obd\u013a\u017enikov a vyp\u00ed\u0161eme objekt Rectangle na konzolu vytvoren\u00edm r\u00e1m\u010deka okolo odhalen\u00e9ho obd\u013a\u017enika. To m\u00f4\u017eeme urobi\u0165 pomocou funkcie Rectangle. Bude prij\u00edma\u0165 Mat, pre\u010d\u00edtan\u00fd kamerou, objekt Rectangle, ktor\u00fd bol vr\u00e1ten\u00fd met\u00f3dou DetectMultiScale, farbu a hr\u00fabku r\u00e1m\u010deka.<\/p>\n<pre><code class=\"go\">for _, r := range rects {\nfmt.Println(\"detected\", r)\ngocv.Rectangle(&amp;img, r, color, 2)\n}<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Staviame syst\u00e9m rozpozn\u00e1vania tv\u00e1re na z\u00e1klade Golang a OpenCV\" src=\"\/wp-content\/uploads\/2019\/08\/5c9128572d0f832325b2d19dd0d03b61.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<img decoding=\"async\" alt=\"Staviame syst\u00e9m rozpozn\u00e1vania tv\u00e1re na z\u00e1klade Golang a OpenCV\" src=\"\/wp-content\/uploads\/2019\/08\/57a901331c7f109067c7f254f982a2b0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<pre><code class=\"go\">package main\n \nimport (\n\"fmt\"\n\"image\/color\"\n\"log\"\n \n\"gocv.io\/x\/gocv\"\n)\n \nfunc main() {\nwebcam, err := gocv.VideoCaptureDevice(0)\nif err != nil {\nlog.Fatalf(\"error opening web cam: %v\", err)\n}\ndefer webcam.Close()\n \nimg := gocv.NewMat()\ndefer img.Close()\n \nwindow := gocv.NewWindow(\"webcamwindow\")\ndefer window.Close()\n \nharrcascade := \"opencv_haarcascade_frontalface_default.xml\"\nclassifier := gocv.NewCascadeClassifier()\nclassifier.Load(harrcascade)\ndefer classifier.Close()\n \ncolor := color.RGBA{0, 255, 0, 0}\nfor {\nif ok := webcam.Read(&amp;img); !ok || img.Empty() {\nlog.Println(\"Unable to read from the device\")\ncontinue\n}\n \nrects := classifier.DetectMultiScale(img)\nfor _, r := range rects {\nfmt.Println(\"detected\", r)\ngocv.Rectangle(&amp;img, r, color, 3)\n}\n \nwindow.IMShow(img)\nwindow.WaitKey(50)\n}\n}<\/code><\/pre>\n<p>\n\u00c1no, podarilo sa to! Teraz m\u00e1me jednoduch\u00fd syst\u00e9m rozpozn\u00e1vania tv\u00e1re nap\u00edsan\u00fd v Go. \u010coskoro pl\u00e1nujem pokra\u010dova\u0165 v t\u00fdchto experimentoch a vytvori\u0165 \u010fal\u0161ie skvel\u00e9 veci kombinovan\u00edm Go a OpenCV.<\/p>\n<p>Ak v\u00e1s to zauj\u00edma, ohodno\u0165te to <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Niraj-Fonseka\/recognize?source=post_page---------------------------\">gRPC web server<\/a><\/noindex>, ktor\u00fd som nap\u00edsal v jazyku Python a OpenCV. Streamuje d\u00e1ta v okamihu, ke\u010f je tv\u00e1r rozpoznan\u00e1. Je to z\u00e1klad pre vytvorenie r\u00f4znych klientov v r\u00f4znych programovac\u00edch jazykoch. Bud\u00fa sa m\u00f4c\u0165 pripoji\u0165 k serveru a \u010d\u00edta\u0165 z neho \u00fadaje.<\/p>\n<p>\u010eakujem, \u017ee ste si pre\u010d\u00edtali \u010dl\u00e1nok!<\/p>\n<blockquote><p><b>Skillbox odpor\u00fa\u010da:<\/b><\/p>\n<ul>\n<li>Dvojro\u010dn\u00fd praktick\u00fd kurz <noindex><a rel=\"nofollow\" href=\"https:\/\/iamwebdev.skillbox.ru\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=WEBDEVPRO&amp;utm_content=articles&amp;utm_term=govideo\">\u201eSom webov\u00fd v\u00fdvoj\u00e1r PRO\u201c<\/a><\/noindex>.<\/li>\n<li>Vzdel\u00e1vac\u00ed online kurz <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/java\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=JAVDEV&amp;utm_content=articles&amp;utm_term=govideo\">\u201ePovolanie Java v\u00fdvoj\u00e1r\u201c<\/a><\/noindex>.<\/li>\n<li>Praktick\u00fd ro\u010dn\u00fd kurz <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/php\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=PHPDEV&amp;utm_content=articles&amp;utm_term=govideo\">\u201ePHP v\u00fdvoj\u00e1r od 0 do PRO\u201c<\/a><\/noindex>.\n<\/li>\n<\/ul>\n<\/blockquote>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/skillbox\/blog\/462159\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>OpenCV \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043f\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u043c\u0443 \u0437\u0440\u0435\u043d\u0438\u044e. \u0415\u0439 \u0443\u0436\u0435 \u043e\u043a\u043e\u043b\u043e 20 \u043b\u0435\u0442. \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0435\u0435 \u0435\u0449\u0435 \u0432 \u043a\u043e\u043b\u043b\u0435\u0434\u0436\u0435 \u0438 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 C++ \u0438 Python, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u0430 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u043f\u043b\u043e\u0445\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u044d\u0442\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432. \u041d\u043e \u043a\u043e\u0433\u0434\u0430 \u044f \u043d\u0430\u0447\u0430\u043b \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Go, \u043c\u043d\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c OpenCV \u0434\u043b\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27509,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-36726","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"OpenCV \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sk\/blog\/news\/stroim-sistemu-raspoznavaniya-lits-na-osnove-golang-i-opencv\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0421\u0442\u0440\u043e\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u043b\u0438\u0446 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Golang \u0438 OpenCV | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"OpenCV \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sk\/blog\/news\/stroim-sistemu-raspoznavaniya-lits-na-osnove-golang-i-opencv\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:13:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:13:23+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Staviame syst\u00e9m rozpozn\u00e1vania tv\u00e1re na b\u00e1ze Golang a OpenCV | ProHoster","description":"OpenCV \u2014 kni\u017enica.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/news\/stroim-sistemu-raspoznavaniya-lits-na-osnove-golang-i-opencv","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0421\u0442\u0440\u043e\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u043b\u0438\u0446 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Golang \u0438 OpenCV | ProHoster","og:description":"OpenCV \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430.","og:url":"https:\/\/prohoster.info\/sk\/blog\/news\/stroim-sistemu-raspoznavaniya-lits-na-osnove-golang-i-opencv","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:13:23+00:00","article:modified_time":"2019-10-31T19:13:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"36726","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 04:36:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:40:22","updated":"2026-01-22 04:36:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/36726","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=36726"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/36726\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/27509"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=36726"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=36726"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=36726"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}