{"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\/pl\/blog\/news\/stroim-sistemu-raspoznavaniya-lits-na-osnove-golang-i-opencv","title":{"rendered":"Budujemy system rozpoznawania twarzy oparty na Golang i OpenCV","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Budujemy system rozpoznawania twarzy oparty na Golang i OpenCV\" src=\"\/wp-content\/uploads\/2019\/08\/053427f29ed319ede4498f2239044341.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOpenCV \u2014 biblioteka opracowana dla projekt\u00f3w zwi\u0105zanych z komputerowym widzeniem. Istnieje ju\u017c od oko\u0142o 20 lat. U\u017cywa\u0142em jej jeszcze w college'u i do tej pory stosuj\u0119 w swoich projektach w C++ i Pythonie, poniewa\u017c ma dobr\u0105 obs\u0142ug\u0119 tych j\u0119zyk\u00f3w.<\/p>\n<p>Jednak kiedy zacz\u0105\u0142em uczy\u0107 si\u0119 i u\u017cywa\u0107 Go, zainteresowa\u0142o mnie, czy mo\u017cna zastosowa\u0107 OpenCV do pracy z tym j\u0119zykiem. Wtedy istnia\u0142y ju\u017c przyk\u0142ady i samouczki dotycz\u0105ce integracji, ale wydawa\u0142y mi si\u0119 zbyt skomplikowane. Nied\u0142ugo potem natkn\u0105\u0142em si\u0119 na wrappera stworzonego przez zesp\u00f3\u0142 The Hybrid Group. W tym artykule poka\u017c\u0119, jak zacz\u0105\u0107 z GoCV, tworz\u0105c prosty system rozpoznawania twarzy przy u\u017cyciu kaskad Haar.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox poleca:<\/b> Praktyczny kurs <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 podstaw\u201d<\/a><\/noindex>.<\/p>\n<p><b>Przypominamy:<\/b> <i>dla wszystkich czytelnik\u00f3w \u201eHabra\u201d \u2014 zni\u017cka 10 000 rubli przy zapisie na dowolny kurs Skillbox z kodem promocyjnym \u201eHabra\u201d.<\/i>\n<\/p><\/blockquote>\n<p>\n<b>Co b\u0119dzie potrzebne:<\/b><\/p>\n<ul>\n<li>Go;<\/li>\n<li>OpenCV (linki do instalatora poni\u017cej);<\/li>\n<li>kamera internetowa lub zwyk\u0142a kamera wideo.<\/li>\n<\/ul>\n<p>\n<b>Instalacja<\/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>Przyk\u0142ad 1<\/h3>\n<p>\nW pierwszym przyk\u0142adzie spr\u00f3bujemy stworzy\u0107 aplikacj\u0119, kt\u00f3ra otwiera okno z demonstracj\u0105 strumienia wideo z kamery.<\/p>\n<p>Najpierw musimy zaimportowa\u0107 biblioteki potrzebne do pracy.<\/p>\n<p><i>import (<br \/>\n \u201clog\u201d<br \/>\n \u201cgocv.io\/x\/gocv\u201d<br \/>\n)<\/i><\/p>\n<p>Nast\u0119pnie nale\u017cy stworzy\u0107 obiekt VideoCapture przy u\u017cyciu funkcji VideoCaptureDevice. Ta ostatnia pozwala na przechwytywanie strumienia wideo z kamery. W funkcji u\u017cywa si\u0119 liczby ca\u0142kowitej jako parametru (reprezentuje ona ID urz\u0105dzenia).<\/p>\n<pre><code class=\"go\">webcam, err := gocv.VideoCaptureDevice(0)\nif err != nil {    log.Fatalf(\u201cb\u0142\u0105d podczas otwierania kamery internetowej: %v\u201d, err)\n}\ndefer webcam.Close()<\/code><\/pre>\n<p>\nTeraz nale\u017cy stworzy\u0107 n-wymiarow\u0105 macierz. B\u0119dzie ona przechowywa\u0107 obrazy odczytane z kamery.<\/p>\n<pre><code class=\"go\">img := gocv.NewMat()\ndefer img.Close()<\/code><\/pre>\n<p>\nAby wy\u015bwietli\u0107 strumie\u0144 wideo, nale\u017cy stworzy\u0107 okno \u2014 mo\u017cna to zrobi\u0107 przy pomocy funkcji NewWindow.<\/p>\n<pre><code class=\"go\">window := gocv.NewWindow(\u201cwebcamwindow\u201d)\ndefer window.Close()<\/code><\/pre>\n<p>\nTeraz przejd\u017amy do najciekawszej cz\u0119\u015bci.<\/p>\n<p>Poniewa\u017c wideo to ci\u0105g\u0142y strumie\u0144 klatek-obrazu, musimy stworzy\u0107 niesko\u0144czon\u0105 p\u0119tl\u0119 do ci\u0105g\u0142ego odczytu strumienia wideo z kamery. Do tego potrzebna jest metoda Read typu VideoCapture. B\u0119dzie ona oczekiwa\u0142a typu Mat (macierz, kt\u00f3r\u0105 stworzyli\u015bmy wy\u017cej), zwracaj\u0105c warto\u015b\u0107 logiczn\u0105, kt\u00f3ra wskazuje, czy klatka z VideoCapture zosta\u0142a pomy\u015blnie odczytana czy nie.<\/p>\n<pre><code class=\"go\">for {     \n        if ok := webcam.Read(&amp;img); !ok || img.Empty() {\n        log.Println(\u201cNie mo\u017cna odczyta\u0107 z kamery internetowej\u201d)    continue\n     }\n.\n.\n.\n}<\/code><\/pre>\n<p>\nTeraz trzeba wy\u015bwietli\u0107 ramk\u0119 w utworzonym oknie. Przerwa na przej\u015bcie do nast\u0119pnej ramki - 50 ms.<\/p>\n<p><i>window.IMShow(img)<br \/>\nwindow.WaitKey(50)<\/i><\/p>\n<p>Po uruchomieniu aplikacji otworzy si\u0119 okno z strumieniem wideo z kamery.<\/p>\n<p><img decoding=\"async\" alt=\"Budujemy system rozpoznawania twarzy oparty na Golang i 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(\"b\u0142\u0105d otwierania urz\u0105dzenia: %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(\"Nie mo\u017cna odczyta\u0107 z kamerki\")\ncontinue\n}\n \nwindow.IMShow(img)\nwindow.WaitKey(50)\n}\n}<\/code><\/pre>\n<p><\/p>\n<h3>Przyk\u0142ad 2<\/h3>\n<p>\nW tym przyk\u0142adzie skorzystajmy z poprzedniego przyk\u0142adu i zbudujmy system rozpoznawania twarzy oparty na Haar Cascades (kaskady Haara).<\/p>\n<p>Kaskady Haara to kaskadowe klasyfikatory, kt\u00f3re s\u0105 trenowane w oparciu o technik\u0119 falkow\u0105 Haara. Analizuj\u0105 piksele w obrazie, aby wykry\u0107 okre\u015blone cechy. Aby dowiedzie\u0107 si\u0119 wi\u0119cej o Haar Cascades, mo\u017cna przej\u015b\u0107 do link\u00f3w poni\u017cej.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.cs.ubc.ca\/~lowe\/425\/slides\/13-ViolaJones.pdf?source=post_page---------------------------\">Zestaw detekcji obiekt\u00f3w Viola-Jones<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Cascading_classifiers?source=post_page---------------------------\">Kaskadowe klasyfikatory<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Haar-like_feature?source=post_page---------------------------\">Cechy podobne do Haara<\/a><\/noindex><\/p>\n<p>Pobierz ju\u017c wytrenowane kaskady <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opencv\/opencv\/tree\/master\/data\/haarcascades?source=post_page---------------------------\">mo\u017cna tutaj<\/a><\/noindex>. W bie\u017c\u0105cym przyk\u0142adzie kaskady b\u0119d\u0105 u\u017cywane do identyfikacji twarzy cz\u0142owieka z przodu.<\/p>\n<p>Aby to zrobi\u0107, nale\u017cy stworzy\u0107 klasyfikator i dostarczy\u0107 mu ju\u017c wytrenowany plik (link podany powy\u017cej). Ju\u017c za\u0142adowa\u0142em plik opencv_haarcascade_frontalface_default.xml do katalogu, w kt\u00f3rym znajduje si\u0119 nasz 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>\nAby wykrywa\u0107 twarze na obrazie, nale\u017cy skorzysta\u0107 z metody <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hybridgroup\/gocv\/blob\/master\/objdetect.go?source=post_page---------------------------#L51\">DetectMultiScale<\/a><\/noindex>. Funkcja ta przyjmuje klatk\u0119 (typ Mat), kt\u00f3ra zosta\u0142a w\u0142a\u015bnie odczytana ze strumienia wideo kamery, i zwraca tablic\u0119 typu Rectangle. Rozmiar tablicy reprezentuje liczb\u0119 twarzy, kt\u00f3re klasyfikator by\u0142 w stanie wykry\u0107 w klatce. Nast\u0119pnie, aby upewni\u0107 si\u0119, \u017ce widzimy to, co znalaz\u0142, przejd\u017amy przez list\u0119 prostok\u0105t\u00f3w i wy\u015bwietlmy obiekt Rectangle w konsoli, tworz\u0105c ramk\u0119 wok\u00f3\u0142 wykrytego prostok\u0105ta. Mo\u017cna to zrobi\u0107 za pomoc\u0105 funkcji Rectangle. Przyjmuje ona Mat, odczytany z kamery, obiekt Rectangle, kt\u00f3ry zosta\u0142 zwr\u00f3cony przez metod\u0119 DetectMultiScale, kolor i grubo\u015b\u0107 ramki.<\/p>\n<pre><code class=\"go\">for _, r := range rects {\nfmt.Println(\u201cwykryto\u201d, r)\ngocv.Rectangle(&amp;img, r, color, 2)\n}<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Budujemy system rozpoznawania twarzy oparty na Golang i OpenCV\" src=\"\/wp-content\/uploads\/2019\/08\/5c9128572d0f832325b2d19dd0d03b61.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<img decoding=\"async\" alt=\"Budujemy system rozpoznawania twarzy oparty na Golang i OpenCV\" src=\"\/wp-content\/uploads\/2019\/08\/57a901331c7f109067c7f254f982a2b0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<pre><code class=\"go\">pakiet g\u0142\u00f3wny\n \nimport (\n\"fmt\"\n\"image\/color\"\n\"log\"\n \n\"gocv.io\/x\/gocv\"\n)\n \nfunkcja main() {\nwebcam, err := gocv.VideoCaptureDevice(0)\nif err != nil {\nlog.Fatalf(\"b\u0142\u0105d przy otwieraniu kamery internetowej: %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(\"Nie mo\u017cna odczyta\u0107 z urz\u0105dzenia\")\ncontinue\n}\n \nrects := classifier.DetectMultiScale(img)\nfor _, r := range rects {\nfmt.Println(\"wykryto\", r)\ngocv.Rectangle(&amp;img, r, color, 3)\n}\n \nwindow.IMShow(img)\nwindow.WaitKey(50)\n}\n}<\/code><\/pre>\n<p>\nTak, uda\u0142o si\u0119! Mamy teraz prosty system rozpoznawania twarzy, napisany w Go. Wkr\u00f3tce planuj\u0119 kontynuowa\u0107 te eksperymenty i stworzy\u0107 nowe ciekawe rzeczy, \u0142\u0105cz\u0105c Go i OpenCV.<\/p>\n<p>Je\u015bli jeste\u015b zainteresowany, oceniaj <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Niraj-Fonseka\/recognize?source=post_page---------------------------\">serwer gRPC web<\/a><\/noindex>, kt\u00f3ry napisa\u0142em w Pythonie i OpenCV. Transmituje dane w momencie wykrycia twarzy. To podstawa do tworzenia r\u00f3\u017cnych klient\u00f3w w r\u00f3\u017cnych j\u0119zykach programowania. B\u0119d\u0105 mogli \u0142\u0105czy\u0107 si\u0119 z serwerem i odczytywa\u0107 z niego dane.<\/p>\n<p>Dzi\u0119kuj\u0119 za przeczytanie artyku\u0142u!<\/p>\n<blockquote><p><b>Skillbox poleca:<\/b><\/p>\n<ul>\n<li>Dwuletni praktyczny kurs <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\">\u00abJestem programist\u0105 webowym PRO\u00bb<\/a><\/noindex>.<\/li>\n<li>Edukacyjny kurs online <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\">\u00abZaw\u00f3d programista Java\u00bb<\/a><\/noindex>.<\/li>\n<li>Praktyczny roczny kurs <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\">\u00abPHP programista od 0 do PRO\u00bb<\/a><\/noindex>.\n<\/li>\n<\/ul>\n<\/blockquote>\n<p>\u0179r\u00f3d\u0142o: <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.1.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\/pl\/blog\/news\/stroim-sistemu-raspoznavaniya-lits-na-osnove-golang-i-opencv\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Budujemy system rozpoznawania twarzy w oparciu o Golang i OpenCV | ProHoster","description":"OpenCV \u2014 biblioteka.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/news\/stroim-sistemu-raspoznavaniya-lits-na-osnove-golang-i-opencv","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/36726","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=36726"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/36726\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/27509"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=36726"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=36726"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=36726"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}