{"id":414934,"date":"2024-06-30T00:03:38","date_gmt":"2024-06-30T00:03:38","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=414934"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=414934","title":{"rendered":"<span>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0435 (\u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435) \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (planar\/perspective panoramic image). \u0421\u0442\u0430\u0442\u044c\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u0434 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435<code>Python<\/code>\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<code>OpenCV<\/code>.<\/p>\n<figure class=\"bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/6ae\/22a\/76c\/6ae22a76ce6da871090b0362a3b752dc.jpg\" alt=\"\u041f\u043b\u043e\u0441\u043a\u043e\u0435 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 + \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043f\u043e \u043a\u0440\u0430\u044f\u043c\" title=\"\u041f\u043b\u043e\u0441\u043a\u043e\u0435 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 + \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043f\u043e \u043a\u0440\u0430\u044f\u043c\" width=\"4000\" height=\"3094\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6ae\/22a\/76c\/6ae22a76ce6da871090b0362a3b752dc.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u041f\u043b\u043e\u0441\u043a\u043e\u0435 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 + \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043f\u043e \u043a\u0440\u0430\u044f\u043c<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043d\u044f\u0442\u044b\u0435 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0437\u0440\u0430\u0447\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u0430, \u043d\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043d\u0435 \u0441\u0442\u0440\u0430\u0448\u043d\u044b, \u043d\u043e \u043e\u043d\u0438 \u0434\u0430\u0434\u0443\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p>\u041f\u043b\u043e\u0441\u043a\u0430\u044f \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"180^{\\circ}\" alt=\"180^{\\circ}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d3c\/731\/743\/d3c731743555a8e95ed397e7374b1bc9.svg\" width=\"38\" height=\"18\"\/>\u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438, \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0434\u0438\u0430\u043c\u0435\u0442\u0440\u0443 (\u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439, \u0446\u0438\u043b\u0438\u043d\u0434\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f\u0445). \u041d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043b\u043e\u0441\u043a\u0430\u044f \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u0430 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u044f\u043c\u044b\u0435 \u043b\u0438\u043d\u0438\u0438 \u043f\u0440\u044f\u043c\u044b\u043c\u0438 \u2014 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u0430\u043a\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043a\u0430\u043a\u043e\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0440\u0438 \u0441\u044a\u0435\u043c\u043a\u0435 \u0441 \u0442\u043e\u0439 \u0436\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u0430\u043c\u0435\u0440\u043e\u0439 \u0441 \u0431\u043e\u0301\u043b\u044c\u0448\u0438\u043c\u0438 \u0443\u0433\u043b\u0430\u043c\u0438 \u043e\u0431\u0437\u043e\u0440\u0430 (\u043c\u0435\u043d\u044c\u0448\u0438\u043c \u0444\u043e\u043a\u0443\u0441\u043d\u044b\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c).<\/p>\n<figure class=\"bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/de1\/e4d\/353\/de1e4d3536dc9729bd438fb2e3df2d89.jpg\" alt=\"\u041f\u0430\u043d\u043e\u0440\u0430\u043c\u0430 \u0432 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 (\u0441\u043b\u0435\u0432\u0430) \u0438 \u043f\u043b\u043e\u0441\u043a\u043e\u0439 (\u0441\u043f\u0440\u0430\u0432\u0430) \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f\u0445\" title=\"\u041f\u0430\u043d\u043e\u0440\u0430\u043c\u0430 \u0432 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 (\u0441\u043b\u0435\u0432\u0430) \u0438 \u043f\u043b\u043e\u0441\u043a\u043e\u0439 (\u0441\u043f\u0440\u0430\u0432\u0430) \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f\u0445\" width=\"4000\" height=\"2000\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/de1\/e4d\/353\/de1e4d3536dc9729bd438fb2e3df2d89.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u041f\u0430\u043d\u043e\u0440\u0430\u043c\u0430 \u0432 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 (\u0441\u043b\u0435\u0432\u0430) \u0438 \u043f\u043b\u043e\u0441\u043a\u043e\u0439 (\u0441\u043f\u0440\u0430\u0432\u0430) \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f\u0445<\/figcaption><\/div>\n<\/figure>\n<h2>\u0422\u0435\u043e\u0440\u0438\u044f<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c<img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{P}^2\" alt=\"\\mathrm{P}^2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/08c\/97a\/186\/08c97a1869f7e07ad7accdfa5d4918bb.svg\" width=\"22\" height=\"21\"\/>. \u041f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a, \u0432\u0438\u0434\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(x, y, 1)\" alt=\"(x, y, 1)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/596\/7e4\/8d6\/5967e48d6aef75065886f392cda1b076.svg\" width=\"62\" height=\"22\"\/> \u0438 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a, \u0432\u0438\u0434\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(x, y, 0)\" alt=\"(x, y, 0)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/abc\/f68\/fbe\/abcf68fbe22cccfce4f3e6dd3d90bcad.svg\" width=\"62\" height=\"22\"\/>. \u0422\u043e\u0447\u043a\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(0, 0, 0)\" alt=\"(0, 0, 0)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/778\/038\/8a9\/7780388a99fa31e6562a4d046c087cb6.svg\" width=\"61\" height=\"22\"\/> \u043d\u0435 \u0437\u0430\u0434\u0430\u0451\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{P}^2\" alt=\"\\mathrm{P}^2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/22f\/4f2\/d3d\/22f4f2d3d6a5509e4abe48644c0dcafe.svg\" width=\"22\" height=\"21\"\/>. \u041d\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{P}^2\" alt=\"\\mathrm{P}^2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/43c\/cff\/3dc\/43ccff3dc8a18f53659ef302aebd6e3b.svg\" width=\"22\" height=\"21\"\/> \u0437\u0430\u0434\u0430\u043d\u044b \u043a\u043b\u0430\u0441\u0441\u044b \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u2014 \u0435\u0441\u043b\u0438 \u0434\u043e\u043c\u043d\u043e\u0436\u0438\u0442\u044c <abbr class=\"habraabbr\" title=\"\u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f\u00a0\u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438\" data-title=\"&lt;p>\u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f&amp;nbsp;\u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438&lt;\/p>&#187; data-abbr=&#187;\u0442\u0440\u043e\u0439\u043a\u0443 \u0447\u0438\u0441\u0435\u043b&#187;>\u0442\u0440\u043e\u0439\u043a\u0443 \u0447\u0438\u0441\u0435\u043b<\/abbr> \u043d\u0430 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c, \u0442\u043e \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0443 \u0436\u0435 \u0442\u043e\u0447\u043a\u0443 \u0432 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{P}^2\" alt=\"\\mathrm{P}^2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bc2\/2a8\/6d1\/bc22a86d1a0db670aab287bcefc3061e.svg\" width=\"22\" height=\"21\"\/>. \u0422\u043e \u0435\u0441\u0442\u044c <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(x, y, z) \\sim (wx, wy, wz), w \\ne 0\" alt=\"(x, y, z) \\sim (wx, wy, wz), w \\ne 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2f7\/e2e\/db1\/2f7e2edb14463416ea87f84f398ac618.svg\" width=\"248\" height=\"22\"\/>. <\/p>\n<p>\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438<img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(x, y, 1)\" alt=\"(x, y, 1)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/be7\/9c8\/28b\/be79c828b54fc2f537c81a60b990e555.svg\" width=\"62\" height=\"22\"\/>\u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"R^2\" alt=\"R^2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/541\/ea4\/e65\/541ea4e65990f919726c3237d1aaf7c7.svg\" width=\"23\" height=\"21\"\/>, \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(x, y, 0)\" alt=\"(x, y, 0)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/445\/fe6\/6f7\/445fe66f726a353d1783234e11405221.svg\" width=\"62\" height=\"22\"\/> \u2014 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u043d\u0430 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438 \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(x, y)\" alt=\"(x, y)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/777\/484\/5bf\/7774845bfae27034fc64df8772db5c94.svg\" width=\"44\" height=\"22\"\/>. \u0422\u0430\u043a\u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u043b\u0438\u043d\u0438\u0438 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(a, b, c) \\sim ax + by + c = 0\" alt=\"(a, b, c) \\sim ax + by + c = 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dc6\/8ea\/dbb\/dc68eadbbd960aa2655743df559fc11c.svg\" width=\"215\" height=\"22\"\/>. \u0412\u043e \u0432\u0441\u0435\u0445 \u0442\u0435\u043e\u0440\u0435\u043c\u0430\u0445 \u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0434\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0442\u043e\u0447\u043a\u0438 \u0438 \u043b\u0438\u043d\u0438\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0442\u0435\u043e\u0440\u0435\u043c\u0443. <\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0442\u0435\u043e\u0440\u0435\u043c \u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 (\u043a\u0440\u0430\u0441\u0438\u0432\u043e, \u043d\u043e \u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f)<\/summary>\n<div class=\"spoiler__content\">\n<h2>\u0422\u0435\u043e\u0440\u0435\u043c\u0430 1<\/h2>\n<p>\u041f\u0440\u044f\u043c\u0430\u044f:<br \/>\u0422\u043e\u0447\u043a\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p = (x, y, z)\" alt=\"p = (x, y, z)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4e8\/cee\/6c0\/4e8cee6c014c6c689022dcde008b54dd.svg\" width=\"98\" height=\"22\"\/> \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u043f\u0440\u044f\u043c\u043e\u0439 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"l = (a, b, c) \\iff p^T l = 0\" alt=\"l = (a, b, c) \\iff p^T l = 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/704\/e01\/335\/704e01335810289e77917f13e56e059c.svg\" width=\"210\" height=\"25\"\/>.<br \/>\u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e: <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p^T l = 0\" alt=\"p^T l = 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/011\/0c7\/218\/0110c72185498247fc7324aa2e1032f0.svg\" width=\"63\" height=\"24\"\/> \u2014 \u0442\u043e\u0447\u043a\u0430, \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0432 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u0439.<\/p>\n<p>\u0414\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f:<br \/>\u041f\u0440\u044f\u043c\u0430\u044f <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"l = (a, b, c)\" alt=\"l = (a, b, c)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/390\/e32\/96f\/390e3296f6ffa164f4ca4632db355552.svg\" width=\"90\" height=\"22\"\/> \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 \u0442\u043e\u0447\u043a\u0443 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p = (x, y, z) \\iff l^T p = 0\" alt=\"p = (x, y, z) \\iff l^T p = 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/939\/940\/031\/939940031f9512596d0442fc7edc3268.svg\" width=\"218\" height=\"25\"\/>.<br \/>\u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e: <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"l^T p = 0\" alt=\"l^T p = 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/95c\/e36\/216\/95ce36216a36254418c9e58f122f1e5b.svg\" width=\"62\" height=\"24\"\/> \u2014 \u0442\u043e\u0447\u043a\u0430, \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0432 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u0439.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435. \u0412\u0441\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432\u0438\u0434\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(x, y, 0)\" alt=\"(x, y, 0)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a92\/ae7\/e82\/a92ae7e82b22be2b3ff6772931e19de5.svg\" width=\"62\" height=\"22\"\/> \u043b\u0435\u0436\u0430\u0442 \u043d\u0430 \u043f\u0440\u044f\u043c\u043e\u0439  <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"l_{\\infty}=(0, 0, 1)\" alt=\"l_{\\infty}=(0, 0, 1)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8a0\/f58\/933\/8a0f5893355d24a76d9a8f37f5a2eaad.svg\" width=\"108\" height=\"22\"\/>. \u0415\u0451 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u044f\u043c\u043e\u0439 \u043d\u0430 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438.<\/p>\n<h2>\u0422\u0435\u043e\u0440\u0435\u043c\u0430 2<\/h2>\n<p>\u041f\u0440\u044f\u043c\u0430\u044f:<br \/>\u0427\u0435\u0440\u0435\u0437 2 \u0442\u043e\u0447\u043a\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p_1, p_2\" alt=\"p_1, p_2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8bd\/c2d\/aaf\/8bdc2daafd9e57599a0d551eadf1a8e3.svg\" width=\"46\" height=\"15\"\/>\u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u044f\u043c\u0430\u044f <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"l=p_1 \\times p_2\" alt=\"l=p_1 \\times p_2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9de\/a24\/802\/9dea248024e69294b172e41a2cdac732.svg\" width=\"92\" height=\"20\"\/><br \/>\u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e: \u043f\u0440\u044f\u043c\u0430\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0435 \u0442\u043e\u0447\u043a\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"l^tp_1 = l^tp_2 = 0\" alt=\"l^tp_1 = l^tp_2 = 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d19\/a93\/bef\/d19a93beffea38a4f9cc82e1ebfbc91d.svg\" width=\"123\" height=\"23\"\/>(\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f).<\/p>\n<p>\u0414\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f:<br \/>2 \u043f\u0440\u044f\u043c\u044b\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"l_1, l_2\" alt=\"l_1, l_2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e86\/cd2\/8df\/e86cd28dfff6d13061571b3adbd75538.svg\" width=\"38\" height=\"20\"\/>\u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0432 \u0442\u043e\u0447\u043a\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p=l_1 \\times l_2\" alt=\"p=l_1 \\times l_2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a92\/2a2\/abf\/a922a2abf908a1991234a05d8c9cbde0.svg\" width=\"89\" height=\"20\"\/><br \/>\u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e: \u0442\u043e\u0447\u043a\u0430 \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u043e\u0431\u043e\u0438\u0445 \u043f\u0440\u044f\u043c\u044b\u0445 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p^tl_1 = p^tl_2 = 0\" alt=\"p^tl_1 = p^tl_2 = 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/119\/416\/ec5\/119416ec56ea7da2c027600511be1457.svg\" width=\"124\" height=\"23\"\/>(\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f).<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435. 2 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u044f\u043c\u043e\u0439 \u043d\u0430 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438. \u0410 2 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u044f\u043c\u044b\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"l_1=(a, b, c_1), l_2 = (a, b, c_2)\" alt=\"l_1=(a, b, c_1), l_2 = (a, b, c_2)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/90f\/f6d\/517\/90ff6d5170015a9cb2d119634f8f09b1.svg\" width=\"224\" height=\"22\"\/>\u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0432 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(b, -a, 0)\" alt=\"(b, -a, 0)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/867\/707\/d56\/867707d56058229028f6428436d9ea30.svg\" width=\"75\" height=\"22\"\/>.<\/p>\n<\/div>\n<\/details>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{P}^2\" alt=\"\\mathrm{P}^2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/206\/ae2\/eb6\/206ae2eb6cd4d88856b853277c7f0a68.svg\" width=\"22\" height=\"21\"\/> \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043b\u0443\u0447\u0435\u0439 (\u0445\u043e\u0442\u044f \u0442\u043e\u0447\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u044b\u0445), \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0432 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"R^3\" alt=\"R^3\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/afb\/b7a\/7b6\/afbb7a7b62c201f9cfed4d6046c88e36.svg\" width=\"23\" height=\"21\"\/> \u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u041b\u0443\u0447\u0438, \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0435 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"z = 1\" alt=\"z = 1\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/88c\/5e3\/bc4\/88c5e3bc4fa96d9501b9cc73798391ce.svg\" width=\"44\" height=\"16\"\/>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c \u0442\u043e\u0447\u043a\u0430\u043c <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{P}^2\" alt=\"\\mathrm{P}^2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/932\/e62\/cde\/932e62cdef79d4fb7b49fb093133f23a.svg\" width=\"22\" height=\"21\"\/>, \u0430 \u043b\u0443\u0447\u0438 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"z = 0\" alt=\"z = 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/102\/f92\/665\/102f92665c4ac8a6999b29c0398bdd98.svg\" width=\"44\" height=\"16\"\/> \u2014 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c.<\/p>\n<p>\u0413\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044f<img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"H\" alt=\"H\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dc0\/8c1\/5d5\/dc08c15d569d963622bfbafab0b6c48e.svg\" width=\"17\" height=\"17\"\/> (\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435) \u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{P}^2 \\to \\mathrm{P}^2\" alt=\"\\mathrm{P}^2 \\to \\mathrm{P}^2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/74c\/428\/2af\/74c4282af2bef7fbfea5c90fd50e4b25.svg\" width=\"74\" height=\"21\"\/> \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u044f\u043c\u044b\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0432 \u043f\u0440\u044f\u043c\u044b\u0435. \u0414\u043b\u044f \u043d\u0430\u0441 \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043d\u0430 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"H_{3 \\times 3}\" alt=\"H_{3 \\times 3}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3d9\/e9b\/c00\/3d9e9bc00acca027290c783acaeb01ce.svg\" width=\"42\" height=\"20\"\/>. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044f <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"wH\" alt=\"wH\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7b5\/80b\/fdf\/7b580bfdf46395504e92735852dbb194.svg\" width=\"31\" height=\"17\"\/> \u0437\u0430\u0434\u0430\u0451\u0442 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u044b\u0445 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0435\u0439 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"w\" alt=\"w\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5b9\/8a6\/507\/5b98a65075cffdb1e60a5887bef12672.svg\" width=\"14\" height=\"12\"\/>.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 <a href=\"https:\/\/habr.com\/ru\/articles\/709378\/\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0438\u043d\u0445\u043e\u043b \u043a\u0430\u043c\u0435\u0440\u044b<\/a>. \u041e\u043d\u0430 \u0437\u0430\u0434\u0430\u0451\u0442 \u0442\u043e, \u043a\u0430\u043a 3D-\u0442\u043e\u0447\u043a\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(x, y, z)\" alt=\"(x, y, z)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/28d\/c5e\/932\/28dc5e9324f2665173a45c968ed6e1c6.svg\" width=\"62\" height=\"22\"\/>\u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u0447\u043a\u0443 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(u, v)\" alt=\"(u, v)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1ed\/6b9\/9c1\/1ed6b99c18a8afbff56afc385d8f6ed5.svg\" width=\"44\" height=\"22\"\/> \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<br \/><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"u = f_x\\frac{x}{z} + c_x, v = f_y\\frac{y}{z} + c_y\" alt=\"u = f_x\\frac{x}{z} + c_x, v = f_y\\frac{y}{z} + c_y\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/533\/1d7\/0ae\/5331d70ae03bdaff7c7622cee1aa0400.svg\" width=\"234\" height=\"38\"\/><\/p>\n<p>\u0412 \u044d\u0442\u0443 \u0436\u0435 \u0442\u043e\u0447\u043a\u0443 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(u, v)\" alt=\"(u, v)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8b5\/7d2\/4ab\/8b57d24ab486724b6b3cfc9307871e8b.svg\" width=\"44\" height=\"22\"\/>\u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043b\u0443\u0447\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"w (x, y, z), w \\ne 0\" alt=\"w (x, y, z), w \\ne 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e1e\/a18\/618\/e1ea186185b1ef2f67b4123e48d11cf6.svg\" width=\"133\" height=\"22\"\/>. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u0430\u043c\u0435\u0440\u044b \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 2D-\u0442\u043e\u0447\u043a\u0443 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043b\u0443\u0447\u0443 \u0432 3D \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. <\/p>\n<p>\u0412 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\" \\mathrm{P}^2\" alt=\" \\mathrm{P}^2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ac6\/17d\/5ba\/ac617d5baeb597ddc44c9b195e830778.svg\" width=\"22\" height=\"21\"\/> \u043c\u044b \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u0447\u043a\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(x, y, 1)\" alt=\"(x, y, 1)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0b3\/efd\/163\/0b3efd163407291500d727ebd3cd1550.svg\" width=\"62\" height=\"22\"\/> \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"z = 1\" alt=\"z = 1\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/52f\/b4b\/963\/52fb4b9630fd035c86d8aeaae30abbf2.svg\" width=\"44\" height=\"16\"\/> \u043b\u0443\u0447 (\u043f\u0440\u044f\u043c\u0443\u044e) <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"w (x, y, 1), w \\ne 0\" alt=\"w (x, y, 1), w \\ne 0\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d5c\/bd1\/d33\/d5cbd1d330bbfe31630c0a20498efdbf.svg\" width=\"134\" height=\"22\"\/>. \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0441 \u043b\u0443\u0447\u0451\u043c \u0432 3D \u0443\u0436\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 &#171;\u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&#187; \u0443\u0436\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0438\u043d\u0445\u043e\u043b \u043a\u0430\u043c\u0435\u0440\u044b, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0441\u0442\u044f\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"H_p = \\begin{pmatrix} f_x &amp; 0 &amp; c_x \\\\ 0 &amp; f_y &amp; c_y \\\\ 0 &amp; 0 &amp; 1 \\end{pmatrix}\" alt=\"H_p = \\begin{pmatrix} f_x &amp; 0 &amp; c_x \\\\ 0 &amp; f_y &amp; c_y \\\\ 0 &amp; 0 &amp; 1 \\end{pmatrix}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/06b\/a31\/e86\/06ba31e86261911c9fa2a3c6ccb8f72b.svg\" width=\"184\" height=\"78\"\/><\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c. \u041f\u0443\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0437\u0430\u0434\u0430\u043d\u0430 \u0442\u043e\u0447\u043a\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(x, y, z)\" alt=\"(x, y, z)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/04e\/0d3\/ee3\/04e0d3ee3d6091ad9d15e6ab2061e49a.svg\" width=\"62\" height=\"22\"\/>. &#171;\u0421\u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u043c&#187; \u0435\u0451 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"H_p\" alt=\"H_p\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b24\/0e9\/4d8\/b240e94d82190b6d314c2cfe870e9b23.svg\" width=\"25\" height=\"22\"\/>. <br \/><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"H_p(x, y, z)^T = (f_xx + c_xz, f_yy + c_yz, z) \\sim (f_x\\frac{x}{z} + c_x, f_y\\frac{y}{z} + c_y, 1)\" alt=\"H_p(x, y, z)^T = (f_xx + c_xz, f_yy + c_yz, z) \\sim (f_x\\frac{x}{z} + c_x, f_y\\frac{y}{z} + c_y, 1)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5a2\/20f\/bcc\/5a220fbccf1106ffd54d8c33d93f1b07.svg\" width=\"545\" height=\"38\"\/>. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u043a\u0430\u043c\u0435\u0440\u044b.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0432 3D. \u041f\u043e\u0432\u043e\u0440\u043e\u0442 \u0432 3D \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"R_{3\\times3}\" alt=\"R_{3\\times3}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9c9\/e84\/673\/9c9e84673aeae7f6b68f914dc40cdc6f.svg\" width=\"41\" height=\"20\"\/>. \u042d\u0442\u0430 \u0436\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0432 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{P}^2\" alt=\"\\mathrm{P}^2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bc4\/2a1\/d7a\/bc42a1d7aa7a153e5b80b275e6581e16.svg\" width=\"22\" height=\"21\"\/>\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435. \u0422\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0436\u0435 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{P}^2\" alt=\"\\mathrm{P}^2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c02\/a00\/31c\/c02a0031c91088634305dcabe5890508.svg\" width=\"22\" height=\"21\"\/>. \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"R^3\" alt=\"R^3\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ef0\/bc3\/ee7\/ef0bc3ee75ba023456ff07696fa3bf0c.svg\" width=\"23\" height=\"21\"\/>, \u0430 \u043b\u0443\u0447\u0438 (\u043f\u0440\u044f\u043c\u044b\u0435).<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a \u0437\u0430\u0434\u0430\u0447\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b<\/h2>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"N\" alt=\"N\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2a5\/a38\/1ab\/2a5a381ab25788d3eb88839497e6eec8.svg\" width=\"17\" height=\"17\"\/> \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441\u043d\u044f\u0442\u044b\u0445 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. \u0411\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u0430\u0434\u0440\u043e\u0432 \u0447\u0442\u043e \u0441\u044c\u0435\u043c\u043a\u0430 \u0432\u0435\u043b\u0430\u0441\u044c \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u041c\u0430\u0442\u0440\u0438\u0446\u044b <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"R_i\" alt=\"R_i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/650\/a5b\/7d2\/650a5b7d23773365232117bb11e149f5.svg\" width=\"21\" height=\"20\"\/> \u0437\u0430\u0434\u0430\u044e\u0442 <abbr class=\"habraabbr\" title=\"\u0442\u043e\u0447\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u043c\u0438\u0440\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0438\u043b\u0438 view \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\" data-title=\"&lt;p>\u0442\u043e\u0447\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u043c\u0438\u0440\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0438\u043b\u0438 view \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435&lt;\/p>&lt;p>&lt;\/p>&#187; data-abbr=&#187;\u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b&#187;>\u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b<\/abbr>. \u041c\u0430\u0442\u0440\u0438\u0446\u044b <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"P_i\" alt=\"P_i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5ba\/8e6\/d89\/5ba8e6d89e64b37f1d4aa6cd76ef2c35.svg\" width=\"19\" height=\"20\"\/> \u0437\u0430\u0434\u0430\u044e\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <abbr class=\"habraabbr\" title=\"\u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0442\u043e \u043e\u043d\u0438 \u0440\u0430\u0437\u043d\u044b\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u0430\u043c\u0435\u0440\u044b, \u0438\u043b\u0438 \u043c\u0435\u043d\u044f\u043b\u0441\u044f \u0437\u0443\u043c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u044a\u0435\u043c\u043a\u0438\" data-title=\"&lt;p>\u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0442\u043e \u043e\u043d\u0438 \u0440\u0430\u0437\u043d\u044b\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u0430\u043c\u0435\u0440\u044b, \u0438\u043b\u0438 \u043c\u0435\u043d\u044f\u043b\u0441\u044f \u0437\u0443\u043c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u044a\u0435\u043c\u043a\u0438&lt;\/p>&#187; data-abbr=&#187;\u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b&#187;>\u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b<\/abbr>. \u042d\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043d\u0430\u043c \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p = (x, y, z) \\in \\mathrm{P}^2\" alt=\"p = (x, y, z) \\in \\mathrm{P}^2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/51b\/6ba\/175\/51b6ba17589f4be0707deb7914351c4b.svg\" width=\"143\" height=\"25\"\/>\u043d\u0430\u0448\u0435\u0439 3D-\u0441\u0446\u0435\u043d\u044b \u0438 \u0434\u0432\u0430 \u043a\u0430\u0434\u0440\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"i\" alt=\"i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1bd\/635\/6dc\/1bd6356dc3cb936204f1be5e6adebf9b.svg\" width=\"7\" height=\"16\"\/> \u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"j\" alt=\"j\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e21\/0ec\/a6b\/e210eca6ba9143ec0a2dd9b538f7751d.svg\" width=\"8\" height=\"19\"\/>. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u0442\u043e\u0447\u043a\u0443, \u043a\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"\\mathrm{P}^2\" alt=\"\\mathrm{P}^2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/695\/dd0\/8fa\/695dd08fa681afd0d9243c6a445ece4f.svg\" width=\"22\" height=\"21\"\/>, \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043b\u0443\u0447\u043e\u043c. \u0422\u043e \u0435\u0441\u0442\u044c \u0442\u0435\u0440\u044f\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0442\u043e\u0447\u043a\u0438 \u0432\u0434\u043e\u043b\u044c \u043b\u0443\u0447\u0430.<\/p>\n<p>\u0412 \u043a\u0430\u0434\u0440\u0430\u0445 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"i\" alt=\"i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1bd\/635\/6dc\/1bd6356dc3cb936204f1be5e6adebf9b.svg\" width=\"7\" height=\"16\"\/> \u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"j\" alt=\"j\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e21\/0ec\/a6b\/e210eca6ba9143ec0a2dd9b538f7751d.svg\" width=\"8\" height=\"19\"\/> \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u0442\u043e\u0447\u043a\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p\" alt=\"p\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/edd\/ffb\/26e\/eddffb26e956d41c3f992bf591b1afb1.svg\" width=\"10\" height=\"15\"\/> \u0431\u0443\u0434\u0435\u0442 \u0432 \u0442\u043e\u0447\u043a\u0430\u0445 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p_i = P_iR_ip\" alt=\"p_i = P_iR_ip\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e85\/8a6\/135\/e858a61358763d844aa6fe69098e81cd.svg\" width=\"93\" height=\"20\"\/> \u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p_j = P_jR_jp\" alt=\"p_j = P_jR_jp\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ed8\/89f\/075\/ed889f075484a0e402466bfe1d3b76a1.svg\" width=\"96\" height=\"22\"\/>. \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u044b, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 (\u043b\u0443\u0447) <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p\" alt=\"p\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0b8\/005\/3a9\/0b80053a9b3ad2d28b4bf8f72e956826.svg\" width=\"10\" height=\"15\"\/> \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f: <br \/><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p_i = P_iR_ip \\implies p=R_i^{-1}P_i^{-1}p_i\" alt=\"p_i = P_iR_ip \\implies p=R_i^{-1}P_i^{-1}p_i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bff\/734\/0cc\/bff7340cc08ede5c040cdd5a9ede1057.svg\" width=\"266\" height=\"26\"\/><br \/>\u0418 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0435:<br \/><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p_j = P_jR_jp \\implies p_j = P_jR_jR_i^{-1}P_i^{-1}p_i\" alt=\"p_j = P_jR_jp \\implies p_j = P_jR_jR_i^{-1}P_i^{-1}p_i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ca4\/b72\/95b\/ca4b7295b12c0b1afde564b7ed406d1d.svg\" width=\"318\" height=\"26\"\/><\/p>\n<p>\u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"H_{ij}=P_jR_jR_i^{-1}P_i^{-1}\" alt=\"H_{ij}=P_jR_jR_i^{-1}P_i^{-1}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/db2\/8c4\/b87\/db28c4b876703a8cc5774ce6a06c69b5.svg\" width=\"165\" height=\"26\"\/>\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p_j=H_{ij}p_i\" alt=\"p_j=H_{ij}p_i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bec\/3f3\/08b\/bec3f308b741ce7b344a4a5d79b4adbb.svg\" width=\"88\" height=\"22\"\/>. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 3D-\u0442\u043e\u0447\u043a\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p\" alt=\"p\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/056\/563\/8fe\/0565638fe3817b8a728929cadda1e12e.svg\" width=\"10\" height=\"15\"\/> \u0432 \u043a\u0430\u0434\u0440\u0430\u0445 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"i\" alt=\"i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1bd\/635\/6dc\/1bd6356dc3cb936204f1be5e6adebf9b.svg\" width=\"7\" height=\"16\"\/> \u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"j\" alt=\"j\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e21\/0ec\/a6b\/e210eca6ba9143ec0a2dd9b538f7751d.svg\" width=\"8\" height=\"19\"\/> \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"H_{ij}\" alt=\"H_{ij}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/74d\/461\/357\/74d461357e3e5ea00d39b6efb173a027.svg\" width=\"28\" height=\"22\"\/>. \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0431\u0440\u0430\u043b\u0438 \u0442\u043e\u0447\u043a\u0443 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p\" alt=\"p\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/443\/3d9\/011\/4433d90110a1a2723da0b13c5ea8490c.svg\" width=\"10\" height=\"15\"\/> \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e, \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u044d\u0442\u0430 \u0441\u0432\u044f\u0437\u044c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 3D-\u0442\u043e\u0447\u0435\u043a \u0441\u0446\u0435\u043d\u044b.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0432 \u043a\u0430\u0434\u0440\u0430\u0445 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"i\" alt=\"i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1bd\/635\/6dc\/1bd6356dc3cb936204f1be5e6adebf9b.svg\" width=\"7\" height=\"16\"\/> \u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"j\" alt=\"j\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e21\/0ec\/a6b\/e210eca6ba9143ec0a2dd9b538f7751d.svg\" width=\"8\" height=\"19\"\/> \u043d\u0430\u0439\u0442\u0438 \u043d\u0430\u0431\u043e\u0440 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439 (\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u044b 2D-\u0442\u043e\u0447\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u0434\u043d\u043e\u0439 3D-\u0442\u043e\u0447\u043a\u0435), \u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0432\u0438\u0434\u0430<br \/><img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p_{jk}=H_{ij}p_{ik}\" alt=\"p_{jk}=H_{ij}p_{ik}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b2e\/466\/1f7\/b2e4661f7b40aeb96639aec4a6da6d44.svg\" width=\"103\" height=\"22\"\/>, \u0433\u0434\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"H_{ij}\" alt=\"H_{ij}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/978\/da1\/2ce\/978da12ce6d8d42523ed9d6eb0ac07fb.svg\" width=\"28\" height=\"22\"\/>\u2014 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0438\u0437 9 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b (\u0441 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044f). \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 <abbr class=\"habraabbr\" title=\"Direct Linear Transform\" data-title=\"&lt;p>Direct Linear Transform&lt;\/p>&#187; data-abbr=&#187;DLT&#187;>DLT<\/abbr>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0442\u043e\u0447\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"i\" alt=\"i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/08d\/a03\/a5a\/08da03a5ad819e01028d1778029d32dd.svg\" width=\"7\" height=\"16\"\/> \u0432 \u0442\u043e\u0447\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"j\" alt=\"j\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/efc\/5ad\/d8c\/efc5add8ccd5477ef4f0ec37de9e7256.svg\" width=\"8\" height=\"19\"\/>.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0434\u043b\u044f \u043f\u0430\u0440\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044f, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f\u0449\u0430\u044f \u0442\u043e\u0447\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0442\u043e\u0447\u043a\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0451 \u043a\u043e \u0432\u0441\u0435\u043c\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0451\u043c \u043e\u0434\u043d\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0433\u043e.<\/p>\n<h2>\u041e\u0431\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c<\/h2>\n<p>\u0414\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438. \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c60\/c81\/90c\/c60c8190c841d20c7f357a9ddd41d0ad.png\" alt=\"\u0420\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0441 \u044d\u0442\u0438\u043c\u0438 \u0442\u0440\u0435\u043c\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u041f\u0435\u0440\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0432\u0430.\" title=\"\u0420\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0441 \u044d\u0442\u0438\u043c\u0438 \u0442\u0440\u0435\u043c\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u041f\u0435\u0440\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0432\u0430.\" width=\"939\" height=\"232\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c60\/c81\/90c\/c60c8190c841d20c7f357a9ddd41d0ad.png\"\/><\/p>\n<div><figcaption>\u0420\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0441 \u044d\u0442\u0438\u043c\u0438 \u0442\u0440\u0435\u043c\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u041f\u0435\u0440\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0432\u0430.<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u043e \u0432 \u0441\u0435\u0431\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e identity \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"H_{11} = I_{3 \\times 3}\" alt=\"H_{11} = I_{3 \\times 3}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/458\/86d\/1f4\/45886d1f495ef9477c70ab980a38a0d0.svg\" width=\"92\" height=\"20\"\/>. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044e <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"H_{i1}\" alt=\"H_{i1}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/55a\/495\/2ff\/55a4952ffb6f706dd91e4d5c959e1f47.svg\" width=\"29\" height=\"20\"\/>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"i\" alt=\"i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b10\/fd9\/0b9\/b10fd90b99b762245f8c08ad4864485e.svg\" width=\"7\" height=\"16\"\/> \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u0412 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0448\u0430 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0439, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0432 \u043e\u0434\u043d\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import cv2 import numpy as np from typing import Tuple, List, Optional  # for type hints RgbImg = np.array                   # shape = (h, w, 3) Point2dList = np.array              # shape = (N, 2) DescriptorsList = np.array          # shape = (N, DESCRIPTOR_SIZE) HMat = np.array                     # shape = (3, 3) BBox = Tuple[int, int, int, int]    # BoundingBox(x, y, right, top)   def build_panoramic_image(imgs: List[RgbImg]) -> RgbImg:     used_imgs: List[Tuple[RgbImg, HMat]] = _find_all_homography(imgs)     result_bbox: BBox = _get_result_panorama_bbox(used_imgs)     return _join_panoramic_image(used_imgs, result_bbox)<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>_find_all_homography<\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"H_{i1}\" alt=\"H_{i1}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f18\/a51\/901\/f18a51901d3a89890cbbfbb1967c57b9.svg\" width=\"29\" height=\"20\"\/>. \u0421\u043f\u0438\u0441\u043e\u043a<code>used_imgs<\/code>\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 (\u043f\u0435\u0440\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435).<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>_get_result_panorama_bbox<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u043f\u043b\u043e\u0441\u043a\u0443\u044e \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u0443.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>_join_panoramic_image<\/code> \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043e\u0434\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u043c\u0430\u0442\u0440\u0438\u0446 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438.<\/p>\n<\/div>\n<\/details>\n<h2>\u041f\u043e\u0438\u0441\u043a 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439<\/h2>\n<p>\u0414\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0438\u0437 \u043f\u0430\u0440 2D-\u0442\u043e\u0447\u0435\u043a \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0442\u0430\u043a\u0438\u0445 \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0430\u0440\u0430, \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e 3D-\u0442\u043e\u0447\u043a\u0435 \u0441\u0446\u0435\u043d\u044b, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u043e\u0439 \u043d\u0430 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f\u0445.<\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 SIFT. \u0414\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u044b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043d\u0430\u0431\u043e\u0440 \u0438\u0437 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0438 \u0438\u0445 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u0432. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 SIFT \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u0437 128 \u0447\u0438\u0441\u0435\u043b \u0442\u0438\u043f\u0430 float.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u044b \u043d\u0430\u0439\u0434\u0435\u043d\u044b \u043d\u0430 \u043e\u0431\u043e\u0438\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445, \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0438\u0449\u0443\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u044b \u0434\u0432\u0443\u0445 \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u0431\u043b\u0438\u0437\u043a\u0438 (\u043f\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e), \u0442\u043e \u043e\u043d\u0438, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 3D-\u0442\u043e\u0447\u043a\u0435 \u0441\u0446\u0435\u043d\u044b.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0441\u043a\u0430\u0442\u044c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 (\u043f\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e) \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0438\u0437 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u042d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Nearest Neighbour (NN). \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u2014 First-to-Second NN Ratio Check (SNN). \u041e\u043d \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043b\u0443\u0447\u0448\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u0412 \u043d\u0451\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0449\u0443\u0442\u0441\u044f \u0434\u0432\u0430 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0438\u0437 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0434\u043e \u043d\u0438\u0445. \u0415\u0441\u043b\u0438 \u043e\u043d\u043e \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u0435\u0434\u0438\u043d\u0438\u0446\u0435 (\u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 \u0442\u0430\u043a\u043e\u043c \u0436\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u0442 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043a \u043f\u0435\u0440\u0432\u044b\u0439), \u0442\u043e \u044d\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043b\u043e\u0445\u0438\u043c. \u0415\u0441\u043b\u0438 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"0,8\" alt=\"0,8\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/001\/c09\/af0\/001c09af0783d1c48750ec3557a2d368.svg\" width=\"28\" height=\"19\"\/>, \u0442\u043e \u044d\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f72\/9da\/ea4\/f729daea44d625a6763683eba9c6248f.png\" alt=\"\u0427\u0430\u0441\u0442\u044c 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SIFT \u0438 First-to-Second NN Ratio Check.\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439.\" title=\"\u0427\u0430\u0441\u0442\u044c 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SIFT \u0438 First-to-Second NN Ratio Check.\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439.\" width=\"939\" height=\"370\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f72\/9da\/ea4\/f729daea44d625a6763683eba9c6248f.png\"\/><\/p>\n<div><figcaption>\u0427\u0430\u0441\u0442\u044c 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SIFT \u0438 First-to-Second NN Ratio Check.<br \/>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439.<\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">def _detect_sift_points_and_descriptors(img: RgbImg) -> \\         Tuple[Point2dList, DescriptorsList]:     img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)     sift = cv2.SIFT_create()     keypoints, descriptors = sift.detectAndCompute(img_gray, None)     return np.array([kp.pt for kp in keypoints]), descriptors   def _snn_matching(query_descriptors: DescriptorsList,                   train_descriptors: DescriptorsList) -> List[cv2.DMatch]:     matcher = cv2.BFMatcher_create(cv2.NORM_L2, False)     matches_all = matcher.knnMatch(query_descriptors, train_descriptors, 2)     return [m1 for m1, m2 in matches_all if m1.distance &lt; 0.8 * m2.distance]   def _find_matches(points1: Point2dList, descriptors1: DescriptorsList,                   points2: Point2dList, descriptors2: DescriptorsList) -> \\         Tuple[Point2dList, Point2dList]:     matches = _snn_matching(descriptors1, descriptors2)     return np.array([points1[m.queryIdx] for m in matches]), \\            np.array([points2[m.trainIdx] for m in matches])<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>_detect_sift_points_and_descriptors<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 2D-\u0442\u043e\u0447\u043a\u0438 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u043c \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u044b.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>_snn_matching<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439 \u043f\u043e \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430\u043c First-to-Second NN Ratio Check (SNN).<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>_find_matches<\/code> \u0438\u0449\u0435\u0442 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0440\u0435\u0434\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 2D-\u0442\u043e\u0447\u0435\u043a \u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u0432 \u0434\u0432\u0443\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439.<\/p>\n<\/div>\n<\/details>\n<h2>\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u0446 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438<\/h2>\n<p>\u041f\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u043c 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f\u043c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c Direct Linear Transform (DLT). <\/p>\n<p>\u041d\u0435 \u0432\u0441\u0435 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0435\u0440\u043d\u044b\u043c\u0438. \u0427\u0430\u0441\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 (\u043e\u0431\u044b\u0447\u043d\u043e \u0431\u043e\u0301\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c) \u2014 \u0432\u044b\u0431\u0440\u043e\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 &#171;\u0442\u044f\u043d\u0443\u0442\u044c&#187; \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443, \u0435\u0441\u043b\u0438 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u043e \u0432\u0441\u0435\u043c 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f\u043c. \u0414\u043b\u044f \u043e\u0442\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0431\u0440\u043e\u0441\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c <abbr class=\"habraabbr\" title=\"Random Sample Consensus\" data-title=\"&lt;p>Random Sample Consensus&lt;\/p>&#187; data-abbr=&#187;RANSAC&#187;>RANSAC<\/abbr>. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 RANSAC, \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 OpenCV. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1c5\/24f\/ae2\/1c524fae20dbf6083a5232bc86d7a89e.png\" alt=\"2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u044b\u043b\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438.RANSAC \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0441 \u043e\u0442\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439.\" title=\"2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u044b\u043b\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438.RANSAC \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0441 \u043e\u0442\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439.\" width=\"939\" height=\"370\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1c5\/24f\/ae2\/1c524fae20dbf6083a5232bc86d7a89e.png\"\/><\/p>\n<div><figcaption>2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u044b\u043b\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438.<br \/>RANSAC \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0441 \u043e\u0442\u0441\u0435\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439.<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043d\u0430\u0439\u0434\u0451\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f 2 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f 1. \u0415\u0441\u043b\u0438 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0442\u043e \u0432\u0435\u0440\u043d\u0451\u043c <code>None<\/code> \u0438 \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435. \u0412 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u0432\u0441\u0435\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043f\u0435\u0440\u0432\u044b\u043c. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u0438 \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b \u043d\u0430\u0448\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/815\/d4b\/300\/815d4b300559ef96faf55f433dee96d9.png\" alt=\"\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 2 (\u0441\u0432\u0435\u0442\u043b\u0435\u0435) \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0432\u0435\u0440\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f 1 (\u0442\u0435\u043c\u043d\u0435\u0435) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0443 \u0447\u0430\u0441\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f 2, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c 1.\" title=\"\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 2 (\u0441\u0432\u0435\u0442\u043b\u0435\u0435) \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0432\u0435\u0440\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f 1 (\u0442\u0435\u043c\u043d\u0435\u0435) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0443 \u0447\u0430\u0441\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f 2, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c 1.\" width=\"939\" height=\"704\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/815\/d4b\/300\/815d4b300559ef96faf55f433dee96d9.png\"\/><\/p>\n<div><figcaption>\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 2 (\u0441\u0432\u0435\u0442\u043b\u0435\u0435) \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0432\u0435\u0440\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f 1 (\u0442\u0435\u043c\u043d\u0435\u0435) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0443 \u0447\u0430\u0441\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f 2, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442\u0441\u044f \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c 1.<\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">def _find_homography(points1: Point2dList, points2: Point2dList) -> \\         Optional[HMat]:     _MIN_MATCHES, _MIN_INLIERS = 100, 30     if len(points1) &lt; _MIN_MATCHES:         return None     hmat, inliers_mask = cv2.findHomography(points2, points1, cv2.RANSAC)     return hmat if np.sum(inliers_mask) >= _MIN_INLIERS else None   def _find_all_homography(imgs: List[RgbImg]) -> List[Tuple[RgbImg, HMat]]:     first_img = imgs[0]     result = [(first_img, np.eye(3))]     points1, descriptors1 = _detect_sift_points_and_descriptors(first_img)     for img in imgs[1:]:         points, descriptors = _detect_sift_points_and_descriptors(img)         matches = _find_matches(points1, descriptors1, points, descriptors)         hmat = _find_homography(matches[0], matches[1])         if hmat is not None:             result.append((img, hmat))     return result<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>_find_homography<\/code> \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0442\u043e\u0447\u043a\u0438<code>points2<\/code> \u0432 \u0442\u043e\u0447\u043a\u0438<code>points1<\/code>. \u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044e, \u0435\u0441\u043b\u0438 \u0442\u043e\u0447\u0435\u043a \u043c\u0435\u043d\u044c\u0448\u0435 100. \u0418 \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0442\u043e \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0435\u0441\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a-\u0438\u043d\u043b\u0430\u0435\u0440\u043e\u0432 \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 30.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f<code>_find_all_homography<\/code>\u043d\u0430\u0445\u043e\u0434\u0438\u0442 2D \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0438 \u0438\u0445 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0438\u0449\u0435\u0442 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u043b\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"1\" alt=\"1\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/603\/5cf\/077\/6035cf07783afd4ca0b359b459156cf3.svg\" width=\"10\" height=\"16\"\/>\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"i\" alt=\"i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/def\/1ba\/4e7\/def1ba4e7f0c1a1f665c5f0eba8512a1.svg\" width=\"7\" height=\"16\"\/>\u0438 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0439 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"H_{i1}\" alt=\"H_{i1}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d0c\/213\/c72\/d0c213c72df816ed664df5814957e069.svg\" width=\"29\" height=\"20\"\/>.<\/p>\n<\/div>\n<\/details>\n<h2>\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u043d\u0438\u0446 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043e\u0434\u043d\u043e, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u043d\u0430\u0431\u043e\u0440 \u043c\u0430\u0442\u0440\u0438\u0446 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f\u0442 \u0432\u0441\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043e\u0434\u043d\u0443 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0439\u0434\u0451\u043c \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0432\u0441\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u044d\u0442\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u0430 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u0432\u0441\u0435 \u043b\u0438\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0432 \u043b\u0438\u043d\u0438\u0438, \u0442\u043e \u0432 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u0447\u0435\u0442\u044b\u0440\u0451\u0445\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044e \u043a\u043e \u0432\u0441\u0435\u043c \u0443\u0433\u043b\u0430\u043c \u0432\u0441\u0435\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0438\u0445 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0b9\/a7b\/55e\/0b9a7b55e22f11a6174779d316190f3f.png\" alt=\"\u0427\u0435\u0442\u044b\u0440\u0451\u0445\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0438\u0445 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.\" title=\"\u0427\u0435\u0442\u044b\u0440\u0451\u0445\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0438\u0445 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.\" width=\"939\" height=\"434\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0b9\/a7b\/55e\/0b9a7b55e22f11a6174779d316190f3f.png\"\/><\/p>\n<div><figcaption>\u0427\u0435\u0442\u044b\u0440\u0451\u0445\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0438\u0445 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u043e \u0432\u0441\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u0440\u043e\u043c\u0435 \u0442\u0435\u0445, \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u043a\u0430\u044f \u0442\u043e \u0438\u0437 \u0442\u043e\u0447\u0435\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u044c. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438, \u0435\u0441\u043b\u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u0442\u043e \u0438\u0437 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 (\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b) \u0443\u0433\u043b\u043e\u0432\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0440\u0435\u0432\u044b\u0441\u0438\u0442 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"180^{\\circ}\" alt=\"180^{\\circ}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/660\/b1e\/b7b\/660b1eb7b4d575dab15f64dcfa1d69f5.svg\" width=\"38\" height=\"18\"\/>. \u041f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439 \u0432 \u043d\u0430\u0448\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435.<\/p>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u0430 \u0432\u0430\u0436\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0434\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438 \u043c\u044b \u043d\u0435 \u0434\u043e\u0448\u043b\u0438, \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0441\u043a\u043e\u043b\u044c \u0443\u0433\u043e\u0434\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c \u0435\u0433\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0443\u0441\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0434\u0438\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">def _get_transformed_img_bbox(img: RgbImg, hmat: HMat) -> BBox:     h, w = img.shape[:2]     corners = np.float32([[0, 0], [0, h], [w, h], [w, 0]]).reshape(-1, 1, 2)     corners = cv2.perspectiveTransform(corners, hmat).reshape(-1, 2)     return np.min(corners[:, 0]), np.min(corners[:, 1]), \\            np.max(corners[:, 0]), np.max(corners[:, 1])   def _max_panoramic_image_bbox(first_image: RgbImg) -> BBox:     _MAX_SIZE_DIAMETERS = 2.0     h, w = first_image.shape[:2]     sz = int(_MAX_SIZE_DIAMETERS * np.linalg.norm((w, h)))     return -sz, -sz, w + sz, h + sz   def _get_result_panorama_bbox(used_imgs: List[Tuple[RgbImg, HMat]]) -> BBox:     x, y, r, t = 0.0, 0.0, 0.0, 0.0     for img, hmat in used_imgs:         i_x, i_y, i_r, i_t = _get_transformed_img_bbox(img, hmat)         x, y, r, t = min(x, i_x), min(y, i_y), max(r, i_r), max(t, i_t)     x, y, r, t = int(x), int(y), int(r), int(t)      min_x, min_y, max_r, max_t = _max_panoramic_image_bbox(used_imgs[0][0])     return max(x, min_x), max(y, min_y), min(r, max_r), min(t, max_t)<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>_get_transformed_img_bbox<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0442\u044b\u0440\u0451\u0445\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u0445, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438. \u0418 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0447\u0435\u0442\u044b\u0440\u0451\u0445\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>perspectiveTransform<\/code> \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044e <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"H_{3 \\times 3}\" alt=\"H_{3 \\times 3}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9e4\/dd9\/d75\/9e4dd9d754a312cf109614d731c39f16.svg\" width=\"42\" height=\"20\"\/>\u043a \u0442\u043e\u0447\u043a\u0430\u043c <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(x, y) \\sim (x, y, 1) \\in \\mathrm{P}^2\" alt=\"(x, y) \\sim (x, y, 1) \\in \\mathrm{P}^2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7dd\/800\/f9d\/7dd800f9d813d8895fd8a10af9dcb967.svg\" width=\"178\" height=\"25\"\/> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u0447\u043a\u0438<img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(u, v) \\sim (\\frac{x'}{z'}, \\frac{y'}{z'}, 1) \\in \\mathrm{P}^2\" alt=\"(u, v) \\sim (\\frac{x'}{z'}, \\frac{y'}{z'}, 1) \\in \\mathrm{P}^2\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ec7\/431\/3e7\/ec74313e7bb760341d8d721eae0fdd52.svg\" width=\"203\" height=\"44\"\/>, \u0433\u0434\u0435 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(x', y', z') = H(x, y, 1)^T\" alt=\"(x', y', z') = H(x, y, 1)^T\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/147\/d82\/ab9\/147d82ab9b778a20c0ea51936c5ebc37.svg\" width=\"196\" height=\"25\"\/>.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>_max_panoramic_image_bbox<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0434\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0439 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043b\u044e\u0441 \u0434\u0432\u0430 \u0434\u0438\u0430\u043c\u0435\u0442\u0440\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>_get_result_panorama_bbox<\/code> \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438 \u0432\u0441\u0435\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 \u0441 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u043c, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b.<\/p>\n<\/div>\n<\/details>\n<h2>\u0421\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0435\u043b\u043e \u0437\u0430 \u043c\u0430\u043b\u044b\u043c \u2014 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043e\u0434\u043d\u043e. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044e \u043a\u043e \u0432\u0441\u0435\u043c\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>warpPerspective<\/code> \u0438\u0437 OpenCV. \u041e\u043d\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u043b\u044f \u0443\u0433\u043b\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043d\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438 \u0441 \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u0435\u0439.<\/p>\n<p>\u0412 \u0441\u0430\u043c\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043a\u043e \u0432\u0441\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438. \u0418 \u043f\u043e\u0442\u043e\u043c \u0443\u0441\u0440\u0435\u0434\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0446\u0432\u0435\u0442\u0430. \u042d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u0430\u0451\u0442 \u043d\u0435 \u043b\u0443\u0447\u0448\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u043e\u043d \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/627\/199\/ea4\/627199ea409edc609ba365f7a09103fd.png\" alt=\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0433\u043e \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.\" title=\"\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0433\u043e \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.\" width=\"939\" height=\"434\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/627\/199\/ea4\/627199ea409edc609ba365f7a09103fd.png\"\/><\/p>\n<div><figcaption>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0433\u043e \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.<\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">def _join_panoramic_image(used_imgs: List[Tuple[RgbImg, HMat]],                           result_bbox: BBox) -> RgbImg:     offset_hmat = np.array([[1, 0, -result_bbox[0]],                             [0, 1, -result_bbox[1]],                             [0, 0, 1]])      result_w = result_bbox[2] - result_bbox[0]     result_h = result_bbox[3] - result_bbox[1]      sum_rgb = np.zeros((result_h, result_w, 3))     sum_mask = np.zeros((result_h, result_w))     for img, hmat in used_imgs:         warped_img = cv2.warpPerspective(             img, offset_hmat @ hmat, (result_w, result_h))         mask = np.sum(warped_img, axis=2) != 0         mask = cv2.erode(mask.astype(sum_mask.dtype), np.ones((3, 3)))         sum_rgb[mask != 0] += warped_img[mask != 0]         sum_mask += mask      sum_rgb[sum_mask != 0] \/= sum_mask[sum_mask != 0][:, None]     return sum_rgb.astype(np.uint8)<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>_join_panoramic_image<\/code> \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043e\u0434\u043d\u043e, \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c <code>result_bbox<\/code>.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435. \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"(0, 0)\" alt=\"(0, 0)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/99d\/a3e\/f29\/99da3ef29af490fe17255d7de606d5e5.svg\" width=\"43\" height=\"22\"\/> \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0435 <code>(-result_bbox[0], -result_bbox[1])<\/code> \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044c \u0432\u0441\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044e <code>offset_hmat<\/code> \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0435\u0451 \u043f\u043e\u0441\u043b\u0435 <code>hmat<\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 <code>offset_hmat @ hmat<\/code> \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0439 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>cv2.erode<\/code> \u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438\u0437 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430. \u042d\u0442\u043e \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435 \u043f\u043e\u0441\u043b\u0435 <code>cv2.warpPerspective<\/code>.<\/p>\n<\/div>\n<\/details>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0433\u043e \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043c\u044b \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445\u0441\u044f \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u043c \u0437\u0440\u0435\u043d\u0438\u0438.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435. \u041d\u043e \u043e\u043d \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u0435\u043d \u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439, \u043c\u0430\u0442\u0440\u0438\u0446\u0430\u043c\u0438 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0438 \u0442.\u0434.<\/p>\n<h2>\u0427\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445, \u0447\u0435\u0433\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 \u043d\u0435\u0442?<\/h2>\n<p>\u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0435\u0449\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0430\u0446\u0438\u044f \u0434\u0438\u0441\u0442\u043e\u0440\u0441\u0438\u0438 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445, \u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u0444\u0430 \u0438\u0437 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439) \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 Multiband blending).<\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043e\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0445 \u2014 \u0432 \u043d\u0438\u0445 \u043f\u043e\u0438\u0441\u043a \u043c\u0430\u0442\u0440\u0438\u0446 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u044d\u0442\u0430\u043f\u043e\u0432. \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u0446 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"R_i\" alt=\"R_i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d86\/c68\/8cb\/d86c688cb37c31c4a33ef3a1c6bfdb34.svg\" width=\"21\" height=\"20\"\/> \u0438 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"P_i\" alt=\"P_i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/73c\/eaa\/6a5\/73ceaa6a5d8385e46381618e84b8ef90.svg\" width=\"19\" height=\"20\"\/> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0447\u0430\u0441\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u0430\u043c\u0435\u0440 \u0438\u043b\u0438, \u0434\u0430\u0436\u0435, \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c\u0438). \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u0443, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043b\u043e\u0441\u043a\u0443\u044e. \u0415\u0441\u043b\u0438 \u0434\u043b\u044f \u043a\u0430\u043c\u0435\u0440\u044b \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"P_i, R_i\" alt=\"P_i, R_i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/921\/15d\/4ab\/92115d4abf996bcd79d38747efb7ac58.svg\" width=\"49\" height=\"20\"\/>, \u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0435\u0439 \u043b\u0443\u0447. \u0418 \u0432\u0441\u0451 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043d\u0443\u0442\u0440\u0438 \u043d\u0430 \u0446\u0438\u043b\u0438\u043d\u0434\u0440, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0446\u0438\u043b\u0438\u043d\u0434\u0440\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u0443, \u0441\u0444\u0435\u0440\u0443, \u0434\u043b\u044f \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b, \u0438 \u0442.\u0434. \u0414\u0430\u0436\u0435 \u0434\u043b\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0442\u043e\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0438 \u043f\u043b\u044e\u0441\u044b. \u041c\u043e\u0436\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u043e\u043a\u0440\u0443\u0433 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0435\u043d\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0438 \u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0433\u043e. \u0414\u0430 \u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u0447\u043d\u0435\u0435, \u043f\u0440\u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0438\u0445 \u0438\u0437 <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"P_i, R_i\" alt=\"P_i, R_i\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1e1\/73e\/9bf\/1e173e9bf040f733d67e3040c8a89a05.svg\" width=\"49\" height=\"20\"\/> \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c \u0432\u0438\u0434\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043a\u0430\u043c\u0435\u0440\u044b, \u043a\u0430\u0436\u0434\u0430\u044f \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430. \u042d\u0442\u043e 3 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u044b \u0432\u043c\u0435\u0441\u0442\u043e 8 \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2d7\/8e2\/80e\/2d78e280ed3bd1f551136ade5bab775e.png\" alt=\"\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b Hugin \u0434\u043b\u044f \u0441\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439.\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439. \u0421\u0435\u0439\u0447\u0430\u0441 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u0430\u044f (\u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f) \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f.\" title=\"\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b Hugin \u0434\u043b\u044f \u0441\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439.\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439. \u0421\u0435\u0439\u0447\u0430\u0441 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u0430\u044f (\u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f) \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f.\" width=\"1915\" height=\"1031\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2d7\/8e2\/80e\/2d78e280ed3bd1f551136ade5bab775e.png\"\/><\/p>\n<div><figcaption>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b Hugin \u0434\u043b\u044f \u0441\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439.<br \/>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439. \u0421\u0435\u0439\u0447\u0430\u0441 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u0430\u044f (\u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f) \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f.<\/figcaption><\/div>\n<\/figure>\n<h2>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b<\/h2>\n<ol>\n<li>\n<p>Multiple View Geometry in Computer Vision. Richard Hartley and Andrew Zisserman\u00a0\u2014 \u043e\u0434\u043d\u0430 \u0438\u0437\u00a0\u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043d\u0438\u0433 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0433\u043e \u0437\u0440\u0435\u043d\u0438\u044f. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u044e \u0442\u0435\u043e\u0440\u0438\u044e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0443\u044e\u0441\u044f \u0432\u00a0\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/SergeyKrivohatskiy\/planar_panoramic_image\" rel=\"noopener noreferrer nofollow\"><u>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b<\/u><\/a>\u00a0\u2014 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u00a0\u0441\u0442\u0430\u0442\u044c\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/709378\/\" rel=\"noopener noreferrer nofollow\"><u>\u041c\u043e\u0434\u0435\u043b\u044c \u043a\u0430\u043c\u0435\u0440\u044b<\/u><\/a>\u00a0\u2014 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043e\u00a0\u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0438\u043d\u0445\u043e\u043b \u043a\u0430\u043c\u0435\u0440\u044b;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/hugin.sourceforge.io\/\" rel=\"noopener noreferrer nofollow\"><u>Hugin<\/u><\/a>\u00a0\u2014 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f\u00a0\u0441\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441\u00a0\u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.microsoft.com\/en-us\/research\/project\/image-composite-editor\/\" rel=\"noopener noreferrer nofollow\"><u>Image Composite Editor<\/u><\/a>\u00a0\u2014 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f\u00a0\u0441\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043e\u0442\u00a0Microsoft.<\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/708986\/\"> https:\/\/habr.com\/ru\/articles\/708986\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u0448\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0435 (\u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435) \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (planar\/perspective panoramic image). \u0421\u0442\u0430\u0442\u044c\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u0434 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435<code>Python<\/code>\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<code>OpenCV<\/code>.<\/p>\n<figure class=\"bordered full-width\">\n<div><figcaption>\u041f\u043b\u043e\u0441\u043a\u043e\u0435 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 + \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043f\u043e \u043a\u0440\u0430\u044f\u043c<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043d\u044f\u0442\u044b\u0435 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0437\u0440\u0430\u0447\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u0430, \u043d\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043d\u0435 \u0441\u0442\u0440\u0430\u0448\u043d\u044b, \u043d\u043e \u043e\u043d\u0438 \u0434\u0430\u0434\u0443\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p>\u041f\u043b\u043e\u0441\u043a\u0430\u044f \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438, \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0434\u0438\u0430\u043c\u0435\u0442\u0440\u0443 (\u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439, \u0446\u0438\u043b\u0438\u043d\u0434\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f\u0445). \u041d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043b\u043e\u0441\u043a\u0430\u044f \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u0430 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u044f\u043c\u044b\u0435 \u043b\u0438\u043d\u0438\u0438 \u043f\u0440\u044f\u043c\u044b\u043c\u0438 \u2014 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u0430\u043a\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043a\u0430\u043a\u043e\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0440\u0438 \u0441\u044a\u0435\u043c\u043a\u0435 \u0441 \u0442\u043e\u0439 \u0436\u0435 \u0442\u043e\u0447\u043a\u0438 \u043a\u0430\u043c\u0435\u0440\u043e\u0439 \u0441 \u0431\u043e\u0301\u043b\u044c\u0448\u0438\u043c\u0438 \u0443\u0433\u043b\u0430\u043c\u0438 \u043e\u0431\u0437\u043e\u0440\u0430 (\u043c\u0435\u043d\u044c\u0448\u0438\u043c \u0444\u043e\u043a\u0443\u0441\u043d\u044b\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c).<\/p>\n<figure class=\"bordered full-width\">\n<div><figcaption>\u041f\u0430\u043d\u043e\u0440\u0430\u043c\u0430 \u0432 \u0441\u0444\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0439 (\u0441\u043b\u0435\u0432\u0430) \u0438 \u043f\u043b\u043e\u0441\u043a\u043e\u0439 (\u0441\u043f\u0440\u0430\u0432\u0430) \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f\u0445<\/figcaption><\/div>\n<\/figure>\n<h2>\u0422\u0435\u043e\u0440\u0438\u044f<\/h2>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0432\u0435\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c. \u041f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a, \u0432\u0438\u0434\u0430  \u0438 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a, \u0432\u0438\u0434\u0430 . \u0422\u043e\u0447\u043a\u0430  \u043d\u0435 \u0437\u0430\u0434\u0430\u0451\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 . \u041d\u0430  \u0437\u0430\u0434\u0430\u043d\u044b \u043a\u043b\u0430\u0441\u0441\u044b \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 \u2014 \u0435\u0441\u043b\u0438 \u0434\u043e\u043c\u043d\u043e\u0436\u0438\u0442\u044c <abbr class=\"habraabbr\" title=\"\u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f\u00a0\u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438\" data-title=\"&lt;p>\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438&#187; data-title=&lt;p>\u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f&amp;nbsp;\u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438&lt;\/p>&#187; data-abbr=&#187;\u0442\u0440\u043e\u0439\u043a\u0443 \u0447\u0438\u0441\u0435\u043b&#187;>\u0442\u0440\u043e\u0439\u043a\u0443 \u0447\u0438\u0441\u0435\u043b<\/abbr> \u043d\u0430 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c, \u0442\u043e \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0443 \u0436\u0435 \u0442\u043e\u0447\u043a\u0443 \u0432 . \u0422\u043e \u0435\u0441\u0442\u044c . <\/p>\n<p>\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438\u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 , \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438  \u2014 \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u043d\u0430 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438 \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 . \u0422\u0430\u043a\u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u043b\u0438\u043d\u0438\u0438 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 . \u0412\u043e \u0432\u0441\u0435\u0445 \u0442\u0435\u043e\u0440\u0435\u043c\u0430\u0445 \u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0434\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0442\u043e\u0447\u043a\u0438 \u0438 \u043b\u0438\u043d\u0438\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0442\u0435\u043e\u0440\u0435\u043c\u0443. <\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0442\u0435\u043e\u0440\u0435\u043c \u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 (\u043a\u0440\u0430\u0441\u0438\u0432\u043e, \u043d\u043e \u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f)<\/summary>\n<div class=\"spoiler__content\">\n<h2>\u0422\u0435\u043e\u0440\u0435\u043c\u0430 1<\/h2>\n<p>\u041f\u0440\u044f\u043c\u0430\u044f:<br \/>\u0422\u043e\u0447\u043a\u0430  \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u043f\u0440\u044f\u043c\u043e\u0439 .<br \/>\u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e:  \u2014 \u0442\u043e\u0447\u043a\u0430, \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0432 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u0439.<\/p>\n<p>\u0414\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f:<br \/>\u041f\u0440\u044f\u043c\u0430\u044f  \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 \u0442\u043e\u0447\u043a\u0443 .<br \/>\u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e:  \u2014 \u0442\u043e\u0447\u043a\u0430, \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0432 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u0439.<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435. \u0412\u0441\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432\u0438\u0434\u0430  \u043b\u0435\u0436\u0430\u0442 \u043d\u0430 \u043f\u0440\u044f\u043c\u043e\u0439  . \u0415\u0451 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u044f\u043c\u043e\u0439 \u043d\u0430 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438.<\/p>\n<h2>\u0422\u0435\u043e\u0440\u0435\u043c\u0430 2<\/h2>\n<p>\u041f\u0440\u044f\u043c\u0430\u044f:<br \/>\u0427\u0435\u0440\u0435\u0437 2 \u0442\u043e\u0447\u043a\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u044f\u043c\u0430\u044f <br \/>\u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e: \u043f\u0440\u044f\u043c\u0430\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0435 \u0442\u043e\u0447\u043a\u0438 (\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f).<\/p>\n<p>\u0414\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f:<br \/>2 \u043f\u0440\u044f\u043c\u044b\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0432 \u0442\u043e\u0447\u043a\u0435 <br \/>\u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e: \u0442\u043e\u0447\u043a\u0430 \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u043e\u0431\u043e\u0438\u0445 \u043f\u0440\u044f\u043c\u044b\u0445 (\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f).<\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435. 2 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u044f\u043c\u043e\u0439 \u043d\u0430 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438. \u0410 2 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u044f\u043c\u044b\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0432 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 .<\/p>\n<\/div>\n<\/details>\n<p> \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043b\u0443\u0447\u0435\u0439 (\u0445\u043e\u0442\u044f \u0442\u043e\u0447\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u044b\u0445), \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0432  \u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u041b\u0443\u0447\u0438, \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0449\u0438\u0435 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c , \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c \u0442\u043e\u0447\u043a\u0430\u043c , \u0430 \u043b\u0443\u0447\u0438 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438  \u2014 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u043c.<\/p>\n<p>\u0413\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044f (\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435) \u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435  \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u044f\u043c\u044b\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0432 \u043f\u0440\u044f\u043c\u044b\u0435. \u0414\u043b\u044f \u043d\u0430\u0441 \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043d\u0430 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 . \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044f  \u0437\u0430\u0434\u0430\u0451\u0442 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u044b\u0445 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0435\u0439 .<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 <a href=\"https:\/\/habr.com\/ru\/articles\/709378\/\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0438\u043d\u0445\u043e\u043b \u043a\u0430\u043c\u0435\u0440\u044b<\/a>. \u041e\u043d\u0430 \u0437\u0430\u0434\u0430\u0451\u0442 \u0442\u043e, \u043a\u0430\u043a 3D-\u0442\u043e\u0447\u043a\u0430 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u0447\u043a\u0443  \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/p>\n<p>\u0412 \u044d\u0442\u0443 \u0436\u0435 \u0442\u043e\u0447\u043a\u0443 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043b\u0443\u0447\u0435 . \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u0430\u043c\u0435\u0440\u044b \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 2D-\u0442\u043e\u0447\u043a\u0443 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043b\u0443\u0447\u0443 \u0432 3D \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. <\/p>\n<p>\u0412  \u043c\u044b \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u0447\u043a\u0435  \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438  \u043b\u0443\u0447 (\u043f\u0440\u044f\u043c\u0443\u044e) . \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0441 \u043b\u0443\u0447\u0451\u043c \u0432 3D \u0443\u0436\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435 &#171;\u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&#187; \u0443\u0436\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0438\u043d\u0445\u043e\u043b \u043a\u0430\u043c\u0435\u0440\u044b, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0441\u0442\u044f\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439:<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c. \u041f\u0443\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0437\u0430\u0434\u0430\u043d\u0430 \u0442\u043e\u0447\u043a\u0430 . &#171;\u0421\u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u043c&#187; \u0435\u0451 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 . <br \/>. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u043a\u0430\u043c\u0435\u0440\u044b.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0432 3D. \u041f\u043e\u0432\u043e\u0440\u043e\u0442 \u0432 3D \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 . \u042d\u0442\u0430 \u0436\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0432 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435. \u0422\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0436\u0435 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 . \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432 , \u0430 \u043b\u0443\u0447\u0438 (\u043f\u0440\u044f\u043c\u044b\u0435).<\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a \u0437\u0430\u0434\u0430\u0447\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b<\/h2>\n<p>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c  \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441\u043d\u044f\u0442\u044b\u0445 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438. \u0411\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u0430\u0434\u0440\u043e\u0432 \u0447\u0442\u043e \u0441\u044c\u0435\u043c\u043a\u0430 \u0432\u0435\u043b\u0430\u0441\u044c \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442. \u041c\u0430\u0442\u0440\u0438\u0446\u044b  \u0437\u0430\u0434\u0430\u044e\u0442 <abbr class=\"habraabbr\" title=\"\u0442\u043e\u0447\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u043c\u0438\u0440\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0438\u043b\u0438 view \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\" data-title=\"&lt;p>\u0430\u0442, \u0438\u043b\u0438 view \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435&#187; data-title=&lt;p>\u0442\u043e\u0447\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u043c\u0438\u0440\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0438\u043b\u0438 view \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435&lt;\/p>&lt;p>&lt;\/p>&#187; data-abbr=&#187;\u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b&#187;>\u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b<\/abbr>. \u041c\u0430\u0442\u0440\u0438\u0446\u044b  \u0437\u0430\u0434\u0430\u044e\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <abbr class=\"habraabbr\" title=\"\u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0442\u043e \u043e\u043d\u0438 \u0440\u0430\u0437\u043d\u044b\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u0430\u043c\u0435\u0440\u044b, \u0438\u043b\u0438 \u043c\u0435\u043d\u044f\u043b\u0441\u044f \u0437\u0443\u043c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u044a\u0435\u043c\u043a\u0438\" data-title=\"&lt;p>\u0435 \u043a\u0430\u043c\u0435\u0440\u044b, \u0438\u043b\u0438 \u043c\u0435\u043d\u044f\u043b\u0441\u044f \u0437\u0443\u043c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u044a\u0435\u043c\u043a\u0438&#187; data-title=&lt;p>\u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0442\u043e \u043e\u043d\u0438 \u0440\u0430\u0437\u043d\u044b\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u0430\u043c\u0435\u0440\u044b, \u0438\u043b\u0438 \u043c\u0435\u043d\u044f\u043b\u0441\u044f \u0437\u0443\u043c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u044a\u0435\u043c\u043a\u0438&lt;\/p>&#187; data-abbr=&#187;\u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b&#187;>\u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b<\/abbr>. \u042d\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043d\u0430\u043c \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043d\u0430\u0448\u0435\u0439 3D-\u0441\u0446\u0435\u043d\u044b \u0438 \u0434\u0432\u0430 \u043a\u0430\u0434\u0440\u0430  \u0438 . \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u0442\u043e\u0447\u043a\u0443, \u043a\u0430\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442 , \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043b\u0443\u0447\u043e\u043c. \u0422\u043e \u0435\u0441\u0442\u044c \u0442\u0435\u0440\u044f\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0442\u043e\u0447\u043a\u0438 \u0432\u0434\u043e\u043b\u044c \u043b\u0443\u0447\u0430.<\/p>\n<p>\u0412 \u043a\u0430\u0434\u0440\u0430\u0445  \u0438  \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u0442\u043e\u0447\u043a\u0438  \u0431\u0443\u0434\u0435\u0442 \u0432 \u0442\u043e\u0447\u043a\u0430\u0445  \u0438 . \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u044b, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 (\u043b\u0443\u0447)  \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f: <\/p>\n<p>\u0418 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0435:<\/p>\n<p>\u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c . \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 3D-\u0442\u043e\u0447\u043a\u0438  \u0432 \u043a\u0430\u0434\u0440\u0430\u0445  \u0438  \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439 . \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0431\u0440\u0430\u043b\u0438 \u0442\u043e\u0447\u043a\u0443  \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e, \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u044d\u0442\u0430 \u0441\u0432\u044f\u0437\u044c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 3D-\u0442\u043e\u0447\u0435\u043a \u0441\u0446\u0435\u043d\u044b.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0432 \u043a\u0430\u0434\u0440\u0430\u0445  \u0438  \u043d\u0430\u0439\u0442\u0438 \u043d\u0430\u0431\u043e\u0440 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439 (\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u044b 2D-\u0442\u043e\u0447\u0435\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u0434\u043d\u043e\u0439 3D-\u0442\u043e\u0447\u043a\u0435), \u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0432\u0438\u0434\u0430<br \/>, \u0433\u0434\u0435 \u2014 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0438\u0437 9 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b (\u0441 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044f). \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 <abbr class=\"habraabbr\" title=\"Direct Linear Transform\" data-title=\"&lt;p>Direct Linear Transform&lt;\/p>&#187; data-abbr=&#187;DLT&#187;>DLT<\/abbr>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0442\u043e\u0447\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f  \u0432 \u0442\u043e\u0447\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f .<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0434\u043b\u044f \u043f\u0430\u0440\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d\u0430 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044f, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f\u0449\u0430\u044f \u0442\u043e\u0447\u043a\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0442\u043e\u0447\u043a\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0451 \u043a\u043e \u0432\u0441\u0435\u043c\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0451\u043c \u043e\u0434\u043d\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0433\u043e.<\/p>\n<h2>\u041e\u0431\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c<\/h2>\n<p>\u0414\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0439 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u044b \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438. \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0420\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0441 \u044d\u0442\u0438\u043c\u0438 \u0442\u0440\u0435\u043c\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u041f\u0435\u0440\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0432\u0430.<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u043e \u0432 \u0441\u0435\u0431\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e identity \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 . \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044e , \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435  \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u0412 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0448\u0430 \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0439, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0432 \u043e\u0434\u043d\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import cv2 import numpy as np from typing import Tuple, List, Optional  # for type hints RgbImg = np.array                   # shape = (h, w, 3) Point2dList = np.array              # shape = (N, 2) DescriptorsList = np.array          # shape = (N, DESCRIPTOR_SIZE) HMat = np.array                     # shape = (3, 3) BBox = Tuple[int, int, int, int]    # BoundingBox(x, y, right, top)   def build_panoramic_image(imgs: List[RgbImg]) -> RgbImg:     used_imgs: List[Tuple[RgbImg, HMat]] = _find_all_homography(imgs)     result_bbox: BBox = _get_result_panorama_bbox(used_imgs)     return _join_panoramic_image(used_imgs, result_bbox)<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>_find_all_homography<\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 . \u0421\u043f\u0438\u0441\u043e\u043a<code>used_imgs<\/code>\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 (\u043f\u0435\u0440\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435).<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>_get_result_panorama_bbox<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u043f\u043b\u043e\u0441\u043a\u0443\u044e \u043f\u0430\u043d\u043e\u0440\u0430\u043c\u0443.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>_join_panoramic_image<\/code> \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043e\u0434\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u043c\u0430\u0442\u0440\u0438\u0446 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438.<\/p>\n<\/div>\n<\/details>\n<h2>\u041f\u043e\u0438\u0441\u043a 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439<\/h2>\n<p>\u0414\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0438\u0437 \u043f\u0430\u0440 2D-\u0442\u043e\u0447\u0435\u043a \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0442\u0430\u043a\u0438\u0445 \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043f\u0430\u0440\u0430, \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e 3D-\u0442\u043e\u0447\u043a\u0435 \u0441\u0446\u0435\u043d\u044b, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u043e\u0439 \u043d\u0430 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044f\u0445.<\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 SIFT. \u0414\u0435\u0442\u0435\u043a\u0442\u043e\u0440\u044b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043d\u0430\u0431\u043e\u0440 \u0438\u0437 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0438 \u0438\u0445 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u0432. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 SIFT \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438\u0437 128 \u0447\u0438\u0441\u0435\u043b \u0442\u0438\u043f\u0430 float.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u044b \u043d\u0430\u0439\u0434\u0435\u043d\u044b \u043d\u0430 \u043e\u0431\u043e\u0438\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445, \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0438\u0449\u0443\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u044b \u0434\u0432\u0443\u0445 \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u0431\u043b\u0438\u0437\u043a\u0438 (\u043f\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e), \u0442\u043e \u043e\u043d\u0438, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 3D-\u0442\u043e\u0447\u043a\u0435 \u0441\u0446\u0435\u043d\u044b.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0441\u043a\u0430\u0442\u044c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 (\u043f\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044e) \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0438\u0437 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u042d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Nearest Neighbour (NN). \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u2014 First-to-Second NN Ratio Check (SNN). \u041e\u043d \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043b\u0443\u0447\u0448\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u0412 \u043d\u0451\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0449\u0443\u0442\u0441\u044f \u0434\u0432\u0430 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0438\u0437 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0434\u043e \u043d\u0438\u0445. \u0415\u0441\u043b\u0438 \u043e\u043d\u043e \u0431\u043b\u0438\u0437\u043a\u043e \u043a \u0435\u0434\u0438\u043d\u0438\u0446\u0435 (\u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0439 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0430 \u0442\u0430\u043a\u043e\u043c \u0436\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043e\u0442 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043a \u043f\u0435\u0440\u0432\u044b\u0439), \u0442\u043e \u044d\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043b\u043e\u0445\u0438\u043c. \u0415\u0441\u043b\u0438 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 , \u0442\u043e \u044d\u0442\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0427\u0430\u0441\u0442\u044c 2D-2D \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SIFT \u0438 First-to-Second NN Ratio Check.<br \/>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0439.<\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">def _detect_sift_points_and_descriptors(img: RgbImg) -> \\         Tuple[Point2dList, DescriptorsList]:     img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)     sift = cv2.SIFT_create()     keypoints, descriptors = sift.detectAndCompute(img_gray, None)     return np.array([kp.pt for kp in keypoints]),<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-414934","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/414934","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=414934"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/414934\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=414934"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=414934"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=414934"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}