{"id":298039,"date":"2020-01-31T21:00:17","date_gmt":"2020-01-31T21:00:17","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=298039"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=298039","title":{"rendered":"\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0435\u0447\u0430\u0442\u0435\u0439 \u043d\u0430 OpenCV \u0431\u0435\u0437 \u043d\u0435\u0439\u0440\u043e\u043d\u043e\u043a, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u0441\u043c\u0441"},"content":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/directum\/blog\/486476\/\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/6q\/4h\/pq\/6q4hpqklwmxrpx8mj6gnso29yg4.png\"><br \/>  \u041d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0441\u0442\u043e\u044f\u043b\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430\u0439\u0442\u0438 \u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u043f\u0435\u0447\u0430\u0442\u0438 \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0417\u0430\u0447\u0435\u043c? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u0435\u0447\u0430\u0442\u0435\u0439 \u0432 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0430\u0445 \u0441 \u0434\u0432\u0443\u0445 \u0441\u0442\u043e\u0440\u043e\u043d (\u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0430). \u0423 \u043d\u0430\u0441 \u0432 \u0437\u0430\u043a\u0440\u043e\u043c\u0430\u0445 \u0443\u0436\u0435 \u0431\u044b\u043b \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0434\u043b\u044f \u0438\u0445 \u043f\u043e\u0438\u0441\u043a\u0430, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 OpenCV, \u043d\u043e \u043e\u043d \u0431\u044b\u043b \u0441\u044b\u0440\u043e\u0432\u0430\u0442. \u0420\u0435\u0448\u0438\u043b\u0438 \u043e\u0442\u043a\u043e\u043f\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u043a\u0442, \u0441\u0442\u0440\u044f\u0445\u043d\u0443\u0442\u044c \u0441 \u043d\u0435\u0433\u043e \u043f\u044b\u043b\u044c \u0438 \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u0435\u043c\u043e\u0432, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0437\u0434\u0435\u0441\u044c, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0438 \u0432\u043d\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0435\u0447\u0430\u0442\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0446\u0432\u0435\u0442\u043e\u0432\u0430\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f;<\/li>\n<li>\u043f\u043e\u0438\u0441\u043a \u043a\u0440\u0443\u0433\u043b\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \/ \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0435\u0439;<\/li>\n<li>\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u043b\u044f\u0440\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442;<\/li>\n<li>\u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, Intersection over Union (IoU, \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0416\u0430\u043a\u043a\u0430\u0440\u0430).<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430: \u0440\u0435\u0448\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 \u0438\u043b\u0438 \u0436\u0435 \u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0438\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u043d\u0430 OpenCV. \u041f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c OpenCV? \u041e\u0442\u0432\u0435\u0442 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0430 Python \u0438 C#. \u0414\u043b\u044f Python \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/pypi.org\/project\/opencv-python\/\">opencv-python<\/a> \u0438 <a href=\"https:\/\/github.com\/numpy\/numpy\">numpy<\/a>, \u0434\u043b\u044f C# \u2014 <a href=\"https:\/\/github.com\/shimat\/opencvsharp\">OpenCvSharp<\/a> \u0438 <a href=\"https:\/\/github.com\/opencv\/opencv\">opencv<\/a>. <\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c\u0438 OpenCV. \u0413\u043b\u0443\u0431\u043e\u043a\u043e \u0432 \u043d\u0438\u0445 \u044f \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u043d\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0441\u0441\u044b\u043b\u043a\u0438 \u0441 \u043c\u0430\u0442. \u0447\u0430\u0441\u0442\u044c\u044e \u0432\u0441\u0435\u043c \u0436\u0430\u0436\u0434\u0443\u0449\u0438\u043c.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u0431\u0435\u0433\u0430\u044f \u0432\u043f\u0435\u0440\u0435\u0434 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0446\u0432\u0435\u0442\u043d\u044b\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 (\u0442\u0430\u043a \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 HLS-\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438), \u0430 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0425\u0430\u0444\u0430. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u0431\u044b\u043b\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0432\u044b\u0441\u043e\u043a\u0438\u043c \u0438\u0437-\u0437\u0430 \u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0439 \u043d\u0430 \u0448\u0443\u043c\u0435, \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u043c\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0446\u0432\u0435\u0442\u0430, \u0438 \u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0439 \u043d\u0430 \u0440\u0443\u043a\u043e\u043f\u0438\u0441\u043d\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u0435.<\/p>\n<p>  <\/p>\n<p>\u0420\u0435\u0448\u0438\u043b\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u2013 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0438\u0437 \u043f\u043e\u043b\u044f\u0440\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0443\u044e.<\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e, \u043a\u043e\u0433\u043e \u0438 \u043a\u0430\u043a? \u041d\u0430\u0447\u043d\u0435\u043c \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443.<\/p>\n<p>  <\/p>\n<h3 id=\"ocenka-raboty-algoritma\">\u041e\u0446\u0435\u043d\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430<\/h3>\n<p>  <\/p>\n<p>\u041d\u0430\u0447\u043d\u0443 \u0441 \u043e\u0446\u0435\u043d\u043a\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430. \u041a\u043e\u0433\u0434\u0430 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\/\u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0442\u043e \u043b\u0435\u0433\u043a\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435\u043c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u043f\u0430\u0441\u0442\u0438\u0441\u044c \u0447\u0435\u043c-\u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0435\u0441\u044c \u0432\u044b \u0438\u043b\u0438 \u0441\u0442\u043e\u0438\u0442\u0435 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435. <\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043d\u0430\u0431\u0440\u0430\u043b\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0440\u0430\u0437\u043c\u0435\u0442\u0438\u043b\u0438, \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 python \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 \u043e\u0446\u0435\u043d\u043a\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430. \u041d\u0430\u0448 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0434\u043b\u044f \u043f\u0435\u0447\u0430\u0442\u0438 (\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u043a\u0440\u0443\u0433, \u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0447\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0449\u0435 \u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0435). \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043b\u0438 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u0438 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0416\u0430\u043a\u043a\u0430\u0440\u0430 (\u0438\u043b\u0438 \u0436\u0435 Intersection over Union), \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0447\u043d\u043e \u043c\u044b \u043f\u043e\u043f\u0430\u043b\u0438 \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0416\u0430\u043a\u043a\u0430\u0440\u0430 \u043d\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 \u043d\u0430\u0434 \u0438\u0445 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435\u043c:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ab\/nn\/7c\/abnn7chjw4veobohpkbxo4ivxse.png\"><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/hs\/q4\/gi\/hsq4gi-bim8ymscnun5rudlmm9o.png\"><\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0440\u0430\u0432\u0435\u043d \u043d\u0443\u043b\u044e, \u043a\u043e\u0433\u0434\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043e\u0431\u0449\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439, \u0438 \u0435\u0434\u0438\u043d\u0438\u0446\u0435, \u043a\u043e\u0433\u0434\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0432\u043d\u044b, \u0432\u043e \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0433\u0434\u0435-\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u043d\u0443\u043b\u0435\u043c \u0438 \u0435\u0434\u0438\u043d\u0438\u0446\u0435\u0439. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0447\u0435\u043c \u0431\u043b\u0438\u0436\u0435 \u043a \u0435\u0434\u0438\u043d\u0438\u0446\u0435, \u0442\u0435\u043c \u0442\u043e\u0447\u043d\u0435\u0435 \u043c\u044b \u043f\u043e\u043f\u0430\u043b\u0438 \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ea\/sf\/5h\/easf5hkcpzaj_1o90oxz2ovfnfs.png\"><\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u043d\u0430\u0441 \u043f\u043e\u0440\u043e\u0433 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 (\u043d\u0430\u0441 \u0443\u0441\u0442\u0440\u043e\u0438\u043b 0.6) \u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Precision_and_recall\">\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0442\u0443, \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 F1-\u043c\u0435\u0440\u0443<\/a> \u043f\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2014 \u043f\u0435\u0447\u0430\u0442\u044f\u043c).<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e IoU<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">import sys from collections import namedtuple  Metrics = namedtuple(&quot;metrics&quot;, [&quot;tp&quot;, &quot;fp&quot;, &quot;fn&quot;])  def bb_intersection_over_union(a, b):    # \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0437\u0430\u0434\u0430\u043d\u044b \u0432 \u0432\u0438\u0434\u0435 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043d\u0438\u0436\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430.    # 0 - \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 X \u0434\u043b\u044f \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e \u0443\u0433\u043b\u0430,    # 1 - \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 Y \u0434\u043b\u044f \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043b\u0435\u0432\u043e\u0433\u043e \u0443\u0433\u043b\u0430,    # 2 - \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 X \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043d\u0438\u0436\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430,    # 3 - \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 Y \u0434\u043b\u044f \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u043d\u0438\u0436\u043d\u0435\u0433\u043e \u0443\u0433\u043b\u0430.    x_a = max(a[0], b[0])    y_a = max(a[1], b[1])    x_b = min(a[2], b[2])    y_b = min(a[3], b[3])     # \u041f\u043b\u043e\u0449\u0430\u0434\u044c \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f.    inter_area = max(0, x_b - x_a + 1) * max(0, y_b - y_a + 1)     # \u041f\u043b\u043e\u0449\u0430\u0434\u0438 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432.    a_area = (a[2] - a[0] + 1) * (a[3] - a[1] + 1)    b_area = (b[2] - b[0] + 1) * (b[3] - b[1] + 1)     # Intersection over Union.    iou = inter_area \/ float(a_area + b_area - inter_area)     return iou  def same_stamp(a, b):    &quot;&quot;&quot;\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u043f\u0435\u0447\u0430\u0442\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435 \u043c\u0435\u0441\u0442\u0435&quot;&quot;&quot;    iou = bb_intersection_over_union(a, b)    print(f'iou: {iou}')    return iou &gt; 0.6  def compare_stamps(extracted, mapped):    &quot;&quot;&quot;    \u041f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0438    :param extracted: \u041f\u0435\u0447\u0430\u0442\u0438, \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c.    :param mapped: \u0420\u0430\u0437\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 (\u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0435) \u043f\u0435\u0447\u0430\u0442\u0438.    &quot;&quot;&quot;    tp = []    fp = []    fn = list(mapped)    for stamp in extracted:        for check in fn:            if same_stamp(stamp, check):                tp.append(check)                fn.remove(check)                break        else:            fp.append(stamp)    return Metrics(len(tp), len(fp), len(fn))  def compare(file, sectors):    &quot;&quot;&quot;    \u041f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430.    :param file: \u041f\u0443\u0442\u044c \u0434\u043e \u0444\u0430\u0439\u043b\u0430.    :param sectors: \u0420\u0430\u0437\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u0435\u0447\u0430\u0442\u0438.    &quot;&quot;&quot;    print(f'file: {file}')    try:        stamps = extract_stamps(file) # \u042d\u0442\u043e \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u0435\u0447\u0430\u0442\u0435\u0439.        metrics = compare_stamps(stamps, [ss for ss in sectors if 'stamp' in ss['tags']])        return file, metrics    except:        print(sys.exc_info())        return file, Metrics(0, 0, 0)  if __name__ == '__main__':    file_metrics = {}     # dataset - \u0441\u043b\u043e\u0432\u0430\u0440\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0443\u0442\u044c \u0434\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043f\u0430\u0440\u0435 \u0441 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0440\u0430\u0437\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0445 (\u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0445) \u043f\u0435\u0447\u0430\u0442\u0435\u0439.    for file, sectors in dataset.items():        file_metrics[file] = compare(file, sectors)     # \u041f\u043e\u0434\u0441\u0447\u0435\u0442 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u043b\u043d\u043e\u0442\u044b \u0438 F1-\u043c\u0435\u0440\u044b.    total_metrics = Metrics(*(sum(x) for x in zip(*file_metrics.values())))    precision = total_metrics.tp \/ (total_metrics.tp + total_metrics.fp) if total_metrics.tp &gt; 0 else 0    recall = total_metrics.tp \/ (total_metrics.tp + total_metrics.fn) if total_metrics.tp &gt; 0 else 0    f1 = 2 * precision * recall \/ (precision + recall) if (precision + recall) &gt; 0 else 0     print('precision\\trecall\\tf1')    print('{:.4f}\\t{:.4f}\\t{:.4f}'.format(precision * 100, recall * 100, f1 * 100).replace('.', ','))    print('tp\\tfp\\tfn')    print('{}\\t{}\\t{}'.format(total_metrics.tp, total_metrics.fp, total_metrics.fn))     print('tp\\tfp\\tfn')    for file in dataset.keys():        metric = file_metrics.get(file)        print(f'{metric.tp}\\t{metric.fp}\\t{metric.fn}')     print(f'precision: {precision}, recall: {recall}, f1: {f1}, {total_metrics}')<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<h3 id=\"hls-segmentaciya\">HLS-\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/h3>\n<p>  <\/p>\n<p>\u0426\u0432\u0435\u0442\u043e\u0432\u0430\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0432\u043b\u0435\u0447\u044c (\u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c) \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0446\u0432\u0435\u0442\u043e\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430. \u041d\u0430\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u043e\u0442 \u043f\u0435\u0447\u0430\u0442\u0435\u0439. \u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u043e\u0442 \u0442\u0430\u043a (<em>\u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043c\u0430\u0437\u0430\u043d\u044b<\/em>):<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/vz\/lc\/72\/vzlc72vx0p3izy6zgnm5ygss4z4.jpeg\"><\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0436\u0435 \u0432\u0441\u0435 \u043f\u043e \u043a\u0443\u0441\u043e\u0447\u043a\u0430\u043c.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 HLS \u043f\u0430\u043b\u0438\u0442\u0440\u044b. \u0421\u0430\u043c\u0430 \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440\u0430 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a Hue, Lightness, Saturation, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A2%D0%BE%D0%BD_(%D1%86%D0%B2%D0%B5%D1%82)\">\u0442\u043e\u043d<\/a>, <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%B2%D0%B5%D1%82%D0%BB%D0%BE%D1%82%D0%B0_(%D1%86%D0%B2%D0%B5%D1%82)\">\u0441\u0432\u0435\u0442\u043b\u043e\u0442\u0430<\/a>, <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9D%D0%B0%D1%81%D1%8B%D1%89%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(%D1%86%D0%B2%D0%B5%D1%82)\">\u043d\u0430\u0441\u044b\u0449\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/a>. \u0418\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0435 \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ou\/qx\/5n\/ouqx5n_do_-chltc10lfnabwxss.png\"><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u043d\u0430\u043c \u043f\u043e\u0434\u043e\u0448\u043b\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e? \u041d\u0430 \u0442\u0430\u043a\u043e\u0439 \u043f\u0430\u043b\u0438\u0442\u0440\u0435 \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u043e\u0442\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u0434\u0438\u043d \u0446\u0432\u0435\u0442 \u0432\u0437\u044f\u0432 \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0442\u043e\u043d\u0430. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0441\u0438\u043d\u0438\u0439 \u0438 \u0435\u0433\u043e \u043e\u0442\u0442\u0435\u043d\u043a\u0438, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043e\u0442 ~180 \u0434\u043e ~280.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/g2\/bo\/g3\/g2bog35vzpxfewky6jsaif_ovug.png\"><\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0438\u0436\u043d\u0438\u0439 \u043f\u043e\u0440\u043e\u0433 \u0434\u043b\u044f \u043d\u0430\u0441\u044b\u0449\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0438\u043b\u0438 \u0442\u0443\u0441\u043a\u043b\u043e-\u0441\u0438\u043d\u0438\u0439 \u0438 \u0441\u0435\u0440\u044b\u0439 \u0446\u0432\u0435\u0442, \u0438 \u043f\u043e\u0440\u043e\u0433 \u0441\u0432\u0435\u0442\u043b\u043e\u0442\u044b, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0447\u0435\u0440\u043d\u044b\u0439 \u0438 \u0431\u0435\u043b\u044b\u0439. <\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041e\u0442\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 (Python)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">def colored_mask(img, threshold = -1):    # \u0420\u0430\u0437\u043c\u044b\u0442\u0438\u0435 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u043b\u043a\u0438\u0445 \u0448\u0443\u043c\u043e\u0432.    denoised = cv2.medianBlur(img, 3)    cv2.imwrite('denoised.bmp', denoised)     # \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0427\u0411 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u043a\u0438.    gray = cv2.cvtColor(denoised, cv2.COLOR_BGR2GRAY)    cv2.imwrite('gray.bmp', gray)     # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.    adaptiveThreshold = threshold if threshold &gt;= 0 else cv2.mean(img)[0]    color = cv2.cvtColor(denoised, cv2.COLOR_BGR2HLS)    mask = cv2.inRange(color, (0, int(adaptiveThreshold \/ 6), 60), (180, adaptiveThreshold, 255))     # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0430\u0441\u043a\u0438 \u0446\u0432\u0435\u0442\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.    dst = cv2.bitwise_and(gray, gray, mask=mask)    cv2.imwrite('colors_mask.bmp', dst)    return dst<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041e\u0442\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 (C#)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">private void ColoredMask(Mat src, Mat dst, double threshold = -1) {  using (var gray = new Mat())  using (var color = new Mat())  using (var mask = new Mat())  using (var denoised = new Mat())  {    \/\/ \u0420\u0430\u0437\u043c\u044b\u0442\u0438\u0435 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u043b\u043a\u0438\u0445 \u0448\u0443\u043c\u043e\u0432.    Cv2.MedianBlur(src, denoised, 3);   denoised.Save(&quot;colors_denoised.bmp&quot;);     \/\/ \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u0427\u0411 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u043a\u0438.    Cv2.CvtColor(denoised, gray, ColorConversionCodes.BGR2GRAY);    gray.Save(&quot;colors_gray.bmp&quot;);     \/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.    var adaptiveThreshold = threshold &lt; 0 ? src.Mean()[0] : threshold;    Cv2.CvtColor(denoised, color, ColorConversionCodes.BGR2HLS);    Cv2.InRange(color, new Scalar(0, adaptiveThreshold \/ 6, 60), new Scalar(180, adaptiveThreshold, 255), mask);     \/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0430\u0441\u043a\u0438 \u0446\u0432\u0435\u0442\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.    Cv2.BitwiseAnd(gray, gray, dst, mask);    dst.Save(&quot;colors_mask.bmp&quot;);  } }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0435\u0447\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435 \u043d\u0430 \u044d\u0442\u043e:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/9d\/k-\/c2\/9dk-c2hxeixjye7lkyqm4k9yb8k.png\"><\/p>\n<p>  <\/p>\n<p>\u0418\u0437 \u0432\u0430\u0436\u043d\u044b\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u0432 \u0445\u043e\u0447\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u043e\u043d \u0434\u043b\u044f HLS \u0432 OpenCV \u0437\u0430\u0434\u0430\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u0435 \u043e\u0442 0 \u0434\u043e 360, \u0430 \u043e\u0442 0 \u0434\u043e 180. \u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u0430 \u2014 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0445\u043e\u0442\u0435\u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0432 uint8\/uchar\/byte, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043c\u0435\u0449\u0430\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442 0 \u0434\u043e 255, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u043b\u0438 360 \u043d\u0430 2.<\/p>\n<p>  <\/p>\n<h3 id=\"poisk-okruzhnostey\">\u041f\u043e\u0438\u0441\u043a \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0435\u0439<\/h3>\n<p>  <\/p>\n<p>\u041e\u043a\u0435\u0439, \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u0446\u0432\u0435\u0442, \u0430 \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435? \u041d\u0430\u043c \u0436\u0435 \u043d\u0443\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u043f\u0435\u0447\u0430\u0442\u0438, \u0430 \u043d\u0435 \u0432\u0441\u0451, \u0447\u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434 \u201c\u0446\u0432\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0441\u0438\u043d\u0438\u0439\u201d.<\/p>\n<p>  <\/p>\n<p>\u0422\u0443\u0442 \u043c\u044b \u043f\u0440\u0438\u0431\u0435\u0433\u043d\u0435\u043c \u043a \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u043c\u0443 \u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0425\u0430\u0444\u0430, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u044d\u043b\u043b\u0438\u043f\u0441\u044b \u0438 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438. <a href=\"http:\/\/wiki.technicalvision.ru\/index.php\/%D0%9F%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A5%D0%B0%D1%84%D0%B0,_%D0%B5%D0%B3%D0%BE_%D0%BE%D0%B1%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B8_%D0%BC%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B8\">\u0417\u0434\u0435\u0441\u044c<\/a>, <a href=\"http:\/\/wiki.technicalvision.ru\/index.php\/%D0%9F%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A5%D0%B0%D1%84%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BF%D1%80%D1%8F%D0%BC%D1%8B%D1%85\">\u0437\u0434\u0435\u0441\u044c<\/a> \u0438 <a href=\"http:\/\/wiki.technicalvision.ru\/index.php\/%D0%9F%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A5%D0%B0%D1%84%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BE%D0%BA%D1%80%D1%83%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B5%D0%B9\">\u0437\u0434\u0435\u0441\u044c<\/a> (\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438) \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0425\u0430\u0444\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0442\u0435, \u043a\u0442\u043e \u0436\u0430\u0436\u0434\u0435\u0442 \u0437\u043d\u0430\u043d\u0438\u0439 \u2014 \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0442\u0443\u0434\u0430. \u0417\u0434\u0435\u0441\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0442\u0435\u043c\u0430 \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0410 \u043c\u044b, \u0442\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0435\u0433\u043e \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0435\u0439. \u0411\u043b\u0430\u0433\u043e \u0432 OpenCV \u043e\u043d \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d, \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u043c\u0430\u0441\u043a\u0438 \u0441\u0438\u043d\u0435\u0433\u043e \u0446\u0432\u0435\u0442\u0430, \u0438 \u0432\u0441\u0435 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c, \u0447\u0442\u043e \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0425\u0430\u0444\u0430 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d <a href=\"https:\/\/en.wikipedia.org\/wiki\/Edge_detection\">\u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0433\u0440\u0430\u043d\u0438\u0446 \u041a\u0435\u043d\u043d\u0438<\/a>, \u0447\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0436\u0438\u0437\u043d\u044c.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u0438\u0441\u043a \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0425\u0430\u0444\u0430 (Python)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\"># mask - \u043c\u0430\u0441\u043a\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0441\u043b\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438; # method: \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0435\u0439 (\u0432 OpenCV \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0442\u043e\u043b\u044c\u043a\u043e Gradient); # dp: \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0435 \u0434\u043b\u044f \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0446\u0435\u043d\u0442\u0440\u043e\u0432 \u043a\u0440\u0443\u0433\u043e\u0432 (1 \u2014 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c, 2 \u2014 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u044b\/\u0448\u0438\u0440\u0438\u043d\u044b \u0438 \u0442.\u0434. \u0427\u0435\u043c \u043d\u0438\u0436\u0435 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0442.\u0435. \u0432\u044b\u0448\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435), \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u201c\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u201d \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0434\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u043c\u0443-\u043b\u0438\u0431\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u0437\u0430 \u043a\u0440\u0443\u0433. \u042d\u0442\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u043f\u043b\u043e\u0445\u043e \u201c\u043f\u0440\u043e\u043f\u0435\u0447\u0430\u0442\u0430\u043d\u043d\u044b\u0435\u201d \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0435 \u043d\u0430\u0439\u0442\u0438\u0441\u044c); # minDist: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 (\u043c\u044b \u0431\u0440\u0430\u043b\u0438 % \u043e\u0442 \u0448\u0438\u0440\u0438\u043d\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f); # param1: \u0432\u0435\u0440\u0445\u043d\u0435\u0435 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0435 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0443 \u0433\u0440\u0430\u043d\u0438\u0446 \u041a\u0435\u043d\u043d\u0438 (\u043d\u0438\u0436\u043d\u0435\u0435 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432 2 \u0440\u0430\u0437\u0430 \u043c\u0435\u043d\u044c\u0448\u0435); # param2: \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044f \u0446\u0435\u043d\u0442\u0440\u043e\u0432; # minRadius: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0434\u0438\u0443\u0441 \u043a\u0440\u0443\u0433\u0430; # maxRadius: \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0434\u0438\u0443\u0441 \u043a\u0440\u0443\u0433\u0430; circles = cv2.HoughCircles(mask, cv2.HOUGH_GRADIENT, 1, 20, param1, param2, minRadius, maxRadius)  # \u041e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438. circles = np.uint16(np.around(circles)) cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) for i in circles[0,:]:     cv2.circle(cimg,(i[0],i[1]),i[2],(165,25,165),2)<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u0438\u0441\u043a \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0425\u0430\u0444\u0430 (C#)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">\/\/ mask - \u043c\u0430\u0441\u043a\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0441\u043b\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438; \/\/ method: \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0438\u0441\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0435\u0439 (\u0432 OpenCV \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0442\u043e\u043b\u044c\u043a\u043e Gradient); \/\/ dp: \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0435 \u0434\u043b\u044f \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0446\u0435\u043d\u0442\u0440\u043e\u0432 \u043a\u0440\u0443\u0433\u043e\u0432 (1 \u2014 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c, 2 \u2014 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0432\u044b\u0441\u043e\u0442\u044b\/\u0448\u0438\u0440\u0438\u043d\u044b \u0438 \u0442.\u0434. \u0427\u0435\u043c \u043d\u0438\u0436\u0435 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u0442.\u0435. \u0432\u044b\u0448\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435), \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u201c\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u201d \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0434\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u043c\u0443-\u043b\u0438\u0431\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u0437\u0430 \u043a\u0440\u0443\u0433. \u042d\u0442\u043e \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u043f\u043b\u043e\u0445\u043e \u201c\u043f\u0440\u043e\u043f\u0435\u0447\u0430\u0442\u0430\u043d\u043d\u044b\u0435\u201d \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0435 \u043d\u0430\u0439\u0442\u0438\u0441\u044c); \/\/ minDist: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 (\u043c\u044b \u0431\u0440\u0430\u043b\u0438 % \u043e\u0442 \u0448\u0438\u0440\u0438\u043d\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f); \/\/ param1: \u0432\u0435\u0440\u0445\u043d\u0435\u0435 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0435 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0443 \u0433\u0440\u0430\u043d\u0438\u0446 \u041a\u0435\u043d\u043d\u0438 (\u043d\u0438\u0436\u043d\u0435\u0435 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432 2 \u0440\u0430\u0437\u0430 \u043c\u0435\u043d\u044c\u0448\u0435); \/\/ param2: \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0435\u0442\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0446\u0435\u043d\u0442\u0440\u043e\u0432; \/\/ minRadius: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0434\u0438\u0443\u0441 \u043a\u0440\u0443\u0433\u0430; \/\/ maxRadius: \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0434\u0438\u0443\u0441 \u043a\u0440\u0443\u0433\u0430; var houghCircles = Cv2.HoughCircles(morphed, HoughMethods.Gradient, 1, max, cannyEdgeThreshold, houghThreshold, min, max);  \/\/ \u041e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u043c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438. foreach (var circle in houghCircles)  Cv2.Circle(morphed, circle.Center, (int)circle.Radius, new Scalar(165, 25, 165), 2);<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u043e\u0442 \u044d\u0442\u043e:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/qw\/eu\/uc\/qweuucfjdtoefrmtyvdxoj0wazy.png\"><\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u043d\u0435 \u0432\u0441\u0451 \u0442\u0430\u043a \u0433\u043b\u0430\u0434\u043a\u043e, \u043a\u0430\u043a \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b. \u041c\u044b \u043d\u0430\u0448\u043b\u0438 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0442\u0430\u043c, \u0433\u0434\u0435 \u0445\u043e\u0442\u0435\u043b\u0438, \u0430 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u0448\u0443\u043c\u0430. \u0414\u0430, \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430, \u0433\u0434\u0435 \u0443\u0434\u0430\u043b\u0438\u043b\u0441\u044f \u0431\u044b \u0432\u0435\u0441\u044c \u0448\u0443\u043c, \u043d\u043e \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u043f\u0435\u0447\u0430\u0442\u0438. \u041a\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0443 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c (\u0433\u0434\u0435-\u0442\u043e \u043f\u0435\u0447\u0430\u0442\u0438 \u201c\u0443\u043b\u0435\u0442\u0430\u044e\u0442\u201d \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u0437-\u0437\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0440\u043e\u0433\u043e\u0432 \u043f\u0440\u0438 \u043e\u0442\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0446\u0432\u0435\u0442\u0430, \u0433\u0434\u0435-\u0442\u043e \u0448\u0443\u043c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u044c).<\/p>\n<p>  <\/p>\n<h3 id=\"filtraciya\">\u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f<\/h3>\n<p>  <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0447\u0442\u043e-\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432. <\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0442\u0443 \u043e\u0431\u043b\u0430\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0437\u0430 \u043a\u0440\u0443\u0433. \u0422\u0430\u043a \u043a\u0430\u043a \u0448\u0443\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b \u0438\u0437 \u0441\u0435\u0431\u044f \u201c\u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435\u201d \u0441\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0432\u043e\u043e\u0440\u0443\u0436\u0438\u043b\u0438\u0441\u044c \u0442\u0435\u043e\u0440\u0438\u0435\u0439, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u043b\u043e\u0436\u043d\u044b\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u044b. \u0412 \u0438\u0442\u043e\u0433\u0435 \u2014 \u0432\u044b\u0440\u0435\u0437\u0430\u0435\u043c \u043a\u0440\u0443\u0433, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/io\/zw\/gq\/iozwgqabifnjlswodk0obpowtfc.png\"><\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0433\u0434\u0435 \u043c\u044b \u0432\u044b\u0440\u0435\u0437\u0430\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043a\u0440\u0443\u0433\u0438, \u043c\u0435\u0441\u0442\u043e \u0441 \u0448\u0443\u043c\u043e\u043c \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043e, \u0447\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430. \u041d\u043e \u043d\u0435 \u0432\u0441\u0451 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e. \u041f\u0435\u0447\u0430\u0442\u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u0442\u043a\u043e, \u0438 \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u043f\u043e\u0434 \u044d\u0442\u043e\u0442 \u0444\u0438\u043b\u044c\u0442\u0440. \u041d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u201c\u043d\u0430\u0438\u0432\u043d\u043e\u0433\u043e\u201d \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u044d\u0442\u0430 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0441\u0442\u044c (Python)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">def equals(first, second, epsilon):    diff = cv2.subtract(first, second)    nonZero = cv2.countNonZero(diff)    area = first.size * epsilon    return nonZero &lt;= area  for i in circles[0, :]:    empty = np.zeros((256, 256, 1), dtype=&quot;uint8&quot;)    cv2.circle(empty, (i[0], i[1]), i[2], (255, 255, 255), -1)    crop = img * (empty.astype(img.dtype))     cv2.imwrite('crop.bmp', crop)     if not equals(crop, empty, threshold):        result.append(i)<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0441\u0442\u044c (C#)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">foreach (var circle in circles) {   var x = (int) circle.Center.X;   var y = (int) circle.Center.Y;   var radius = (int) Math.Floor(circle.Radius);    using (var empty = Mat.Zeros(src.Rows, src.Cols, MatType.CV_8UC1))   using (var mask = empty.ToMat())   using (var crop = new Mat())   {     \/\/ \u0412\u044b\u0440\u0435\u0437\u0430\u043d\u0438\u0435 \u043a\u0440\u0443\u0433\u0430 (\u043f\u0435\u0447\u0430\u0442\u0438) \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.     Cv2.Circle(mask, x, y, radius, Scalar.White, -1);     src.CopyTo(crop, mask);      crop.Save(&quot;crop.bmp&quot;);      \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c\u0438.     if (!MatEquals(crop, empty, threshold))     result.Add(circle);   } }  private bool MatEquals(Mat a, Mat b, double epsilon = 0.0) {   var notEquals = a.NotEquals(b);   var nonZero = Cv2.CountNonZero(notEquals);   var area = a.Rows * epsilon * a.Cols;   return nonZero &lt;= area; }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0439 \u043d\u0430 \u0448\u0443\u043c\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u0410 \u0432\u043e\u0442 \u0447\u0442\u043e \u0436\u0435 \u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u0440\u0443\u043a\u043e\u043f\u0438\u0441\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u0430 \u0438\u0437-\u0437\u0430 \u0441\u0438\u043d\u0435\u0439 \u043f\u0430\u0441\u0442\u044b \u0438 \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u044d\u0442\u0443 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044e? <\/p>\n<p>  <\/p>\n<p>\u0410 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0432\u0441\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u043a\u043e\u043d\u0442\u0443\u0440\u044b \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438, \u0432\u043f\u0438\u0448\u0435\u043c \u0432 \u043d\u0438\u0445 \u044d\u043b\u043b\u0438\u043f\u0441\u044b \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u043b\u0438\u043f\u0441 \u2013 \u043a\u0440\u0443\u0433, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u2013 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u0430\u043b\u043e\u0439 (minor) \u043e\u0441\u0438 \u043a \u0431\u043e\u043b\u044c\u0448\u043e\u0439 (major) (\u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u0440\u0430\u0437\u0443 \u0432\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u0431\u044b\u043b \u0448\u0430\u043d\u0441 \u043d\u0430\u043f\u043e\u0440\u043e\u0442\u044c\u0441\u044f \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0448\u0443\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0431\u044b \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u044f\u0442 \u043a\u0430\u043a \u043f\u0435\u0447\u0430\u0442\u044c).<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/01\/qn\/in\/01qniniaa9l98w-6hcmrie5c9q0.png\"><\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043e\u0434\u043d\u043e \u0443\u0431\u0438\u043b\u0438 \u0434\u0432\u0443\u0445 \u0437\u0430\u0439\u0446\u0435\u0432: \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0425\u0430\u0444\u0430 \u043d\u0435 \u043b\u044e\u0431\u0438\u0442 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D0%BE%D0%BD%D1%86%D0%B5%D0%BD%D1%82%D1%80%D0%B8%D1%87%D0%BD%D1%8B%D0%B5_%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B\">\u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u0440\u0443\u0433\u0438<\/a>, \u0438 \u0447\u0430\u0441\u0442\u0435\u043d\u044c\u043a\u043e \u043d\u0430 \u043f\u0435\u0447\u0430\u0442\u044f\u0445 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043a\u0440\u0443\u0433 \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e, \u043f\u043b\u044e\u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0447\u0430\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043b.<\/p>\n<p>  <\/p>\n<p>\u041d\u0435\u0445\u0438\u0442\u0440\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c (\u0442\u0440\u0435\u0448\u0445\u043e\u043b\u0434\u0430\u043c\u0438) \u043e\u0442\u0441\u0435\u0438\u0432\u0430\u0435\u043c \u043d\u0435\u0431\u043b\u0430\u0433\u043e\u0440\u043e\u0434\u043d\u044b\u0435 \u044d\u043b\u043b\u0438\u043f\u0441\u044b, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0434\u0440\u0443\u0433 \u0432 \u0434\u0440\u0443\u0433\u0430 \u043a\u0440\u0443\u0433\u0438, \u0438 voila \u2013 \u0432\u044b\u043a\u0438\u0434\u044b\u0432\u0430\u0435\u043c \u043a\u0443\u0447\u0443 \u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0439.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/oo\/_u\/6w\/oo_u6wwv6n7jwpgjfbc4bqiib7i.png\"><\/p>\n<p>  <\/p>\n<p><em>\u0424\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u0435 \u043a\u0440\u0443\u0433\u0438 \u2013 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0425\u0430\u0444\u0430, \u0437\u0435\u043b\u0435\u043d\u044b\u0439 \u2013 \u044d\u043b\u043b\u0438\u043f\u0441 \u0441 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u043a\u0440\u0443\u0433\u043e\u043c, \u0441\u0438\u043d\u0438\u0439 \u2013 \u044d\u043b\u043b\u0438\u043f\u0441 \u0431\u0435\u0437 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043a\u0440\u0443\u0433\u043e\u0432, \u0433\u043e\u043b\u0443\u0431\u043e\u0439 \u2013 \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0443\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u044d\u043b\u043b\u0438\u043f\u0441\u043e\u043c.<\/em><\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u0438\u0441\u043a \u043a\u0440\u0443\u0433\u043e\u0432 \u043f\u043e \u0432\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0432 \u043a\u043e\u043d\u0442\u0443\u0440\u044b \u044d\u043b\u043b\u0438\u043f\u0441\u0430\u043c (Python)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">segments = [] contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for contour in contours:    if contour.shape[0] &lt; 5:        continue     ellipse = cv2.fitEllipse(contour)    width = ellipse[1][0]    height = ellipse[1][1]    minor = min(width, height)    major = max(width, height)     if minor \/ 2 &gt; minorMin and major \/ 2 &lt; majorMax:        r1 = math.fabs(1 - math.fabs(major - minor) \/ max(minor, major))        cv2.ellipse(src, ellipse, (255, 0, 0), 3)         if r1 &gt; roundness:            segments.append((ellipse[0], major \/ 2))            cv2.ellipse(src, ellipse, (0, 255, 0), 3)    else: cv2.ellipse(src, ellipse, (0, 0, 255), 1)  cv2.imwrite('test_res.bmp', src)<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043a\u0440\u0443\u0433\u043e\u0432 (Python)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">def distance(p1, p2):    return math.sqrt(math.pow(p2[0] - p1[0], 2) + math.pow(p2[1] - p1[1], 2))  def isNested(inner, outer, epsilon):    distance = distance(inner[0], outer[0])    radius = outer[1] * epsilon    return distance &lt; radius and inner[1] &lt; radius - distance  nested = [] for i in inner:    for o in outer:        if (isNested(i, o, 1.3)):            if (distance(i[0], i[1]) &lt; 30 and i[1] \/ o[1] &gt; 0.75):                nested.append(i)            else: nested.append(o)<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u0438\u0441\u043a \u043a\u0440\u0443\u0433\u043e\u0432 \u043f\u043e \u0432\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0432 \u043a\u043e\u043d\u0442\u0443\u0440\u044b \u044d\u043b\u043b\u0438\u043f\u0441\u0430\u043c (C#)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">Cv2.FindContours(src, out var contours, hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);   foreach (var contour in contours)   {     \/\/ \u042d\u043b\u043b\u0438\u043f\u0441 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u043e 5 \u0442\u043e\u0447\u043a\u0430\u043c.     if (contour.Height &lt; 5)     continue;      var ellipse = Cv2.FitEllipse(contour);     var minor = Math.Min(ellipse.Size.Width, ellipse.Size.Height);     var major = Math.Max(ellipse.Size.Width, ellipse.Size.Height);      if (minor \/ 2 &gt; minorSize &amp;&amp; major \/ 2 &lt; majorSize)     {     \/\/ \u041e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u0430\u043b\u043e\u0439 \u043e\u0441\u0438 \u043a \u0431\u043e\u043b\u044c\u0448\u043e\u0439. \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u043b\u0438\u043f\u0441 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043a\u0440\u0443\u0433.     var r1 = Math.Abs(1 - Math.Abs(major - minor) \/ Math.Max(minor, major));     if (r1 &gt; roundness)     {         var circle = new CircleSegment(ellipse.Center, major \/ 2);         segments.Add(circle);     }     }     contour.Dispose();   } }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043a\u0440\u0443\u0433\u043e\u0432 (C#)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">private bool IsCirclesNested(CircleSegment inner, CircleSegment outer, double epsilon) {   var distance = inner.Center.DistanceTo(outer.Center);   var secondRadius = outer.Radius * epsilon;   return distance &lt; secondRadius &amp;&amp; inner.Radius &lt; secondRadius - distance; }  var nested = new List&lt;CircleSegment&gt;(); foreach (var i in inner) foreach (var o in outer) {   if (IsCirclesNested(i, o, 1.3))   {     if (i.Center.DistanceTo(o.Center) &lt; 30 &amp;&amp;         i.Radius \/ o.Radius &gt; 0.75)     nested.Add(i);     else nested.Add(o);   } }  return outer.Union(inner).Except(nested).ToList();<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0434\u0443\u043c\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0442\u043e \u044f \u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c, \u0447\u0442\u043e \u043d\u0435\u0442. \u0425\u043e\u0442\u044f \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0445\u0432\u0430\u0442\u0430\u0442\u044c. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u2014 \u0443\u0441\u0442\u0440\u043e\u0439\u0442\u0435\u0441\u044c \u043f\u043e\u0443\u0434\u043e\u0431\u043d\u0435\u0439, \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0449\u0435\u043f\u043e\u0442\u043a\u0430 \u201c\u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043c\u0430\u0433\u0438\u0438\u201d, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Log-polar_coordinates\">\u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e-\u043f\u043e\u043b\u044f\u0440\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443<\/a>. \u042f \u043c\u043e\u0433\u0443 \u043f\u043e\u043d\u044f\u0442\u044c \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u201c\u0447\u0435\u043c \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c\u201d? \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u201c\u0432\u044b\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c\u201d \u043f\u0435\u0447\u0430\u0442\u044c. \u041d\u043e \u0437\u0430\u0447\u0435\u043c? \u042d\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043a\u0440\u0443\u0433\u043b\u044b\u043c. \u041f\u043e\u043a\u0430\u0436\u0443 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/uf\/1p\/jy\/uf1pjyqiflqf2fkigkhqkenxduq.jpeg\"><\/p>\n<p>  <\/p>\n<p>\u0414\u0443\u043c\u0430\u044e, \u0432\u0441\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0430\u043a\u043e\u0439 \u0432 \u044d\u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b: \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u0440\u0443\u0433\u043b\u044b\u0439 \u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043b\u0435\u0433\u0447\u0435, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u043d\u0435 \u043a\u0440\u0443\u0433\u043b\u044b\u0439, \u0430 \u0432 \u0432\u0438\u0434\u0435 \u043b\u0438\u043d\u0438\u0438. \u0412\u043e\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/a0\/x4\/qz\/a0x4qz7ced9vgvksahdnkvbab6c.jpeg\"><\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043e\u0440\u0438\u044f \u0442\u0443\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u2014 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0445 \u043d\u0430\u043c X \u0438 Y \u043c\u044b \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0431\u0435\u0440\u0435\u043c \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0442 \u0446\u0435\u043d\u0442\u0440\u0430 \u0434\u043e \u0442\u043e\u0447\u043a\u0438 \u0438 \u0443\u0433\u043e\u043b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0441\u044c X, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u043b\u0430 \u043d\u0443\u0436\u043d\u0443\u044e \u043d\u0430\u043c \u0442\u043e\u0447\u043a\u0443. \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Polar_coordinate_system\">\u043f\u043e\u043b\u044f\u0440\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442<\/a>, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0430 \u043d\u0435 \u0441\u0430\u043c\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xt\/hi\/yy\/xthiyys8euwaeosqi7z7e8mcjgw.jpeg\"><\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0431\u043b\u0438\u0436\u0435 \u043a \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u2014 \u0431\u0435\u0440\u0435\u043c \u043d\u0430\u0448\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u0440\u0443\u0433\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0425\u0430\u0444\u0430, \u0432\u044b\u0440\u0435\u0437\u0430\u0435\u043c \u0435\u0433\u043e \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u0432 \u043f\u043e\u043b\u044f\u0440\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 (\u0432\u044b\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0438\u0437\u043d\u0430\u043d\u043a\u0443). \u0414\u0430\u043b\u044c\u0448\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u0441\u0451 \u0442\u043e \u0436\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0425\u0430\u0444\u0430, \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0440\u044f\u043c\u044b\u0435 \u043b\u0438\u043d\u0438\u0438 (\u0432 \u0441\u0442\u0430\u0442\u044c\u044f\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b \u0432\u044b\u0448\u0435 \u0442\u0430\u043a\u0436\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043e, \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0437\u0430 \u044d\u0442\u0438\u043c, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c).<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0432 \u043f\u043e\u043b\u044f\u0440\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0432 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0430 \u0432 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u043c. \u041c\u044b (\u0434\u043b\u044f \u0441\u0435\u0431\u044f) \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0433\u043e \u043d\u0430 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0441 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0432 \u043f\u043e\u043b\u044f\u0440\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 (Python)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">maxRadius = math.sqrt(math.pow(src.shape[0], 2) + math.pow(src.shape[1], 2)) \/ 2 magnitude = src.shape[0] \/ math.log(maxRadius) center = (src.shape[0] \/ 2, src.shape[1] \/ 2) polar = cv2.logPolar(src, center, magnitude, cv2.INTER_AREA)<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0432 \u043f\u043e\u043b\u044f\u0440\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 (C#)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">var maxRadius = Math.Sqrt(Math.Pow(stampImage.Width, 2) + Math.Pow(stampImage.Height, 2)) \/ 2; var magnitude = stampImage.Width \/ Math.Log(maxRadius); var center = new Point2f(stampImage.Width \/ 2, stampImage.Height \/ 2); Cv2.LogPolar(stampImage, cartesianImage, center, magnitude, InterpolationFlags.Area);<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0443\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Sobel_operator\">\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0421\u043e\u0431\u0435\u043b\u044f<\/a>, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0443\u0440\u044b \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u0430, \u043f\u043b\u044e\u0441 \u043d\u0435\u043c\u043d\u043e\u0433\u043e OpenCV\u2019\u0448\u043d\u043e\u0439 \u043c\u0430\u0433\u0438\u0438 \u0432 \u0432\u0438\u0434\u0435 <a href=\"https:\/\/docs.opencv.org\/3.2.0\/d1\/dee\/tutorial_moprh_lines_detection.html\">\u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439<\/a>. \u0422\u0430\u043a\u0436\u0435, \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0443\u0440\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Canny_edge_detector\">\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u041a\u0435\u043d\u043d\u0438<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043a\u0441\u0442\u0430\u0442\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0425\u0430\u0444\u0430 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 OpenCV. \u041a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0438\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443, \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0421\u043e\u0431\u0435\u043b\u044f \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043b\u0438\u043d\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0425\u0430\u0444\u0430:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mu\/eq\/b3\/mueqb3cm4bjob3ubkj3hkd3vafk.jpeg\"><\/p>\n<p>  <\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u043c\u044b \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c, \u0447\u0442\u043e \u043b\u0438\u043d\u0438\u044f \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0440\u043e\u0432\u043d\u043e \u043f\u043e\u0434 \u0443\u0433\u043b\u043e\u043c \u0432 90 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u0446\u0435\u043d\u0442\u0440 \u043c\u043e\u0433 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u043e\u0447\u043d\u043e.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u043d\u0442\u0443\u0440\u044b \u0438 \u043f\u043e\u0438\u0441\u043a \u043f\u0440\u044f\u043c\u044b\u0445 \u043b\u0438\u043d\u0438\u0439 (Python)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\"># \u041f\u043e\u0438\u0441\u043a \u0433\u0440\u0430\u043d\u0438\u0446. sobel = cv2.Sobel(polar, cv2.CV_16S, 1, 0) kernel = cv2.getStructuringElement(shape=cv2.MORPH_RECT, ksize=(1, 5)) img = cv2.convertScaleAbs(sobel) img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)  # \u041f\u043e\u0438\u0441\u043a \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043b\u0438\u043d\u0438\u0439. def is_vertical(img_src, line):    tolerance = 10    coords = line[0]    angle = math.atan2(coords[3] - coords[1], coords[2] - coords[0]) * 180.0 \/ math.pi    edge = img_src.shape[0] * 0.66    out_of_bounds = coords[0] &lt; edge and coords[2] &lt; edge    return math.fabs(90 - math.fabs(angle)) &lt;= tolerance and not out_of_bounds  lines = cv2.HoughLinesP(img, 1, math.pi \/ 180, 15, img.shape[0] \/ 5, 10) vertical = [line for line in lines if is_vertical(img, line)] correct_lines = len(vertical)<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u043d\u0442\u0443\u0440\u044b \u0438 \u043f\u043e\u0438\u0441\u043a \u043f\u0440\u044f\u043c\u044b\u0445 \u043b\u0438\u043d\u0438\u0439 (C#)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">\/\/ \u041f\u043e\u0438\u0441\u043a \u0433\u0440\u0430\u043d\u0438\u0446. using (var sobel = new Mat()) using (var kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(1, 5))) {   Cv2.Sobel(img, sobel, MatType.CV_16S, 1, 0);   Cv2.ConvertScaleAbs(sobel, img);   Cv2.Threshold(img, img, 0, 255, ThresholdTypes.Binary | ThresholdTypes.Otsu);   Cv2.MorphologyEx(img, img, MorphTypes.Open, kernel);   Cv2.MorphologyEx(img, img, MorphTypes.Close, kernel); }  \/\/ \u041f\u043e\u0438\u0441\u043a \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043b\u0438\u043d\u0438\u0439. bool AlmostVerticalLine(LineSegmentPoint line) {   const int tolerance = 10;   var angle = Math.Atan2(line.P2.Y - line.P1.Y, line.P2.X - line.P1.X) * 180.0 \/ Math.PI;   var edge = edges.Width * 0.66;   var outOfBounds = line.P1.X &lt; edge &amp;&amp; line.P2.X &lt; edge;   return Math.Abs(90 - Math.Abs(angle)) &lt;= tolerance &amp;&amp; !outOfBounds; } var lines = Cv2.HoughLinesP(img, 1, Math.PI \/ 180, 15, img.Width \/ 5, 10); var correctLinesCount = lines.Count(AlmostVerticalLine);<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0441\u043d\u0438\u0437\u0438\u043b\u0438 \u043f\u043e\u0440\u043e\u0433\u0438 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u0440\u0443\u0433\u043e\u0432, \u043d\u0430\u043b\u043e\u0436\u0438\u043b\u0438 \u043d\u0430\u0448\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u043b\u0438\u0437\u043a\u0438\u0439 \u043a 85%. \u041d\u043e \u0435\u0441\u0442\u044c \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0446\u0432\u0435\u0442\u043d\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0445 (\u0445\u043e\u0442\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0438 \u0431\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u0430, \u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0445\u0443\u0436\u0435);<\/li>\n<li>\u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0435\u0447\u0430\u0442\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 (\u0442\u0430\u043a \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u043f\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0432\u0430\u0442\u043c\u0430\u043d\u0435 \u2014 \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u043d\u0430 \u043f\u0440\u043e\u043b\u0435\u0442\u0438\u0442 \u043c\u0438\u043c\u043e);<\/li>\n<li>\u0440\u0443\u043a\u043e\u043f\u0438\u0441\u043a\u0430 \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435, \u0431\u044b\u0432\u0430\u0435\u0442, \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043d\u0438\u0445 \u0434\u0430\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438;<\/li>\n<li>\u043d\u0443 \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u0448\u0443\u043c\u0430\u043c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a \u0441\u0438\u043d\u0438\u043c.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u201c\u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u043d\u0435\u0439\u0440\u043e\u043d\u043e\u0447\u043a\u0438?\u201d. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u044b\u0445;<\/li>\n<li>\u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 (\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043c\u0435\u0442\u0440\u0438\u043a);<\/li>\n<li>\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0443\u0447\u0430\u0442\u044c \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0443;<\/li>\n<li>\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u043e\u0435, \u043a\u0430\u043a \u0432 \u043f\u043b\u0430\u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0430\u043a \u0432 \u043f\u043b\u0430\u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u044b, \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041c\u044b \u0432\u044b\u0431\u0440\u0430\u043b\u0438 OpenCV \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0447\u0430\u0442\u0435\u0439 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0437\u0434\u0435\u0441\u044c \u0438 \u0441\u0435\u0439\u0447\u0430\u0441, \u0434\u0430 \u0438 \u043e\u043f\u044b\u0442\u0430 \u0441 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430\u043c\u0438 \u0431\u044b\u043b\u043e \u043c\u0430\u043b\u043e. \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0443\u0436\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b\u0438 \u043d\u0430 U-Net, \u0442\u0430\u043a \u043a\u0430\u043a \u0445\u043e\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 OpenCV \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0435, \u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/directum\/blog\/486476\/\"> https:\/\/habr.com\/ru\/company\/directum\/blog\/486476\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/directum\/blog\/486476\/\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/6q\/4h\/pq\/6q4hpqklwmxrpx8mj6gnso29yg4.png\"><br \/>  \u041d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0441\u0442\u043e\u044f\u043b\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430\u0439\u0442\u0438 \u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u043f\u0435\u0447\u0430\u0442\u0438 \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0417\u0430\u0447\u0435\u043c? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u0435\u0447\u0430\u0442\u0435\u0439 \u0432 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0430\u0445 \u0441 \u0434\u0432\u0443\u0445 \u0441\u0442\u043e\u0440\u043e\u043d (\u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0430). \u0423 \u043d\u0430\u0441 \u0432 \u0437\u0430\u043a\u0440\u043e\u043c\u0430\u0445 \u0443\u0436\u0435 \u0431\u044b\u043b \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0434\u043b\u044f \u0438\u0445 \u043f\u043e\u0438\u0441\u043a\u0430, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 OpenCV, \u043d\u043e \u043e\u043d \u0431\u044b\u043b \u0441\u044b\u0440\u043e\u0432\u0430\u0442. \u0420\u0435\u0448\u0438\u043b\u0438 \u043e\u0442\u043a\u043e\u043f\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u043a\u0442, \u0441\u0442\u0440\u044f\u0445\u043d\u0443\u0442\u044c \u0441 \u043d\u0435\u0433\u043e \u043f\u044b\u043b\u044c \u0438 \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u0435\u043c\u043e\u0432, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0437\u0434\u0435\u0441\u044c, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0438 \u0432\u043d\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u0435\u0447\u0430\u0442\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0446\u0432\u0435\u0442\u043e\u0432\u0430\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f;<\/li>\n<li>\u043f\u043e\u0438\u0441\u043a \u043a\u0440\u0443\u0433\u043b\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \/ \u043e\u043a\u0440\u0443\u0436\u043d\u043e\u0441\u0442\u0435\u0439;<\/li>\n<li>\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u043e\u043b\u044f\u0440\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442;<\/li>\n<li>\u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, Intersection over Union (IoU, \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0416\u0430\u043a\u043a\u0430\u0440\u0430).<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435, \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430: \u0440\u0435\u0448\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 \u0438\u043b\u0438 \u0436\u0435 \u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0438\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u043d\u0430 OpenCV. \u041f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c OpenCV? \u041e\u0442\u0432\u0435\u0442 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-298039","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/298039","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=298039"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/298039\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=298039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=298039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=298039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}