{"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\/sv\/blog\/news\/stroim-sistemu-raspoznavaniya-lits-na-osnove-golang-i-opencv","title":{"rendered":"Vi bygger ett ansiktigenk\u00e4nningssystem baserat p\u00e5 Golang och OpenCV","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Vi bygger ett ansiktigenk\u00e4nningssystem baserat p\u00e5 Golang och OpenCV\" src=\"\/wp-content\/uploads\/2019\/08\/053427f29ed319ede4498f2239044341.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOpenCV \u00e4r ett bibliotek som utvecklats f\u00f6r projekt inom datorseende. Det har nu funnits i ungef\u00e4r 20 \u00e5r. Jag anv\u00e4nde det redan p\u00e5 universitetet och anv\u00e4nder det fortfarande f\u00f6r mina projekt i C++ och Python, eftersom det har ett bra st\u00f6d f\u00f6r dessa spr\u00e5k.<\/p>\n<p>Men n\u00e4r jag b\u00f6rjade utforska och anv\u00e4nda Go blev jag nyfiken p\u00e5 om man kunde anv\u00e4nda OpenCV med detta spr\u00e5k. Det fanns redan exempel och tutorials f\u00f6r integration vid det tillf\u00e4llet, men jag tyckte att de var f\u00f6r komplicerade. Lite senare kom jag i kontakt med en wrapper som skapats av teamet p\u00e5 The Hybrid Group. I den h\u00e4r artikeln kommer jag att visa hur man b\u00f6rjar med GoCV genom att utveckla ett enkelt ansiktsigenk\u00e4nningssystem med Haar Cascades.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Skillbox rekommenderar:<\/b> Praktisk 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\">\u00abPython-utvecklare fr\u00e5n grunden\u00bb<\/a><\/noindex>.<\/p>\n<p><b>P\u00e5minnelse:<\/b> <i>f\u00f6r alla l\u00e4sare av \"Habr\" \u2014 10 000 rubel rabatt vid registrering f\u00f6r vilken kurs som helst p\u00e5 Skillbox med rabattkoden \"Habr\".<\/i>\n<\/p><\/blockquote>\n<p>\n<b>Vad som beh\u00f6vs:<\/b><\/p>\n<ul>\n<li>Go;<\/li>\n<li>OpenCV (l\u00e4nkar till installerare nedan);<\/li>\n<li>en webbkamera eller vanlig kamera.<\/li>\n<\/ul>\n<p>\n<b>Installation<\/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>Exempel 1<\/h3>\n<p>\nI det f\u00f6rsta exemplet kommer vi att f\u00f6rs\u00f6ka skapa en applikation som \u00f6ppnar ett f\u00f6nster med en demonstration av videostr\u00f6mmen fr\u00e5n kameran.<\/p>\n<p>F\u00f6rst m\u00e5ste vi importera de bibliotek som beh\u00f6vs f\u00f6r att arbeta.<\/p>\n<p><i>import (<br \/>\n \u201clog\u201d<br \/>\n \u201cgocv.io\/x\/gocv\u201d<br \/>\n)<\/i><\/p>\n<p>D\u00e4refter beh\u00f6ver vi skapa ett VideoCapture-objekt med hj\u00e4lp av funktionen VideoCaptureDevice. Denna ger oss m\u00f6jlighet att f\u00e5nga videostr\u00f6mmen med hj\u00e4lp av kameran. Funktionen anv\u00e4nder ett heltal som parameter (det representerar enhetens ID).<\/p>\n<pre><code class=\"go\">webcam, err := gocv.VideoCaptureDevice(0)\nif err != nil {    log.Fatalf(\u201cfel vid \u00f6ppning av webbkameran: %v\u201d, err)\n}\ndefer webcam.Close()<\/code><\/pre>\n<p>\nNu beh\u00f6ver vi skapa en n-dimensionell matris. Den kommer att lagra bilder som l\u00e4ses in fr\u00e5n kameran.<\/p>\n<pre><code class=\"go\">img := gocv.NewMat()\ndefer img.Close()<\/code><\/pre>\n<p>\nF\u00f6r att visa videostr\u00f6mmen beh\u00f6ver vi skapa ett f\u00f6nster \u2014 detta kan g\u00f6ras med funktionen NewWindow.<\/p>\n<pre><code class=\"go\">window := gocv.NewWindow(\u201cwebcamwindow\u201d)\ndefer window.Close()<\/code><\/pre>\n<p>\nNu g\u00e5r vi vidare till den mest intressanta delen.<\/p>\n<p>Eftersom videon \u00e4r en kontinuerlig str\u00f6m av bildrutor beh\u00f6ver vi skapa en o\u00e4ndlig loop f\u00f6r att kontinuerligt l\u00e4sa videostr\u00f6mmen fr\u00e5n kameran. F\u00f6r detta beh\u00f6vs metoden Read av typen VideoCapture. Den kommer att f\u00f6rv\u00e4nta sig en typ Mat (matrisen vi skapade ovan), och returnera ett booleskt v\u00e4rde som indikerar om en bildruta fr\u00e5n VideoCapture har l\u00e4sts in framg\u00e5ngsrikt eller inte.<\/p>\n<pre><code class=\"go\">for {     \n        if ok := webcam.Read(&amp;img); !ok || img.Empty() {\n        log.Println(\u201cKunde inte l\u00e4sa fr\u00e5n webbkameran\u201d)    continue\n     }\n.\n.\n.\n}<\/code><\/pre>\n<p>\nNu beh\u00f6ver vi visa ramen i det skapade f\u00f6nstret. Paus f\u00f6r att g\u00e5 till n\u00e4sta ram \u2014 50 ms.<\/p>\n<p><i>window.IMShow(img)<br \/>\nwindow.WaitKey(50)<\/i><\/p>\n<p>N\u00e4r applikationen k\u00f6rs \u00f6ppnas ett f\u00f6nster med videostr\u00f6mmen fr\u00e5n kameran.<\/p>\n<p><img decoding=\"async\" alt=\"Vi bygger ett ansiktigenk\u00e4nningssystem baserat p\u00e5 Golang och 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>Exempel 2<\/h3>\n<p>\nI det h\u00e4r exemplet ska vi anv\u00e4nda det f\u00f6reg\u00e5ende exemplet och bygga ett system f\u00f6r ansiktsigenk\u00e4nning baserat p\u00e5 Haar Cascades.<\/p>\n<p>Haar Cascades \u00e4r kaskadklassificerare som tr\u00e4nas med hj\u00e4lp av Haar-v\u00e5gletetekniken. De analyserar pixlar i en bild f\u00f6r att uppt\u00e4cka specifika funktioner. F\u00f6r att l\u00e4ra dig mer om Haar Cascades kan du f\u00f6lja l\u00e4nkarna nedan.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.cs.ubc.ca\/~lowe\/425\/slides\/13-ViolaJones.pdf?source=post_page---------------------------\">Viola-Jones objektidentifieringsramverk<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Cascading_classifiers?source=post_page---------------------------\">Kaskadklassificerare<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Haar-like_feature?source=post_page---------------------------\">Haar-liknande funktion<\/a><\/noindex><\/p>\n<p>Ladda ner redan tr\u00e4nade kaskader <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opencv\/opencv\/tree\/master\/data\/haarcascades?source=post_page---------------------------\">h\u00e4r<\/a><\/noindex>. I det aktuella exemplet kommer kaskaderna att anv\u00e4ndas f\u00f6r att identifiera ett ansikte p\u00e5 en person i frontprofil.<\/p>\n<p>F\u00f6r att g\u00f6ra detta m\u00e5ste du skapa en klassificerare och mata den med en redan tr\u00e4nad fil (l\u00e4nken ovan ger mer information). Jag har redan laddat upp filen opencv_haarcascade_frontalface_default.xml i katalogen d\u00e4r v\u00e5rt program finns.<\/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>\nF\u00f6r att uppt\u00e4cka ansikten i en bild m\u00e5ste du anv\u00e4nda metoden <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hybridgroup\/gocv\/blob\/master\/objdetect.go?source=post_page---------------------------#L51\">DetectMultiScale<\/a><\/noindex>. Denna funktion tar en bild (typ Mat) som just har l\u00e4sts in fr\u00e5n kamerans videostr\u00f6m och returnerar en array av typen Rectangle. Storleken p\u00e5 arrayen representerar antalet ansikten som klassificeraren kunde uppt\u00e4cka i bilden. F\u00f6r att se att vi faktiskt ser vad den har uppt\u00e4ckt, l\u00e5t oss g\u00e5 igenom listan av rektanglar och skriva ut objektet Rectangle p\u00e5 konsolen genom att skapa en kant runt den uppt\u00e4ckta rektangeln. Detta kan g\u00f6ras med hj\u00e4lp av funktionen Rectangle. Den tar Mat, som l\u00e4sts in av kameran, objektet Rectangle som returnerades av metoden DetectMultiScale, f\u00e4rgen och tjockleken f\u00f6r kanten.<\/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=\"Vi bygger ett ansiktigenk\u00e4nningssystem baserat p\u00e5 Golang och OpenCV\" src=\"\/wp-content\/uploads\/2019\/08\/5c9128572d0f832325b2d19dd0d03b61.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<img decoding=\"async\" alt=\"Vi bygger ett ansiktigenk\u00e4nningssystem baserat p\u00e5 Golang och 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>\nOch ja, det blev bra! Nu har vi ett enkelt system f\u00f6r ansiktsigenk\u00e4nning skrivet i Go. Snart planerar jag att forts\u00e4tta med dessa experiment och skapa nya coola grejer genom att kombinera Go och OpenCV.<\/p>\n<p>Om du \u00e4r intresserad, ge en bed\u00f6mning <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Niraj-Fonseka\/recognize?source=post_page---------------------------\">gRPC web server<\/a><\/noindex>, som jag skrev i Python och OpenCV. Den str\u00e4mmar data i realtid n\u00e4r den uppt\u00e4cker ett ansikte. Detta \u00e4r grunden f\u00f6r att skapa olika klienter p\u00e5 olika programmeringsspr\u00e5k. De kommer att kunna ansluta till servern och l\u00e4sa data fr\u00e5n den.<\/p>\n<p>Tack f\u00f6r att du l\u00e4ste artikeln!<\/p>\n<blockquote><p><b>Skillbox rekommenderar:<\/b><\/p>\n<ul>\n<li>Tv\u00e5\u00e5rig praktisk 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\">\u00abJag \u00e4r webbutvecklare PRO\u00bb<\/a><\/noindex>.<\/li>\n<li>Utbildningskurs 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\">\"Yrket Java-utvecklare\"<\/a><\/noindex>.<\/li>\n<li>Praktisk \u00e5rskurs <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\">PHP-utvecklare fr\u00e5n grunden till PRO<\/a><\/noindex>.\n<\/li>\n<\/ul>\n<\/blockquote>\n<p>K\u00e4lla: <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\/sv\/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=\"sv_SE\" \/>\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\/sv\/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\udd47Bygger ett system f\u00f6r ansiktsigenk\u00e4nning baserat p\u00e5 Golang och OpenCV | ProHoster","description":"OpenCV \u00e4r ett bibliotek.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/news\/stroim-sistemu-raspoznavaniya-lits-na-osnove-golang-i-opencv","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/36726","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=36726"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/36726\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/27509"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=36726"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=36726"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=36726"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}