{"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\/ro\/blog\/news\/stroim-sistemu-raspoznavaniya-lits-na-osnove-golang-i-opencv","title":{"rendered":"Construim un sistem de recunoa\u0219tere facial\u0103 pe baz\u0103 de Golang \u0219i OpenCV","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Construim un sistem de recunoa\u0219tere facial\u0103 pe baz\u0103 de Golang \u0219i OpenCV\" src=\"\/wp-content\/uploads\/2019\/08\/053427f29ed319ede4498f2239044341.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOpenCV \u2014 o bibliotec\u0103 dezvoltat\u0103 pentru proiecte de viziune computerizat\u0103. Are deja aproximativ 20 de ani. Am folosit-o \u00eenc\u0103 din facultate \u0219i o aplic \u0219i acum pentru proiectele mele \u00een C++ \u0219i Python, deoarece ofer\u0103 un suport destul de bun pentru aceste limbaje.<\/p>\n<p>Dar c\u00e2nd am \u00eenceput s\u0103 \u00eenv\u0103\u021b \u0219i s\u0103 folosesc Go, m-a interesat dac\u0103 pot aplica OpenCV pentru a lucra cu acest limbaj. Atunci existau deja exemple \u0219i tutoriale pentru integrare, dar mi s-a p\u0103rut c\u0103 erau prea complicate. Mai t\u00e2rziu, mi-a c\u0103zut \u00een m\u00e2ini un wrapper creat de echipa The Hybrid Group. \u00cen acest articol, voi ar\u0103ta cum s\u0103 \u00eencepi cu GoCV, dezvolt\u00e2nd un sistem simplu de recunoa\u0219tere facial\u0103 folosind cascade Haar.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox recomand\u0103:<\/b> Curs practic <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\">\u201eDezvoltator Python de la zero\u201d<\/a><\/noindex>.<\/p>\n<p><b>V\u0103 reamintim:<\/b> <i>pentru to\u021bi cititorii \u201eHabr\u201d \u2014 reducere de 10.000 de ruble la \u00eenscrierea la orice curs Skillbox cu codul de promovare \u201eHabr\u201d.<\/i>\n<\/p><\/blockquote>\n<p>\n<b>Ce va fi necesar:<\/b><\/p>\n<ul>\n<li>Go;<\/li>\n<li>OpenCV (linkuri pentru instalator mai jos);<\/li>\n<li>camer\u0103 web sau video obi\u0219nuit\u0103.<\/li>\n<\/ul>\n<p>\n<b>Instalare<\/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>Exemplu 1<\/h3>\n<p>\n\u00cen primul exemplu, vom \u00eencerca s\u0103 cre\u0103m o aplica\u021bie care deschide o fereastr\u0103 cu o demonstra\u021bie a fluxului video al camerei.<\/p>\n<p>Mai \u00eent\u00e2i trebuie s\u0103 import\u0103m bibliotecile necesare pentru func\u021bionare.<\/p>\n<p><i>import (<br \/>\n \u201clog\u201d<br \/>\n \u201cgocv.io\/x\/gocv\u201d<br \/>\n)<\/i><\/p>\n<p>Dup\u0103 aceea, trebuie s\u0103 cre\u0103m un obiect VideoCapture folosind func\u021bia VideoCaptureDevice. Aceasta permite capturarea fluxului video utiliz\u00e2nd camer\u0103. Func\u021bia folose\u0219te un num\u0103r \u00eentreg ca parametru (acesta reprezint\u0103 ID-ul dispozitivului).<\/p>\n<pre><code class=\"go\">webcam, err := gocv.VideoCaptureDevice(0)\nif err != nil {    log.Fatalf(\u201ceroare la deschiderea camerei web: %v\u201d, err)\n}\ndefer webcam.Close()<\/code><\/pre>\n<p>\nAcum trebuie s\u0103 cre\u0103m o matrice n-dimensional\u0103. Aceasta va stoca imaginile citite de la camer\u0103.<\/p>\n<pre><code class=\"go\">img := gocv.NewMat()\ndefer img.Close()<\/code><\/pre>\n<p>\nPentru a afi\u0219a fluxul video, trebuie s\u0103 cre\u0103m o fereastr\u0103 \u2014 acest lucru poate fi realizat prin func\u021bia NewWindow.<\/p>\n<pre><code class=\"go\">window := gocv.NewWindow(\u201cwebcamwindow\u201d)\ndefer window.Close()<\/code><\/pre>\n<p>\nAcum s\u0103 trecem la cea mai interesant\u0103 parte.<\/p>\n<p>Dat fiind c\u0103 video-ul reprezint\u0103 un flux continuu de cadre-imagini, va trebui s\u0103 cre\u0103m o bucl\u0103 infinit\u0103 pentru a citi continuu fluxul video al camerei. Pentru aceasta, este nevoie de metoda Read de tip VideoCapture. Aceasta va a\u0219tepta un tip Mat (matricea pe care am creat-o mai sus), return\u00e2nd o valoare boolean\u0103 care indic\u0103 dac\u0103 cadrul din VideoCapture a fost citit cu succes sau nu.<\/p>\n<pre><code class=\"go\">for {     \n        if ok := webcam.Read(&amp;img); !ok || img.Empty() {\n        log.Println(\u201cImposibil de citit de la camera web\u201d)    continue\n     }\n.\n.\n.\n}<\/code><\/pre>\n<p>\nAcum trebuie s\u0103 afi\u0219\u0103m cadrul \u00een fereastra creat\u0103. Pauza pentru a trece la urm\u0103torul cadru este de 50 ms.<\/p>\n<p><i>window.IMShow(img)<br \/>\nwindow.WaitKey(50)<\/i><\/p>\n<p>Dup\u0103 ce aplica\u021bia este lansat\u0103, se va deschide o fereastr\u0103 cu fluxul video de la camer\u0103.<\/p>\n<p><img decoding=\"async\" alt=\"Construim un sistem de recunoa\u0219tere facial\u0103 pe baz\u0103 de Golang \u0219i 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(\"eroare la deschiderea dispozitivului: %v\", err)\n}\ndefer webcam.Close()\n \nimg := gocv.NewMat()\ndefer img.Close()\n \nwindow := gocv.NewWindow(\"fereastawindows\")\ndefer window.Close()\n \nfor {\nif ok := webcam.Read(&amp;img); !ok || img.Empty() {\nlog.Println(\"Imposibil de citit de la webcam\")\ncontinue\n}\n \nwindow.IMShow(img)\nwindow.WaitKey(50)\n}\n}<\/code><\/pre>\n<p><\/p>\n<h3>Exemplu 2<\/h3>\n<p>\n\u00cen acest exemplu, s\u0103 folosim exemplul anterior \u0219i s\u0103 construim un sistem de recunoa\u0219tere facial\u0103 bazat pe Haar Cascades.<\/p>\n<p>Cascadele Haar sunt clasificatoare \u00een cascad\u0103 care sunt antrenate pe baza tehnicii wavelet Haar. Ele analizeaz\u0103 pixelii din imagine pentru a detecta anumite caracteristici. Pentru a afla mai multe despre Haar Cascades, pute\u021bi accesa linkurile de mai jos.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.cs.ubc.ca\/~lowe\/425\/slides\/13-ViolaJones.pdf?source=post_page---------------------------\">Cadru de detec\u021bie a obiectelor Viola-Jones<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Cascading_classifiers?source=post_page---------------------------\">Clasificatori \u00een cascad\u0103<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Haar-like_feature?source=post_page---------------------------\">Caracteristic\u0103 asem\u0103n\u0103toare Haar<\/a><\/noindex><\/p>\n<p>Desc\u0103rca\u021bi cascadele deja antrenate <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opencv\/opencv\/tree\/master\/data\/haarcascades?source=post_page---------------------------\">pute\u021bi face acest lucru aici<\/a><\/noindex>. \u00cen exemplul curent, cascadele vor fi utilizate pentru a identifica fa\u021ba unei persoane din fa\u021b\u0103.<\/p>\n<p>Pentru a face acest lucru, trebuie s\u0103 crea\u021bi un clasificator \u0219i s\u0103 \u00eei oferi\u021bi un fi\u0219ier deja antrenat (linkul de mai sus). Am \u00eenc\u0103rcat fi\u0219ierul opencv_haarcascade_frontalface_default.xml \u00een directorul unde se afl\u0103 programul nostru.<\/p>\n<pre><code class=\"go\">harrcascade := \"opencv_haarcascade_frontalface_default.xml\"classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)\ndefer classifier.Close()<\/code><\/pre>\n<p>\nPentru a detecta fe\u021bele din imagine, trebuie s\u0103 folosi\u021bi metoda <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hybridgroup\/gocv\/blob\/master\/objdetect.go?source=post_page---------------------------#L51\">DetectMultiScale<\/a><\/noindex>. Aceast\u0103 func\u021bie prime\u0219te un cadru (de tip Mat), care a fost citit recent din fluxul video al camerei, \u0219i returneaz\u0103 un array de tip Rectangle. Dimensiunea array-ului reprezint\u0103 num\u0103rul de fe\u021be pe care clasificatorul le-a putut detecta \u00een cadru. Apoi, pentru a ne asigura c\u0103 vedem ceea ce a g\u0103sit, s\u0103 parcurgem lista de dreptunghiuri \u0219i s\u0103 afi\u0219\u0103m obiectul Rectangle \u00een consol\u0103, cre\u00e2nd o margine \u00een jurul dreptunghiului detectat. Acest lucru se poate face cu ajutorul func\u021biei Rectangle. Ea va accepta Mat-ul citit de camer\u0103, obiectul Rectangle returnat de metoda DetectMultiScale, culoarea \u0219i grosimea pentru margine.<\/p>\n<pre><code class=\"go\">for _, r := range rects {\nfmt.Println(\"detectat\", r)\ngocv.Rectangle(&amp;img, r, color, 2)\n}<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Construim un sistem de recunoa\u0219tere facial\u0103 pe baz\u0103 de Golang \u0219i OpenCV\" src=\"\/wp-content\/uploads\/2019\/08\/5c9128572d0f832325b2d19dd0d03b61.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<img decoding=\"async\" alt=\"Construim un sistem de recunoa\u0219tere facial\u0103 pe baz\u0103 de Golang \u0219i 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\u0218i... da, a ie\u0219it! Acum avem un sistem simplu de recunoa\u0219tere facial\u0103 scris \u00een Go. \u00cen cur\u00e2nd, planific s\u0103 continui aceste experimente \u0219i s\u0103 creez lucruri noi interesante, combin\u00e2nd Go \u0219i OpenCV.<\/p>\n<p>Dac\u0103 te intereseaz\u0103, te rog s\u0103 evaluezi <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Niraj-Fonseka\/recognize?source=post_page---------------------------\">server web gRPC<\/a><\/noindex>, pe care l-am scris \u00een Python \u0219i OpenCV. Acesta transmite date \u00een momentul detect\u0103rii fe\u021bei. Este baza pentru crearea diferitelor clien\u021bi \u00een diferite limbaje de programare. Ace\u0219tia se vor putea conecta la server \u0219i vor citi date de la acesta.<\/p>\n<p>Mul\u021bumesc c\u0103 ai citit articolul!<\/p>\n<blockquote><p><b>Skillbox recomand\u0103:<\/b><\/p>\n<ul>\n<li>Curs practic de doi ani <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\">\u201eSunt un dezvoltator web PRO\u201d<\/a><\/noindex>.<\/li>\n<li>Curs online educa\u021bional <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\">\u00abProfesie Java Developer\u00bb<\/a><\/noindex>.<\/li>\n<li>Curs practic anual <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\">\u00abDezvoltator PHP de la 0 la PRO\u00bb<\/a><\/noindex>.\n<\/li>\n<\/ul>\n<\/blockquote>\n<p>Sursa: <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.2.1 - 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\/ro\/blog\/news\/stroim-sistemu-raspoznavaniya-lits-na-osnove-golang-i-opencv\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Construim un sistem de recunoa\u0219tere facial\u0103 bazat pe Golang \u0219i OpenCV | ProHoster","description":"OpenCV este o bibliotec\u0103.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/news\/stroim-sistemu-raspoznavaniya-lits-na-osnove-golang-i-opencv","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/36726","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=36726"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/36726\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/27509"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=36726"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=36726"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=36726"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}