{"id":320122,"date":"2021-03-23T15:00:54","date_gmt":"2021-03-23T15:00:54","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=320122"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=320122","title":{"rendered":"\u0421\u0432\u043e\u0439 AR. \u041c\u0430\u0440\u043a\u0435\u0440\u044b"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ij\/ug\/-q\/ijug-qx9e20ukcinxlhjks_vixu.png\"><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440.<br \/>  \u041f\u043e \u043c\u0435\u0440\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f <a href=\"https:\/\/github.com\/DistinctVision\/sonar\" rel=\"nofollow noopener noreferrer\">\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/a> \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443, \u043b\u0435\u0436\u0430\u0449\u0435\u0439 \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435 Unity, \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u044e\u0449\u0438\u0439 \u043c\u0430\u0440\u043a\u0435\u0440 \u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043d\u0435\u0433\u043e \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0443. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043d\u0430 C++ \u043f\u043e\u0434 Android, \u043d\u043e \u0444\u043e\u043a\u0443\u0441 \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u043d\u0430 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 <a href=\"https:\/\/habr.com\/ru\/post\/547876\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439<\/a>, \u0431\u0443\u0434\u0435\u0442 \u0431\u043b\u0438\u0436\u0435 \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u043d\u043e \u0435\u0441\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u0441\u043d\u043e\u0432\u0430\u043c\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u043d\u0435\u0435. <\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h3 id=\"odnorodnye-koordinaty\">\u041e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b.<\/h3>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u2014 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/665\/e97\/9c9\/665e979c98b472e9fe6ea66d78652d75.svg\" alt=\"$\\mathbb{R}^2$\" data-tex=\"inline\"><\/math>, \u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0435\u0434\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u2014 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3ae\/474\/b28\/3ae474b284188d25532e4745a37d89ce.svg\" alt=\"$\\mathbb{P}^2$\" data-tex=\"inline\"><\/math> (projective space).<br \/>  \u0427\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438 \u0438\u0437 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435, \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0441\u043a\u0430\u043b\u044f\u0440 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1d0\/034\/a09\/1d0034a09108db7af7cf42ea23a91ecd.svg\" alt=\"$w$\" data-tex=\"inline\"><\/math>, \u0430 \u0437\u0430\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1d0\/034\/a09\/1d0034a09108db7af7cf42ea23a91ecd.svg\" alt=\"$w$\" data-tex=\"inline\"><\/math> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f03\/c3a\/fe1\/f03c3afe12a1b8dce8ff1eb70ee3fc80.svg\" alt=\"$\\vec v = \\begin{pmatrix} x &amp; y \\end{pmatrix}^T \\in \\mathbb{R}^2 \\space \\Rightarrow \\space \\vec p = \\begin{pmatrix} x \\cdot w &amp; y \\cdot w &amp; w \\end{pmatrix}^T \\in \\mathbb{P}^2$\" data-tex=\"inline\"><\/math>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438 (homogeneous coordinates). \u0422\u0430\u043a \u043a\u0430\u043a <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1d0\/034\/a09\/1d0034a09108db7af7cf42ea23a91ecd.svg\" alt=\"$w$\" data-tex=\"inline\"><\/math> \u2014 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f, \u0442\u043e \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430. \u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/129\/c03\/402\/129c03402d3f99638e843ceb42e63e88.svg\" alt=\"$\\vec p = \\begin{pmatrix} x &amp; y &amp; w \\end{pmatrix}^T \\in \\mathbb{P}^2 \\space \\Rightarrow \\space \\vec v = \\begin{pmatrix} \\frac{x}{w} &amp; \\frac{y}{w} \\end{pmatrix}^T \\in \\mathbb{R}^2$\" data-tex=\"inline\"><\/math>. \u0423\u0434\u043e\u0431\u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1d0\/034\/a09\/1d0034a09108db7af7cf42ea23a91ecd.svg\" alt=\"$w$\" data-tex=\"inline\"><\/math> \u0431\u0440\u0430\u0442\u044c 1: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4b8\/7c4\/1c2\/4b87c41c29de98580a5bdf2d1be82d57.svg\" alt=\"$\\vec v = \\begin{pmatrix} x &amp; y \\end{pmatrix}^T \\in \\mathbb{R}^2 \\space \\Rightarrow \\space \\vec p = \\begin{pmatrix} x &amp; y &amp; 1 \\end{pmatrix}^T \\in \\mathbb{P}^2$\" data-tex=\"inline\"><\/math>. \u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u043a\u0436\u0435 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442\u0441\u044f: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c63\/9a6\/552\/c639a65524684e39f8ee77a6807421a8.svg\" alt=\"$\\vec p = \\begin{pmatrix} x &amp; y &amp; 1 \\end{pmatrix}^T \\in \\mathbb{P}^2 \\space \\Rightarrow \\space \\vec v = \\begin{pmatrix} x &amp; y \\end{pmatrix}^T \\in \\mathbb{R}^2$\" data-tex=\"inline\"><\/math>.<br \/>  \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043d\u0430 \u0441\u043a\u0430\u043b\u044f\u0440 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u0438 \u0432 \u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/883\/e07\/5a4\/883e075a4b69d2d9eb803fbcbbcc72ae.svg\" alt=\"$\\vec{p_B} = \\vec{p_A} \\cdot s = \\begin{pmatrix} x \\cdot s &amp; y \\cdot s &amp; w \\cdot s \\end{pmatrix}^T \\in \\mathbb{P}^2 \\space \\Rightarrow \\space \\vec v = \\begin{pmatrix} \\frac{x \\cdot s}{w \\cdot s} &amp; \\frac{y \\cdot s}{w \\cdot s} \\end{pmatrix}^T = \\begin{pmatrix} \\frac{x}{w} &amp; \\frac{y}{w} \\end{pmatrix}^T \\in \\mathbb{R}^2$\" data-tex=\"inline\"><\/math>.<br \/>  \u0422\u0430\u043a\u0436\u0435, \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0440\u0430\u0432\u043d\u0430 0, \u0442\u043e \u0442\u0430\u043a\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0432 \u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/669\/846\/044\/66984604439369b7b39e95ec1add0f83.svg\" alt=\"$\\vec p = \\begin{pmatrix} x &amp; y &amp; 0 \\end{pmatrix}^T \\in \\mathbb{P}^2$\" data-tex=\"inline\"><\/math> \u2013 \u0442\u0430\u043a\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u0447\u043a\u043e\u0439 \u043d\u0430 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438 (point at infinity \u0438\u043b\u0438 ideal point). <\/p>\n<p>  <\/p>\n<h3 id=\"transformacii-v-odnorodnyh-koordinatah\">\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445.<\/h3>\n<p>  <\/p>\n<p>\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u0432 \u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442.<br \/>  \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0442\u043e\u0447\u0435\u043a \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/316\/97f\/4eb\/31697f4eba51eb375c5d0ae5a9344453.svg\" alt=\"$\\vec{v'} = R \\vec{v} = \\begin{pmatrix} R_{11} &amp; R_{12} \\\\ R_{21} &amp; R_{22} \\end{pmatrix} \\begin{pmatrix} v_x \\\\ v_y \\end{pmatrix} = \\begin{pmatrix} {v'}_x \\\\ {v'}_y \\end{pmatrix}$\" data-tex=\"inline\"><\/math>.<br \/>  \u0412 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u044d\u0442\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0430\u043a\u0443\u044e \u0444\u043e\u0440\u043c\u0443: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/888\/272\/aa1\/888272aa113b1bafec68adf71971c708.svg\" alt=\"$\\vec{v'} = R \\vec{v} = \\begin{pmatrix} R_{11} &amp; R_{12} &amp; 0 \\\\ R_{21} &amp; R_{22} &amp; 0 \\\\ 0 &amp; 0 &amp; 1 \\end{pmatrix} \\begin{pmatrix} v_x \\\\ v_y \\\\ 1 \\end{pmatrix} = \\begin{pmatrix} {v'}_x \\\\ {v'}_y \\\\ 1 \\end{pmatrix}$\" data-tex=\"inline\"><\/math><br \/>  \u0410 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u043e\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/60b\/747\/3c7\/60b7473c75f60fab12fa43324845c712.svg\" alt=\"$\\vec{v'} = \\vec v + \\vec t$\" data-tex=\"inline\"><\/math>. \u041c\u044b \u043d\u0435 \u043c\u043e\u0433\u043b\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u043c\u0430\u0442\u0440\u0438\u0447\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u0430 \u0432 \u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. \u041d\u043e \u0443\u0436\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043e\u043d\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/175\/f98\/839\/175f98839ab732db76d5f20cd6ce2ce9.svg\" alt=\"$T$\" data-tex=\"inline\"><\/math>: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/276\/7fc\/70e\/2767fc70e416ec6407503fd9f8d8e539.svg\" alt=\"$\\vec{v'} = \\begin{pmatrix} 0 &amp; 0 &amp; t_x \\\\ 0 &amp; 0 &amp; t_y \\\\ 0 &amp; 0 &amp; 1 \\end{pmatrix} \\begin{pmatrix} v_x &amp; v_y &amp; 1 \\end{pmatrix} = \\begin{pmatrix} v_x + t_x \\\\ v_y + t_y \\\\ 1 \\end{pmatrix}$\" data-tex=\"inline\"><\/math>.<br \/>  \u0418\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u043c\u0430\u0442\u0440\u0438\u0447\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c. \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u043c \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b4b\/abe\/ef4\/b4babeef4dfe8a50c0722a2f50b4d2d2.svg\" alt=\"$\\vec{v'} = T \\cdot R \\cdot \\vec v = \\begin{pmatrix} 0 &amp; 0 &amp; t_x \\\\ 0 &amp; 0 &amp; t_y \\\\ 0 &amp; 0 &amp; 1 \\end{pmatrix} \\cdot \\begin{pmatrix} R_{11} &amp; R_{12} &amp; 0 \\\\ R_{21} &amp; R_{22} &amp; 0 \\\\ 0 &amp; 0 &amp; 1 \\end{pmatrix} \\cdot \\begin{pmatrix} v_x \\\\ v_y \\\\ 1 \\end{pmatrix}$\" data-tex=\"inline\"><\/math> <\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6a8\/a80\/3bb\/6a8a803bbbe4e6bd5ff2c25b48f8c0c0.svg\" alt=\"$\\vec{v'} = \\begin{pmatrix} R_{11} &amp; R_{12} &amp; t_x \\\\ R_{21} &amp; R_{22} &amp; t_y \\\\ 0 &amp; 0 &amp; 1 \\end{pmatrix} \\cdot \\begin{pmatrix} v_x \\\\ v_y \\\\ 1 \\end{pmatrix}$\" data-tex=\"inline\"><\/math> <\/p>\n<p>  <\/p>\n<h3 id=\"metod-naimenshih-kvadratov\">\u041c\u0435\u0442\u043e\u0434 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432<\/h3>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435, \u0432\u043e\u043e\u0440\u0443\u0436\u0438\u043c\u0441\u044f \u043d\u043e\u0432\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u2014 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432 (\u041c\u041d\u041a).<br \/>  \u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0442\u0430\u043a\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/37f\/40d\/9cc\/37f40d9ccba3370bb1d0555b80f6a034.svg\" alt=\"$\\begin{cases} A_{11} \\cdot x_1 + A_{12} \\cdot x_2 = b_1 \\\\ A_{21} \\cdot x_1 + A_{22} \\cdot x_2 = b_2 \\\\ A_{31} \\cdot x_1 + A_{32} \\cdot x_1 = b_3\\end{cases}$\" data-tex=\"inline\"><\/math><br \/>  \u042d\u0442\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043c\u0430\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u0432\u0438\u0434\u0435:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/05c\/4f9\/649\/05c4f9649311e7c03deeb391f2271218.svg\" alt=\"$\\begin{pmatrix} A_{11} &amp; A_{12} \\\\ A_{21} &amp; A_{22} \\\\ A_{31} &amp; A_{32} \\end{pmatrix} \\cdot \\begin{pmatrix} x_1 \\\\ x_2 \\end{pmatrix} = \\begin{pmatrix} b_1 \\\\ b_2 \\\\ b_3 \\end{pmatrix} = A \\cdot \\vec{x} = \\vec{b}$\" data-tex=\"inline\"><\/math>.<br \/>  \u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0443 \u043d\u0430\u0441 \u0434\u0432\u0430, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u2014 \u0442\u0440\u0438, \u0437\u043d\u0430\u0447\u0438\u0442 \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439. \u0410 \u0437\u043d\u0430\u0447\u0438\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u0438\u0445 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c, \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0438\u043c\u0435\u0442\u044c \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u2014 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u0434\u0435\u043b\u043e \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438, \u043d\u0443\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0435 \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0441\u0443\u043c\u043c\u0443 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432 \u0440\u0430\u0437\u043d\u0438\u0446\u044b: \u043f\u0443\u0441\u0442\u044c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/810\/9cc\/413\/8109cc41366425510f5bf399b85035a7.svg\" alt=\"$\\vec{b'} = A \\cdot \\vec{x}$\" data-tex=\"inline\"><\/math>, <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/87d\/c03\/83c\/87dc0383c42cd4fc7d439acf5a9c0aa7.svg\" alt=\"$\\vec{r} = (\\vec{b'} - \\vec{b})$\" data-tex=\"inline\"><\/math> \u2014 \u0432\u0435\u043a\u0442\u043e\u0440 \u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432, <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/891\/4a2\/45d\/8914a245d9c46fbf63ee9841d1afe4af.svg\" alt=\"$e(\\vec{x}) = \\sum{{r_i}^2} = \\sum{({b'}_i - b_i)^2}$\" data-tex=\"inline\"><\/math> \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438. <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c92\/496\/616\/c924966160640f7d7ef2ba407de6f443.svg\" alt=\"$e(\\vec{x}) \\rightarrow min$\" data-tex=\"inline\"><\/math>.<br \/>  \u0412 \u043c\u0430\u0442\u0440\u0438\u0447\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0437\u0430\u0434\u0430\u0447\u0443 \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/981\/10a\/ad9\/98110aad9b004436a15a2c396cfd7fb1.svg\" alt=\"$(A \\vec x - \\vec b)^T (A \\vec x - \\vec b) \\rightarrow min$\" data-tex=\"inline\"><\/math>.<br \/>  \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/259\/ecf\/687\/259ecf6870f5bf8f7509c94a38773aa3.svg\" alt=\"$A \\cdot \\vec x = \\vec b \\space \\Rightarrow \\space A^T \\cdot A \\cdot \\vec x = A^T \\vec b \\space \\Rightarrow \\space \\vec x = (A^T \\cdot A)^{-1} \\cdot A^T \\cdot \\vec b$\" data-tex=\"inline\"><\/math><br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/494\/819\/da6\/494819da6462f7e2651eb7284108440f.svg\" alt=\"$\\vec x = (A^T A)^{-1} A^T \\vec b$\" data-tex=\"inline\"><\/math><br \/>  \u041c\u0435\u0442\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438 \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439. \u041c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0448\u0438\u0431\u043a\u0438 \u043a\u0430\u043a \u0441\u0443\u043c\u043c\u0443 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432 \u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432. \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041c\u0438\u043d\u0438\u043c\u0443\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u0432 \u0435\u0435 \u044d\u043a\u0441\u0442\u0440\u0435\u043c\u0443\u043c\u0430\u0445. \u042d\u043a\u0441\u0442\u0440\u0435\u043c\u0443\u043c\u044b \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0442\u0430\u043c, \u0433\u0434\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0432\u043d\u044b \u043d\u0443\u043b\u044e:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/19c\/49e\/ec0\/19c49eec08e32f5590748543cbe485e9.svg\" alt=\"$\\begin{cases}\\frac{\\partial e(\\vec x)}{\\partial x_0} = 0 \\\\ .. \\\\ \\frac{\\partial e(\\vec x)}{\\partial x_n} = 0 \\end{cases}$\" data-tex=\"inline\"><\/math><br \/>  \u041f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439, \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430. \u0415\u0441\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u2014 \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f, \u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0440\u0443\u0434\u0430. \u0415\u0441\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u0442\u043e \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u0445 \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435. <\/p>\n<p>  <\/p>\n<h3 id=\"nemnogo-praktiki\">\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438<\/h3>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043c. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0440\u0430\u0431\u043e\u0442\u0443, \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u043f\u043e\u043a\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 OpenCV \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0435 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432. \u041d\u0430\u0439\u0434\u0435\u043c \u043c\u0430\u0440\u043a\u0435\u0440 \u0438 \u043d\u0430\u043b\u043e\u0436\u0438\u043c \u043d\u0430 \u043d\u0435\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435.<br \/>  \u041f\u0443\u0441\u0442\u044c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1d0\/034\/a09\/1d0034a09108db7af7cf42ea23a91ecd.svg\" alt=\"$w$\" data-tex=\"inline\"><\/math> \u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/517\/4f4\/9cc\/5174f49cc4f41fc5c4802c76f4c76c5a.svg\" alt=\"$h$\" data-tex=\"inline\"><\/math> \u2014 \u0448\u0438\u0440\u0438\u043d\u0430 \u0438 \u0432\u044b\u0441\u043e\u0442\u0430 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0422\u043e\u0433\u0434\u0430 \u0447\u0435\u0442\u044b\u0440\u0435 \u0443\u0433\u043b\u0430 \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/097\/66a\/006\/09766a006d7e52df7ace3fe778792f36.svg\" alt=\"$[\\vec{v_1}, \\vec{v_2}, \\vec{v_3}, \\vec{v_4}] = [\\begin{pmatrix} 0 &amp; 0 \\end{pmatrix}^T, \\begin{pmatrix} w &amp; 0 \\end{pmatrix}^T, \\begin{pmatrix} w &amp; h \\end{pmatrix}^T, \\begin{pmatrix} 0 &amp; h \\end{pmatrix}^T]$\" data-tex=\"inline\"><\/math><br \/>  \u041e\u0442 OpenCV \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b 4\u0445 \u0443\u0433\u043b\u043e\u0432 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u0432 \u043a\u0430\u0434\u0440\u0435: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e1f\/7ce\/951\/e1f7ce951f0ab9b386a4145d0aee1a0c.svg\" alt=\"$[\\vec{m_1}, \\vec{m_2}, \\vec{m_3}, \\vec{m_4}]$\" data-tex=\"inline\"><\/math><br \/>  \u0414\u043b\u044f \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043c\u0430\u0440\u043a\u0435\u0440 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043a\u0430\u0434\u0440\u0430 \u0441 \u043a\u0430\u043c\u0435\u0440\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0434\u0432\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4fb\/0da\/6cd\/4fb0da6cd882ac55a4fa00356edcf433.svg\" alt=\"$\\vec{aX}$\" data-tex=\"inline\"><\/math> \u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/03c\/70f\/ea6\/03c70fea6f4cd0a7f6b5ae543d170167.svg\" alt=\"$\\vec{aY}$\" data-tex=\"inline\"><\/math>, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043e\u0441\u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6d6\/a4f\/78f\/6d6a4f78fbacd6edecc018ce8ad3e364.svg\" alt=\"$X$\" data-tex=\"inline\"><\/math>, <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c62\/ff2\/5ef\/c62ff25ef4caeaeaef7122a489ef9d07.svg\" alt=\"$Y$\" data-tex=\"inline\"><\/math> \u0438 \u0432\u0435\u043a\u0442\u043e\u0440 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u2014 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2a8\/7b9\/2bd\/2a87b92bdc1a96411177c30cc3668ef8.svg\" alt=\"$\\vec{t}$\" data-tex=\"inline\"><\/math>:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/905\/3b3\/3d8\/9053b33d89d462a7492845a4a1340a77.svg\" alt=\"$\\begin{pmatrix} {{m'}_i}_x \\\\ {{m'}_i}_y \\\\ 1 \\end{pmatrix} = \\begin{pmatrix} aX_x &amp; aY_x &amp; t_x \\\\ aX_y &amp; aY_y &amp; t_y \\\\ 0 &amp; 0 &amp; 1 \\end{pmatrix} \\begin{pmatrix} {v_i}_x \\\\ {v_i}_y \\\\ 1 \\end{pmatrix}$\" data-tex=\"inline\"><\/math><br \/>  \u041c\u043e\u0436\u0435\u043c \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443\u043b\u0443, \u0432\u044b\u0447\u0435\u0440\u043a\u043d\u0443\u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0441\u0442\u0440\u043e\u043a\u0443:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/ebf\/e4d\/ffe\/ebfe4dffec950ae7a158f7a88a05ffe1.svg\" alt=\"$\\begin{pmatrix} {{m'}_i}_x \\\\ {{m'}_i}_y \\end{pmatrix} = \\begin{pmatrix} aX_x &amp; aY_x &amp; t_x \\\\ aX_y &amp; aY_y &amp; t_y \\end{pmatrix} \\begin{pmatrix} {v_i}_x \\\\ {v_i}_y \\end{pmatrix}$\" data-tex=\"inline\"><\/math><br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/28d\/a60\/96f\/28da6096f572f4af6a8a58094fce8d08.svg\" alt=\"$\\vec{{m'}_i} = \\begin{pmatrix} \\vec{aX} &amp; \\vec{aY} &amp; \\vec t \\end{pmatrix} \\vec{v_i}$\" data-tex=\"inline\"><\/math><br \/>  \u041e\u0434\u043d\u0430 \u043f\u0430\u0440\u0430 \u0442\u043e\u0447\u0435\u043a \u0437\u0430\u0434\u0430\u0435\u0442 \u0434\u0432\u0430 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u043c\u0435\u0435\u043c 6 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445. \u0417\u043d\u0430\u0447\u0438\u0442 \u043d\u0443\u0436\u043d\u043e 3 \u043f\u0430\u0440\u044b \u0442\u043e\u0447\u0435\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430. \u041c\u044b \u0438\u043c\u0435\u0435\u043c 4, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043e\u043d\u0430 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430. \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u041c\u041d\u041a \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<br \/>  \u041f\u0443\u0441\u0442\u044c \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/cca\/29f\/b6c\/cca29fb6c52655a8f94f7bbe703f11c7.svg\" alt=\"$\\vec x$\" data-tex=\"inline\"><\/math> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u043d \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/02a\/cd2\/73f\/02acd273fd649e62ac21917a88389244.svg\" alt=\"$\\vec x = \\begin{pmatrix} aX_x &amp; aY_x &amp; t_x &amp; aX_y &amp; aY_y &amp; t_y \\end{pmatrix}^T$\" data-tex=\"inline\"><\/math>.<br \/>  \u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/cca\/29f\/b6c\/cca29fb6c52655a8f94f7bbe703f11c7.svg\" alt=\"$\\vec x$\" data-tex=\"inline\"><\/math>, \u043c\u0430\u0442\u0440\u0438\u0446\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/493\/c1c\/008\/493c1c008018df9bed4910321f29ff00.svg\" alt=\"$A$\" data-tex=\"inline\"><\/math>, \u0437\u0430\u0434\u0430\u044e\u0449\u0430\u044f \u043d\u0430\u0448\u0443 \u043b\u0438\u043d\u0435\u0439\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0438\u0434:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9ac\/acc\/9d7\/9acacc9d776393486be13f11f0d19678.svg\" alt=\"$A = \\begin{pmatrix} {v_1}_x &amp; {v_1}_y &amp; 1 &amp; 0 &amp; 0 &amp; 0 \\\\ 0 &amp; 0 &amp; 0 &amp; {v_1}_x &amp; {v_1}_y &amp; 1 \\\\ ... \\\\ {v_4}_x &amp; {v_4}_y &amp; 1 &amp; 0 &amp; 0 &amp; 0 \\\\ 0 &amp; 0 &amp; 0 &amp; {v_4}_x &amp; {v_4}_y &amp; 1 \\end{pmatrix}$\" data-tex=\"inline\"><\/math><br \/>  \u0410 \u0432\u0435\u043a\u0442\u043e\u0440 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/564\/9f9\/cb8\/5649f9cb8861267b6a0331555574c5b2.svg\" alt=\"$\\vec b$\" data-tex=\"inline\"><\/math> \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/52b\/696\/c9b\/52b696c9b08e65994cbbd9064038e09a.svg\" alt=\"$\\vec b = \\begin{pmatrix} {m_1}_x \\\\ {m_1}_y \\\\ ... \\\\ {m_4}_x \\\\ {m_4}_y \\end{pmatrix}$\" data-tex=\"inline\"><\/math><br \/>  \u0422\u043e\u0433\u0434\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u041c\u041d\u041a, \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/494\/819\/da6\/494819da6462f7e2651eb7284108440f.svg\" alt=\"$\\vec x = (A^T A)^{-1} A^T \\vec b$\" data-tex=\"inline\"><\/math>. \u041e\u0442\u0441\u044e\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/4fb\/0da\/6cd\/4fb0da6cd882ac55a4fa00356edcf433.svg\" alt=\"$\\vec{aX}$\" data-tex=\"inline\"><\/math>, <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/03c\/70f\/ea6\/03c70fea6f4cd0a7f6b5ae543d170167.svg\" alt=\"$\\vec{aY}$\" data-tex=\"inline\"><\/math> \u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2a8\/7b9\/2bd\/2a87b92bdc1a96411177c30cc3668ef8.svg\" alt=\"$\\vec{t}$\" data-tex=\"inline\"><\/math>.<br \/>  \u041f\u0440\u043e\u0431\u0443\u0435\u043c!<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/7ee\/b4c\/5a2\/7eeb4c5a2eb79756ffbe3a8942898f43.gif\" alt=\"Affine\"><br \/>  \u041a\u0440\u0430\u0441\u043d\u044b\u043c \u0440\u0438\u0441\u0443\u044e\u0442\u0441\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043c\u0430\u0440\u043a\u0435\u0440\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0442 OpenCV. \u0412 \u0446\u0435\u043b\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043d\u0438\u0437\u043a\u0438\u0439 \u0443\u0433\u043e\u043b \u043f\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u043a \u043c\u0430\u0440\u043a\u0435\u0440\u0443, \u0442\u043e \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e. \u0410 \u0442\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0439 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0430\u0444\u0444\u0438\u043d\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443. \u0412\u0430\u0436\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0430\u0444\u0444\u0438\u043d\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u2014 \u043b\u0438\u043d\u0438\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u043c\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u043e\u0431\u044b\u0447\u043d\u043e, \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u043b\u0438\u043d\u0438\u0438 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ef\/tq\/kd\/eftqkdy7huvc5tqho35bcfkykpo.png\"><br \/>  \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u043b\u0438\u043d\u0438\u0438 \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435, \u0442.\u0435. \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043d\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u043c\u0438. \u0417\u043d\u0430\u0447\u0438\u0442 \u0430\u0444\u0444\u0438\u043d\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043d\u0430\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<\/p>\n<p>  <\/p>\n<h3 id=\"direct-linear-transformation\">Direct linear transformation<\/h3>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043b\u0443\u0447\u0448\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Direct linear transformation.<br \/>  \u0410 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 3&#215;3: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d89\/f48\/ab1\/d89f48ab1a108a62a95f3175dd69a7b2.svg\" alt=\"$H = \\begin{pmatrix} h_{11} &amp; h_{12} &amp; h_{13} \\\\ h_{21} &amp; h_{22} &amp; h_{23} \\\\ h_{31} &amp; h_{32} &amp; h_{33} \\end{pmatrix}$\" data-tex=\"inline\"><\/math>.<br \/>  \u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0438\u0437 \u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u043a\u0430\u043a <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1b8\/87e\/dd2\/1b887edd21ff5291c2e0a73bd076c6af.svg\" alt=\"$project$\" data-tex=\"inline\"><\/math> \u0438 \u0440\u0430\u0441\u043f\u0438\u0448\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/08d\/9fa\/efb\/08d9faefbe272bdf8fbb80773542e343.svg\" alt=\"$n$\" data-tex=\"inline\"><\/math> \u0442\u043e\u0447\u0435\u043a (<math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1af\/487\/1fd\/1af4871fd02ffd375f6422294f6a4d33.svg\" alt=\"$i = 0...n$\" data-tex=\"inline\"><\/math>, \u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5bb\/4c0\/153\/5bb4c0153c055d0cf49b10c71571e7f5.svg\" alt=\"$n = 4$\" data-tex=\"inline\"><\/math> \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435):<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/763\/6e9\/0cb\/7636e90cb67c2f2e8e062956bd237706.svg\" alt=\"$\\vec{p_i} = project(H \\cdot \\begin{pmatrix} {v_i}_x \\\\ {v_i}_y \\\\ 1 \\end{pmatrix}) = \\begin{pmatrix} \\frac{ H_{11} \\cdot {v_i}_x + H_{12} \\cdot {v_i}_y + H_{13}}{H_{31} \\cdot {v_i}_x + H_{32} \\cdot {v_i}_y + H_{33}} &amp; \\frac{ H_{21} \\cdot {v_i}_x + H_{22} \\cdot {v_i}_y + H_{23}}{H_{31} \\cdot {v_i}_x + H_{32} \\cdot {v_i}_y + H_{33}} \\end{pmatrix}^T$\" data-tex=\"inline\"><\/math><br \/>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0430\u0448\u0438 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/80b\/089\/26c\/80b08926cb461ebe90d8143ffe364ef4.svg\" alt=\"$\\begin{cases} ... \\\\ {p_i}_x = \\frac{ H_{11} \\cdot {v_i}_x + H_{12} \\cdot {v_i}_y + H_{13}}{H_{31} \\cdot {v_i}_x + H_{32} \\cdot {v_i}_y + H_{33}} \\\\ {p_i}_y = \\frac{ H_{21} \\cdot {v_i}_x + H_{22} \\cdot {v_i}_y + H_{23}}{H_{31} \\cdot {v_i}_x + H_{32} \\cdot {v_i}_y + H_{33}} \\\\ .. \\end{cases}$\" data-tex=\"inline\"><\/math> <\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2aa\/2ac\/e61\/2aa2ace618c3365616dee586829ed5d2.svg\" alt=\"$\\begin{cases} ... \\\\ {p_i}_x \\cdot (H_{31} \\cdot {v_i}_x + H_{32} \\cdot {v_i}_y + H_{33}) = H_{11} \\cdot {v_i}_x + H_{12} \\cdot {v_i}_y + H_{13} \\\\ {p_i}_y \\cdot (H_{31} \\cdot {v_i}_x + H_{32} \\cdot {v_i}_y + H_{33}) = H_{21} \\cdot {v_i}_x + H_{22} \\cdot {v_i}_y + H_{23} \\\\ ... \\end{cases}$\" data-tex=\"inline\"><\/math> <\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d8c\/c35\/08c\/d8cc3508c4ad513e1d915ca21542077c.svg\" alt=\"$\\begin{cases} ... \\\\ H_{11} \\cdot v_x + H_{12} \\cdot v_y + H_{13} - H_{31} \\cdot v_x \\cdot {p_i}_x - H_{32} \\cdot v_y \\cdot {p_i}_x - H_{33} \\cdot {p_i}_x = 0 \\\\ H_{21} \\cdot v_x + H_{22} \\cdot v_y + H_{23} - H_{31} \\cdot v_x \\cdot {p_i}_y - H_{32} \\cdot v_y \\cdot {p_i}_y - H_{33} \\cdot {p_i}_y = 0 \\\\ ... \\end{cases}$\" data-tex=\"inline\"><\/math> <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/bd2\/36a\/859\/bd236a859d121c85d92d1acf80ba3597.svg\" alt=\"$H$\" data-tex=\"inline\"><\/math> \u043a\u0430\u043a \u0432\u0435\u043a\u0442\u043e\u0440 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7eb\/c17\/903\/7ebc17903e1d38f39c9b226c6b378137.svg\" alt=\"$\\vec{h} = \\begin{pmatrix} H_{11} &amp; H_{12} &amp; H_{13} &amp; H_{21} &amp; H_{22} &amp; H_{23} &amp; H_{31} &amp; H_{32} &amp; H_{33} \\end{pmatrix}^T$\" data-tex=\"inline\"><\/math>.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0432 \u043c\u0430\u0442\u0440\u0438\u0447\u043d\u044b\u0439 \u0432\u0438\u0434: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/dc8\/22c\/851\/dc822c851b2c18f1467712101dd7dcf7.svg\" alt=\"$A = \\begin{pmatrix} ... \\\\ v_x &amp; v_y &amp; 1 &amp; 0 &amp; 0 &amp; 0 &amp; - v_x \\cdot {p_i}_x &amp; - v_y \\cdot {p_i}_x &amp; - {p_i}_x \\\\ 0 &amp; 0 &amp; 0 &amp; v_x &amp; v_y &amp; 1 &amp; - v_x \\cdot {p_i}_y &amp; - v_y \\cdot {p_i}_y &amp; - {p_i}_y \\\\ ... \\end{pmatrix}$\" data-tex=\"inline\"><\/math><br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2f2\/9fc\/619\/2f29fc619fc8619b08a4d6ec1bc9c404.svg\" alt=\"$A \\cdot \\vec{h} = \\vec{0}$\" data-tex=\"inline\"><\/math><br \/>  \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u043c \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0432\u0435\u043a\u0442\u043e\u0440 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/66c\/bc5\/70d\/66cbc570da104fe80ad8600264aaad27.svg\" alt=\"$\\vec{h}$\" data-tex=\"inline\"><\/math> (\u0442.\u0435. \u043c\u0430\u0442\u0440\u0438\u0446\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/bd2\/36a\/859\/bd236a859d121c85d92d1acf80ba3597.svg\" alt=\"$H$\" data-tex=\"inline\"><\/math>). \u041e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432. \u041e\u0434\u043d\u0430\u043a\u043e \u043e\u0434\u043d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430\u0439\u0442\u0438 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u2014 \u044d\u0442\u043e \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u2014 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/20e\/7c3\/8b9\/20e7c38b9548d9d5e93fbbd7c3537d9f.svg\" alt=\"$\\vec{h} = \\vec{0}$\" data-tex=\"inline\"><\/math>. \u041d\u043e \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430\u0441 \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438\u043c\u0435\u0435\u0442 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0439. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0443\u0441\u0442\u044c \u043c\u044b \u0443\u0436\u0435 \u0438\u043c\u0435\u0435\u043c \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u0432\u0435\u043a\u0442\u043e\u0440 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/66c\/bc5\/70d\/66cbc570da104fe80ad8600264aaad27.svg\" alt=\"$\\vec{h}$\" data-tex=\"inline\"><\/math>: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2f2\/9fc\/619\/2f29fc619fc8619b08a4d6ec1bc9c404.svg\" alt=\"$A \\cdot \\vec{h} = \\vec{0}$\" data-tex=\"inline\"><\/math>. \u0422\u0435\u043f\u0435\u0440\u044c \u0443\u043c\u043d\u043e\u0436\u0438\u043c \u0432\u0435\u043a\u0442\u043e\u0440 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/66c\/bc5\/70d\/66cbc570da104fe80ad8600264aaad27.svg\" alt=\"$\\vec{h}$\" data-tex=\"inline\"><\/math> \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0441\u043a\u0430\u043b\u044f\u0440 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f9d\/da2\/695\/f9dda26950cb67bd3ecef956c5341c14.svg\" alt=\"$s$\" data-tex=\"inline\"><\/math>, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0439, \u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/482\/b0d\/013\/482b0d013e2c55efb5a59e5b72e3ad3c.svg\" alt=\"$\\vec{h} \\cdot s$\" data-tex=\"inline\"><\/math> \u2014 \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0435\u0449\u0435 \u043e\u0434\u043d\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u044b: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/881\/5fe\/22b\/8815fe22b5bb1d3326c3e3467f65823b.svg\" alt=\"$A \\cdot \\vec{h} \\cdot s = \\vec{0}$\" data-tex=\"inline\"><\/math>. \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438, \u0442\u043e \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u043a\u0430\u043b\u044f\u0440 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0441\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043a\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u2014 \u043f\u0443\u0441\u0442\u044c \u0434\u043b\u0438\u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u044b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/307\/b82\/22a\/307b8222a3b35d9d4373d02421ecf304.svg\" alt=\"$|\\vec{h}| = 1$\" data-tex=\"inline\"><\/math>. <\/p>\n<p>  <\/p>\n<h4 id=\"singulyarnoe-razlozhenie-i-reshenie-odnorodnyh-sistem-uravneniy\">\u0421\u0438\u043d\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439<\/h4>\n<p>  <\/p>\n<p>\u0420\u0435\u0448\u0438\u0442\u044c \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u0438\u043d\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u044b (singular value decomposition). \u0421\u0438\u043d\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u0430: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/695\/853\/a70\/695853a709673b97f8beec58440360ce.svg\" alt=\"$svd(M) = U \\cdot W \\cdot V^T$\" data-tex=\"inline\"><\/math>, \u0433\u0434\u0435 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d07\/cc5\/b26\/d07cc5b26db621faab45e0e0b54ede62.svg\" alt=\"$U$\" data-tex=\"inline\"><\/math> \u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/836\/e59\/247\/836e59247dee9dc566df40f0f1d606e8.svg\" alt=\"$V$\" data-tex=\"inline\"><\/math> \u2014 \u043e\u0440\u0442\u043e\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b, \u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6e5\/abb\/15e\/6e5abb15e29d1257aebb0838e6251398.svg\" alt=\"$W$\" data-tex=\"inline\"><\/math> \u2014 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043b\u0438\u0431\u043e \u0440\u0430\u0432\u043d\u044b \u043d\u0443\u043b\u044e \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f (\u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437). \u0415\u0441\u043b\u0438 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043a\u0430\u043a \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432, \u0442\u043e \u044d\u0442\u043e \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439 \u044d\u0442\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u0442\u0440\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445: \u043f\u043e\u0432\u043e\u0440\u043e\u0442, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u043e\u0441\u044f\u043c, \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442. \u041c\u0430\u0442\u0440\u0438\u0446\u044b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d07\/cc5\/b26\/d07cc5b26db621faab45e0e0b54ede62.svg\" alt=\"$U$\" data-tex=\"inline\"><\/math> \u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/836\/e59\/247\/836e59247dee9dc566df40f0f1d606e8.svg\" alt=\"$V$\" data-tex=\"inline\"><\/math> \u2014 \u044d\u0442\u043e \u043e\u0440\u0442\u043e\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0438\u0445 \u043c\u0430\u0442\u0440\u0438\u0446\u0430\u043c\u0438 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430. \u0422\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/964\/54a\/341\/96454a341c179f7da822f7ed752021bb.svg\" alt=\"$|U| = \\pm 1$\" data-tex=\"inline\"><\/math> \u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/955\/cee\/48d\/955cee48de2a67f59dd7aa5d595621e6.svg\" alt=\"$|V| = \\pm 1$\" data-tex=\"inline\"><\/math>, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/94d\/13e\/e0a\/94d13ee0aadd7f17977e0d279af38d42.svg\" alt=\"$M$\" data-tex=\"inline\"><\/math> \u2014 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 3&#215;3, \u0442\u043e \u0442\u0440\u043e\u0439\u043a\u0430 \u0431\u0430\u0437\u0438\u0441\u043d\u044b\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0438 \u044d\u0442\u0438\u0445 \u043c\u0430\u0442\u0440\u0438\u0446 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u0435\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438, \u0430 \u043d\u0435 \u043f\u0440\u0430\u0432\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e.<br \/>  \u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u043e\u043c, \u043a\u0430\u043a \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u044d\u0442\u043e \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0412 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0445 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u0445 \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u2014 <a href=\"https:\/\/eigen.tuxfamily.org\/index.php?title=Main_Page\" rel=\"nofollow noopener noreferrer\">Eigen<\/a>.<br \/>  \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u044d\u0442\u0438\u043c \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u0432\u044b\u0448\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/493\/c1c\/008\/493c1c008018df9bed4910321f29ff00.svg\" alt=\"$A$\" data-tex=\"inline\"><\/math>: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d93\/87e\/199\/d9387e1996823cb49273062f3c161205.svg\" alt=\"$svd(A) = U \\cdot W \\cdot V^T$\" data-tex=\"inline\"><\/math>. \u041b\u0443\u0447\u0448\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2f2\/9fc\/619\/2f29fc619fc8619b08a4d6ec1bc9c404.svg\" alt=\"$A \\cdot \\vec{h} = \\vec{0}$\" data-tex=\"inline\"><\/math> \u2014 \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u044b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/836\/e59\/247\/836e59247dee9dc566df40f0f1d606e8.svg\" alt=\"$V$\" data-tex=\"inline\"><\/math>: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a87\/be5\/c08\/a87be5c083cd291a09900df2958015c3.svg\" alt=\"$\\vec{h} = V_{n}$\" data-tex=\"inline\"><\/math>. \u0410 \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u0430\u0442\u0440\u0438\u0446\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/836\/e59\/247\/836e59247dee9dc566df40f0f1d606e8.svg\" alt=\"$V$\" data-tex=\"inline\"><\/math> \u2014 \u043e\u0440\u0442\u043e\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f, \u0442\u043e \u0434\u043b\u0438\u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430, \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430, \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u0430 \u043a\u0430\u043a \u0440\u0430\u0437 \u0435\u0434\u0438\u043d\u0438\u0446\u0435. <\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0414\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0443 \u043d\u0430\u0441 \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c, \u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/3f8\/1ca\/62a\/3f81ca62a8fab9ff8ae830c0422641e2.svg\" alt=\"$A \\cdot \\vec{h}$\" data-tex=\"inline\"><\/math> \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440, \u0445\u043e\u0442\u044f \u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0431\u043b\u0438\u0437\u043a\u0438 \u043a \u043d\u0443\u043b\u044e. \u041d\u0443\u0436\u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u0443\u044e \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c, \u0430 \u0434\u043b\u044f \u0435\u0435 \u043e\u0446\u0435\u043d\u043a\u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0432\u0435\u0449\u0435\u0439 \u0441\u0443\u043c\u043c\u043e\u0439 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/dd4\/a96\/20f\/dd4a9620fd09d580ba2bf443f8de14a7.svg\" alt=\"$\\vec{e} = \\sum{{e_i}^2} = \\vec{e}^T \\vec{e} \\rightarrow min$\" data-tex=\"inline\"><\/math>.<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/150\/bc6\/d03\/150bc6d03800aefb87fe628cbe72d82d.svg\" alt=\"$\\vec{e} = H \\cdot \\vec{h} \\Rightarrow \\vec{e}^T \\vec{e} = (H \\cdot \\vec{h})^T (H \\cdot \\vec{h}) = (U \\cdot W \\cdot V^T \\cdot \\vec{h})^T (U \\cdot W \\cdot V^T \\cdot \\vec{h}) \\rightarrow min$\" data-tex=\"inline\"><\/math><br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/77f\/48e\/dfc\/77f48edfcae691f3475d996fce4aee96.svg\" alt=\"$E = \\vec{e}^T \\vec{e} = \\vec{h}^T \\cdot V \\cdot W \\cdot U^T \\cdot U \\cdot W \\cdot V^T \\cdot \\vec{h}$\" data-tex=\"inline\"><\/math>, \u0442\u0430\u043a \u043a\u0430\u043a <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d07\/cc5\/b26\/d07cc5b26db621faab45e0e0b54ede62.svg\" alt=\"$U$\" data-tex=\"inline\"><\/math> \u2014 \u043e\u0440\u0442\u043e\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430, \u0442\u043e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/16e\/dd6\/b73\/16edd6b73a14fedeb9c85ac9d4b566f0.svg\" alt=\"$U^T \\cdot U = I$\" data-tex=\"inline\"><\/math>. \u0422\u0430\u043a \u043a\u0430\u043a <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6e5\/abb\/15e\/6e5abb15e29d1257aebb0838e6251398.svg\" alt=\"$W$\" data-tex=\"inline\"><\/math> \u2014 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e, \u0442\u043e \u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/85a\/d52\/0e1\/85ad520e1df131b45eed1acb7aa28ffe.svg\" alt=\"$(W^T \\cdot W)$\" data-tex=\"inline\"><\/math> \u2014 \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u0441 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e \u2014 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u0432\u043e\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u044b. \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f1d\/f25\/72f\/f1df2572fcaa72e187f513b4c106225e.svg\" alt=\"$W^2 = W^T \\cdot W$\" data-tex=\"inline\"><\/math>.<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/667\/862\/e8a\/667862e8aa5f2c718bc5fe700e09ac68.svg\" alt=\"$E = \\vec{e}^T \\vec{e} = \\vec{h}^T \\cdot V \\cdot W^2 \\cdot V^T \\cdot \\vec{h} \\rightarrow min$\" data-tex=\"inline\"><\/math><br \/>  \u041e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c5c\/a2e\/7b9\/c5ca2e7b9e9b7c30864ffb2fd419e464.svg\" alt=\"$\\vec{c} = V^T \\cdot \\vec{h}$\" data-tex=\"inline\"><\/math>, \u0437\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/836\/e59\/247\/836e59247dee9dc566df40f0f1d606e8.svg\" alt=\"$V$\" data-tex=\"inline\"><\/math> \u2014 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0434\u043b\u0438\u043d\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/66c\/bc5\/70d\/66cbc570da104fe80ad8600264aaad27.svg\" alt=\"$\\vec{h}$\" data-tex=\"inline\"><\/math>, \u0437\u043d\u0430\u0447\u0438\u0442 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/791\/584\/492\/791584492d95bda3e427265652eca34a.svg\" alt=\"$|\\vec{c}| = 1$\" data-tex=\"inline\"><\/math>:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a64\/63c\/d82\/a6463cd82292a970546249126bb4f5cc.svg\" alt=\"$E = \\vec{c}^T \\cdot W^2 \\cdot \\vec{c} \\rightarrow min$\" data-tex=\"inline\"><\/math>.<br \/>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0434\u0438\u0430\u0433\u043e\u043d\u0430\u043b\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u044b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6e5\/abb\/15e\/6e5abb15e29d1257aebb0838e6251398.svg\" alt=\"$W$\" data-tex=\"inline\"><\/math> \u043a\u0430\u043a \u0432\u0435\u043a\u0442\u043e\u0440 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/734\/c62\/0a1\/734c620a1b0b841a33c195da2b9eea42.svg\" alt=\"$\\vec{w}$\" data-tex=\"inline\"><\/math>. \u0422\u043e\u0433\u0434\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c59\/6ce\/0ec\/c596ce0ec9460157a2b882ad203aef29.svg\" alt=\"$E = \\vec{c}^T \\cdot W^2 \\cdot \\vec{c} = \\sum{{c_i}^2 \\cdot {w_i}^2} \\rightarrow min$\" data-tex=\"inline\"><\/math><br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u043c \u0447\u0435\u043c\u0443 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u0435\u043d <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6bd\/bf2\/1e1\/6bdbf21e12680f677992e06462f5f7e7.svg\" alt=\"$\\vec{c}$\" data-tex=\"inline\"><\/math>, \u0447\u0442\u043e\u0431\u044b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d4f\/55a\/37f\/d4f55a37fb733b176d0ef014591e1b35.svg\" alt=\"$E$\" data-tex=\"inline\"><\/math> \u0441\u0442\u0430\u043b\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c. \u0422\u0430\u043a \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/734\/c62\/0a1\/734c620a1b0b841a33c195da2b9eea42.svg\" alt=\"$\\vec{w}$\" data-tex=\"inline\"><\/math>. \u0421\u0443\u0434\u044f \u043f\u043e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2a5\/c05\/adc\/2a5c05adc1e0b1339694a0048e90426a.svg\" alt=\"$\\sum{{c_i}^2 \\cdot {w_i}^2}$\" data-tex=\"inline\"><\/math>, \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0432\u043a\u043b\u0430\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/734\/c62\/0a1\/734c620a1b0b841a33c195da2b9eea42.svg\" alt=\"$\\vec{w}$\" data-tex=\"inline\"><\/math>. \u0422\u0430\u043a \u043a\u0430\u043a <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/791\/584\/492\/791584492d95bda3e427265652eca34a.svg\" alt=\"$|\\vec{c}| = 1$\" data-tex=\"inline\"><\/math>, \u0442\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u0442 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/340\/81f\/77e\/34081f77ec706f22c5797547c2d652a8.svg\" alt=\"$\\vec{c} = \\begin{pmatrix} 0 &amp; ... &amp; 0 &amp; 1 \\end{pmatrix}^T$\" data-tex=\"inline\"><\/math>.<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/005\/661\/6f1\/0056616f1e90058f5052b2f63f6bd758.svg\" alt=\"$\\begin{pmatrix} 0 &amp; ... &amp; 0 &amp; 1 \\end{pmatrix}^T = V^T \\cdot \\vec{h} \\Rightarrow \\vec{h} = V \\cdot \\begin{pmatrix} 0 &amp; ... &amp; 0 &amp; 1 \\end{pmatrix}^T$\" data-tex=\"inline\"><\/math>.<br \/>  \u0418\u0437 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434, \u0447\u0442\u043e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a87\/be5\/c08\/a87be5c083cd291a09900df2958015c3.svg\" alt=\"$\\vec{h} = V_n$\" data-tex=\"inline\"><\/math> \u2014 \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u043c\u0430\u0442\u0440\u0438\u0446\u044b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/836\/e59\/247\/836e59247dee9dc566df40f0f1d606e8.svg\" alt=\"$V$\" data-tex=\"inline\"><\/math>.<\/p>\n<\/div><\/div>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2f2\/9fc\/619\/2f29fc619fc8619b08a4d6ec1bc9c404.svg\" alt=\"$A \\cdot \\vec{h} = \\vec{0}$\" data-tex=\"inline\"><\/math>. \u0420\u0435\u0448\u0430\u0435\u043c \u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0432\u044b\u0448\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/66c\/bc5\/70d\/66cbc570da104fe80ad8600264aaad27.svg\" alt=\"$\\vec{h}$\" data-tex=\"inline\"><\/math>. \u0417\u0430\u0442\u0435\u043c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0443\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0441\u043a\u043e\u043c\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/bd2\/36a\/859\/bd236a859d121c85d92d1acf80ba3597.svg\" alt=\"$H$\" data-tex=\"inline\"><\/math>. \u041f\u0440\u043e\u0431\u0443\u0435\u043c: <\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ba1\/965\/3da\/ba19653dabb8956516bbb718182ee4fa.gif\" alt=\"Homography\"> <\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0441\u0442\u0430\u043b\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u0438 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u043f\u0440\u0430\u0432\u0434\u0443.<br \/>  \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0430\u0444\u0444\u0438\u043d\u043d\u044b\u0445 \u0438 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u2014 <a href=\"https:\/\/github.com\/DistinctVision\/sonar\/tree\/article2\/tests\" rel=\"nofollow noopener noreferrer\">sonar\/tests\/test_marker_transform<\/a><\/p>\n<p>  <\/p>\n<h3 id=\"pinhole-camera-model\">Pinhole camera model<\/h3>\n<p>  <\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043d\u043e \u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043a\u0430\u043c\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. \u0427\u0442\u043e\u0431\u044b \u0438\u0445 \u043d\u0430\u0439\u0442\u0438, \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0442\u043e\u0447\u043a\u0438 \u043c\u0438\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b.<br \/>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e. \u0421\u0443\u0442\u044c \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0442\u043e\u0447\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442 \u043b\u0443\u0447\u0438, \u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u2014 \u0446\u0435\u043d\u0442\u0440\u0435 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u043b\u0443\u0447\u0438 \u0441\u0435\u0431\u044f \u0438 \u0432\u0435\u0434\u0443\u0442 \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0433\u043b\u0430\u0437\u0430 \u0438\u043b\u0438 \u0432 \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u0435.<br \/>  \u041f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u0431\u0443\u0434\u0435\u043c \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438 \u0431\u0443\u0434\u0435\u0442 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0430\u043a\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c, \u0437\u0430\u0434\u0430\u043d\u043d\u0443\u044e \u0442\u0430\u043a\u0438\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/216\/b0c\/510\/216b0c510c5f65f11a64a156b11c75c6.svg\" alt=\"$z = 1$\" data-tex=\"inline\"><\/math>. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0448\u0430 \u043a\u0430\u043c\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0441 \u043e\u0441\u044c\u044e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/274\/25a\/3cd\/27425a3cdf6cdf9dea5baa307429b5a7.svg\" alt=\"$Z$\" data-tex=\"inline\"><\/math>:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/br\/qp\/ub\/brqpubk8rpbfaan1fhdetrknozw.png\"> <\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u0434\u0430\u0434\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u043b\u0443\u0447\u0430, \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0442\u043e\u0447\u043a\u0443 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c43\/eb3\/343\/c43eb334309a348896497de56c54c07f.svg\" alt=\"$\\vec{r} = \\vec{v} \\cdot t$\" data-tex=\"inline\"><\/math>, \u0433\u0434\u0435 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b43\/033\/3ab\/b430333ab4cfd7499dacec1598232758.svg\" alt=\"$\\vec{r}$\" data-tex=\"inline\"><\/math> \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438 \u043b\u0443\u0447\u0430, <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/ff5\/059\/671\/ff5059671e83505859d66f0b992edb1d.svg\" alt=\"$\\vec{v}$\" data-tex=\"inline\"><\/math> \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0438, \u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9b0\/012\/4e4\/9b00124e411362185d05b841bc32695f.svg\" alt=\"$t$\" data-tex=\"inline\"><\/math> \u2014 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c. \u0415\u0441\u043b\u0438 \u043b\u0443\u0447 \u043d\u0435 \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u043d\u0430\u0448\u0435\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0438 \u043d\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0435\u043d \u0435\u0439, \u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0442\u044c \u0435\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c80\/1bc\/e91\/c801bce910abda9287a53477cfea8b5a.svg\" alt=\"$r_z = 1$\" data-tex=\"inline\"><\/math>.<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a44\/3d5\/e83\/a443d5e83e8bc2454f100a5667de9796.svg\" alt=\"$r_z = v_z \\cdot t \\Rightarrow t = \\frac{1}{v_z}$\" data-tex=\"inline\"><\/math><br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/929\/2ba\/357\/9292ba357f19df908b5222b124671831.svg\" alt=\"$\\vec{r} = \\vec{v} \\cdot t = \\vec{v} \\cdot \\frac{1}{v_z} = \\begin{pmatrix} \\frac{v_x}{v_z} &amp; \\frac{v_y}{v_z} &amp; 1\\end{pmatrix}$\" data-tex=\"inline\"><\/math><br \/>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u0442\u043e\u0447\u043a\u0438: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/eae\/a88\/28d\/eaea8828d9ea9e3ef6f2325ca4ef9379.svg\" alt=\"$\\vec{p} = \\begin{pmatrix} \\frac{v_x}{v_z} &amp; \\frac{v_y}{v_z}\\end{pmatrix}$\" data-tex=\"inline\"><\/math>. \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442? \u042d\u0442\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0438\u0437 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0435 \u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u044b. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0449\u0438\u0435 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u043c \u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u044b\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438. \u0410 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0438\u0437 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0435 \u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u044b \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044e. \u041c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u044b\u0435 \u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u043c\u0443.<br \/>  \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0435\u0435 \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041e\u0431\u044b\u0447\u043d\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0433\u0434\u0435 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a73\/fda\/bdd\/a73fdabddb9b56e0a03e3b5335081520.svg\" alt=\"$width$\" data-tex=\"inline\"><\/math> \u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/efa\/8ed\/f6a\/efa8edf6a638da04b940ff794cecaa38.svg\" alt=\"$height$\" data-tex=\"inline\"><\/math> \u2014 \u0432\u044b\u0441\u043e\u0442\u0430 \u0438 \u0448\u0438\u0440\u0438\u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/q9\/tr\/_v\/q9tr_vx-saxwxq9vyrywcuop8zi.png\"><br \/>  \u041f\u0443\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0434\u043b\u044f \u043a\u0430\u043c\u0435\u0440\u044b \u0437\u0430\u0434\u0430\u043d \u0443\u0433\u043e\u043b \u043e\u0431\u0437\u043e\u0440\u0430 \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438 \u2014 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/42e\/407\/e9d\/42e407e9d07c67e4b0fbfdecbbfbdb4f.svg\" alt=\"$angle_x$\" data-tex=\"inline\"><\/math>.<br \/>  \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/817\/b92\/407\/817b92407f764f57af9226e50cc788fd.svg\" alt=\"$x$\" data-tex=\"inline\"><\/math> \u0442\u043e\u0447\u043a\u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/839\/f25\/c27\/839f25c2746382debd4f08ea25ad5ecf.svg\" alt=\"$p$\" data-tex=\"inline\"><\/math> \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442 \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043b\u0435\u0432\u043e\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043a\u0430\u043c\u0435\u0440\u044b \u0434\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043f\u0440\u0430\u0432\u043e\u0439 \u0431\u044b\u043b\u043e \u0440\u0430\u0432\u043d\u043e \u0448\u0438\u0440\u0438\u043d\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041f\u0440\u0438 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u043c\u0435\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/f2\/sz\/da\/f2szdajn1vzhplgf-canpuyrbqg.png\" alt=\"Image coordinates\"><br \/>  \u0417\u0434\u0435\u0441\u044c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c98\/07e\/535\/c9807e535d5d634312114ed09e352833.svg\" alt=\"$A, C$\" data-tex=\"inline\"><\/math> \u2014 \u043b\u0435\u0432\u0430\u044f \u0438 \u043f\u0440\u0430\u0432\u044b\u0435 \u043a\u0440\u0430\u0439\u043d\u0438\u0435 \u0442\u043e\u0447\u043a\u0438, <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/20d\/8ca\/ec6\/20d8caec693d8d8eaf70885e408419f6.svg\" alt=\"$B$\" data-tex=\"inline\"><\/math> \u2014 \u0442\u043e\u0447\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5b4\/098\/5e9\/5b40985e97972b4df8fab6b79bb2197d.svg\" alt=\"$x = 0$\" data-tex=\"inline\"><\/math>, \u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/216\/b0c\/510\/216b0c510c5f65f11a64a156b11c75c6.svg\" alt=\"$z = 1$\" data-tex=\"inline\"><\/math>. \u0423\u0433\u043e\u043b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d7c\/729\/164\/d7c729164491787395e79a5e59def22c.svg\" alt=\"$\\angle{AOC} = angle_x$\" data-tex=\"inline\"><\/math>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u043c\u0435\u0435\u043c \u0442\u0440\u0435\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e89\/64d\/920\/e8964d9208fbb26d1dc04977b0a81208.svg\" alt=\"$AOB$\" data-tex=\"inline\"><\/math>, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0433\u043e\u043b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9c8\/21a\/6bf\/9c821a6bf4f52ef5df3c55bef5128219.svg\" alt=\"$\\angle{ABO} = 90^{\\circ}$\" data-tex=\"inline\"><\/math>, \u0430 \u0443\u0433\u043e\u043b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/eda\/532\/16e\/eda53216eb5c117fad31b207031d93ec.svg\" alt=\"$\\angle{AOB} = \\frac{angle_x}{2}$\" data-tex=\"inline\"><\/math>, \u0442\u0430\u043a \u043a\u0430\u043a <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8c9\/54e\/6b6\/8c954e6b6167d9491f2b23a2b7bf38ae.svg\" alt=\"$OB$\" data-tex=\"inline\"><\/math> \u0434\u0435\u043b\u0438\u0442 \u0443\u0433\u043e\u043b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d64\/3f5\/0e8\/d643f50e8fc62673962d5a9a8b3c3d48.svg\" alt=\"$\\angle{AOC}$\" data-tex=\"inline\"><\/math> \u043f\u043e\u043f\u043e\u043b\u0430\u043c. \u0414\u043b\u0438\u043d\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8c9\/54e\/6b6\/8c954e6b6167d9491f2b23a2b7bf38ae.svg\" alt=\"$OB$\" data-tex=\"inline\"><\/math> \u0440\u0430\u0432\u043d\u0430 1. \u041e\u0442\u0441\u044e\u0434\u0430 \u0447\u0435\u0440\u0435\u0437 \u0442\u0430\u043d\u0433\u0435\u043d\u0441 \u0443\u0433\u043b\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/920\/6f0\/e25\/9206f0e2509d46673c8a393b76dca87c.svg\" alt=\"$\\angle{AOB}$\" data-tex=\"inline\"><\/math> \u043d\u0430\u0439\u0434\u0435\u043c \u0434\u043b\u0438\u043d\u0443 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/dc6\/6db\/42d\/dc66db42dccdf3e4a18f6ba96c9a350b.svg\" alt=\"$AB$\" data-tex=\"inline\"><\/math> \u2014 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/176\/192\/579\/1761925792799b087171d1c12203af06.svg\" alt=\"$\\tan{\\angle{AOB}} = \\tan{\\frac{angle_x}{2}} = \\frac{AB}{OB} = AB$\" data-tex=\"inline\"><\/math>. \u0410 \u0443\u0436\u0435 \u043e\u0442\u0441\u044e\u0434\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/eff\/703\/c80\/eff703c80554f97f0f7f460f1e1d9e28.svg\" alt=\"$AC = 2 \\cdot AB = 2 \\cdot \\tan{\\frac{angle_x}{2}}$\" data-tex=\"inline\"><\/math>.<br \/>  \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0434\u0438\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/817\/b92\/407\/817b92407f764f57af9226e50cc788fd.svg\" alt=\"$x$\" data-tex=\"inline\"><\/math> \u2014 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0a0\/97c\/690\/0a097c6907d52969d8bf64e4c261804b.svg\" alt=\"$[- \\tan{\\frac{angle_x}{2}}, \\tan{\\frac{angle_x}{2}}]$\" data-tex=\"inline\"><\/math> \u043a \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0443 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/865\/41d\/49b\/86541d49b755068a943696a3b00e1cf7.svg\" alt=\"$[- \\frac{width}{2}, \\frac{width}{2}]$\" data-tex=\"inline\"><\/math> \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/20a\/7a6\/d18\/20a7a6d180bd0fbf2d59949a5c861e61.svg\" alt=\"$f_x = \\frac{width}{2 \\cdot \\tan{\\frac{angle_x}{2}}}, \\space x' = x \\cdot f_x$\" data-tex=\"inline\"><\/math><br \/>  \u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9b3\/4c4\/da5\/9b34c4da5c757d4982bbd1b6f2e8998a.svg\" alt=\"$y$\" data-tex=\"inline\"><\/math> \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0442\u0443 \u0436\u0435 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0443. \u041d\u043e \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u043e\u0441\u044c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c62\/ff2\/5ef\/c62ff25ef4caeaeaef7122a489ef9d07.svg\" alt=\"$Y$\" data-tex=\"inline\"><\/math> \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0430 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443 (\u0432\u043d\u0438\u0437). \u0427\u0442\u043e\u0431\u044b \u043e\u0442\u0440\u0430\u0437\u0438\u0442\u044c \u043e\u0441\u044c, \u0443\u043c\u043d\u043e\u0436\u0438\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u043f\u043e \u043e\u0441\u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c62\/ff2\/5ef\/c62ff25ef4caeaeaef7122a489ef9d07.svg\" alt=\"$Y$\" data-tex=\"inline\"><\/math> \u043d\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d06\/719\/edc\/d06719edc69908e7467f7e6189302b74.svg\" alt=\"$-1$\" data-tex=\"inline\"><\/math>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5bc\/6b5\/512\/5bc6b55122544cbc4a88f4c490b3acb3.svg\" alt=\"$f_y = - f_x, \\space , \\space \\space y' = y \\cdot f_y$\" data-tex=\"inline\"><\/math><br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/81d\/28c\/7ed\/81d28c7ed53b90435b033e8b49c73d9b.svg\" alt=\"$\\vec{p'} = \\begin{pmatrix} f_x \\cdot p_x &amp; f_y \\cdot p_y \\end{pmatrix}^T$\" data-tex=\"inline\"><\/math><br \/>  \u0410 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u0438\u0434\u0438\u043c\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/-d\/_a\/t4\/-d_at4eekyfgre3hnx0sb2tbfh8.png\" alt=\"Image range\"><br \/>  \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0442\u0430\u043a, \u0447\u0442\u043e \u0446\u0435\u043d\u0442\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u2014 \u043d\u0443\u043b\u0435\u0432\u0430\u044f \u0442\u043e\u0447\u043a\u0430. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438, \u0441\u043c\u0435\u0441\u0442\u0438\u043c \u043a\u0440\u0430\u0439\u043d\u044e\u044e \u043b\u0435\u0432\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u0432 \u0446\u0435\u043d\u0442\u0440:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f6b\/354\/041\/f6b354041ba02c33dff3c20f713b4b51.svg\" alt=\"$\\vec{p'} = \\begin{pmatrix} f_x \\cdot p_x &amp; f_y \\cdot p_y \\end{pmatrix}^T + \\begin{pmatrix} \\frac{width}{2} &amp; \\frac{height}{2} \\end{pmatrix}^T$\" data-tex=\"inline\"><\/math><br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/12f\/98c\/7f1\/12f98c7f1d62b05ef42b879393c83507.svg\" alt=\"$\\begin{pmatrix} \\frac{width}{2} &amp; \\frac{height}{2} \\end{pmatrix}^T$\" data-tex=\"inline\"><\/math>, \u043a\u0430\u043a \u0435\u0439 \u0438 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e. \u042d\u0442\u0430 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0446\u0435\u043d\u0442\u0440\u043e\u043c, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0438\u043c \u0435\u0435 \u043a\u0430\u043a <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/953\/f0e\/83e\/953f0e83e79d1aab74d1125490bf41b4.svg\" alt=\"$\\vec{c} = \\begin{pmatrix} \\frac{width}{2} &amp; \\frac{height}{2} \\end{pmatrix}^T$\" data-tex=\"inline\"><\/math>. \u0418 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/396\/219\/c5e\/396219c5ec56b0dabd2e39741b3e8f7a.svg\" alt=\"$\\vec{p'} = \\begin{pmatrix} f_x \\cdot p_x &amp; f_y \\cdot p_y \\end{pmatrix}^T + \\vec{c}$\" data-tex=\"inline\"><\/math>, \u0433\u0434\u0435 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/de2\/ee1\/a99\/de2ee1a99dc8c2cfe1dd8ffedb0c3fa8.svg\" alt=\"$f_x = \\frac{width}{2 \\cdot \\tan{\\frac{angle_x}{2}}}, \\space f_y = - f_x$\" data-tex=\"inline\"><\/math>, \u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/953\/f0e\/83e\/953f0e83e79d1aab74d1125490bf41b4.svg\" alt=\"$\\vec{c} = \\begin{pmatrix} \\frac{width}{2} &amp; \\frac{height}{2} \\end{pmatrix}^T$\" data-tex=\"inline\"><\/math>.<br \/>  \u0422\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u043e \u044d\u0442\u043e\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435, \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u0441\u0440\u0430\u0437\u0443 \u0441 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0442\u043e\u0447\u043a\u0438 \u0438 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044f \u0432\u0441\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043c\u0430\u0442\u0440\u0438\u0447\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0443:<br \/>  \u041f\u0443\u0441\u0442\u044c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0bc\/086\/9e0\/0bc0869e07bd8b8aea59af88fabb6b72.svg\" alt=\"$K = \\begin{pmatrix} f_x &amp; 0 &amp; c_x \\\\ 0 &amp; f_y &amp; c_y \\\\ 0 &amp; 0 &amp; 1 \\end{pmatrix}$\" data-tex=\"inline\"><\/math>, \u0442\u043e\u0433\u0434\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/62a\/1b7\/2af\/62a1b72af4d4fc21a2a839437781e27e.svg\" alt=\"$\\vec{p'} = project(K \\cdot \\begin{pmatrix} p_x \\\\ p_y \\\\ 1\\end{pmatrix})$\" data-tex=\"inline\"><\/math>.<br \/>  \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0430\u0437\u0430\u0434. \u0412\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u0443\u0435\u043c. \u0422.\u0435. \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u2014 \u044d\u0442\u043e \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b. \u0422\u043e\u0433\u0434\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0438\u0437 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0438\u0434:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/ea0\/036\/dbc\/ea0036dbc1611f3720bc3cc330c827bb.svg\" alt=\"$\\vec{p'} = project(K \\cdot \\begin{pmatrix} v_x \\\\ v_y \\\\ v_z \\end{pmatrix}) = project(K \\cdot \\vec{v})$\" data-tex=\"inline\"><\/math><br \/>  \u041c\u0430\u0442\u0440\u0438\u0446\u0443 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8b1\/9d8\/49a\/8b19d849a66473b36d68c78d06462129.svg\" alt=\"$K$\" data-tex=\"inline\"><\/math> \u2014 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043a\u0430\u043c\u0435\u0440\u044b (intrinsic camera parameters).<br \/>  \u042d\u0442\u0430 \u043c\u0430\u0440\u0438\u0446\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0438\u043c\u0435\u0442\u044c \u0435\u0449\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e0b\/73f\/147\/e0b73f147c9be6d2ecf6b3019cf5d64c.svg\" alt=\"$s_{skew}$\" data-tex=\"inline\"><\/math>:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1b1\/dcf\/fcd\/1b1dcffcdb8b8318f01c7fa4f8cc0504.svg\" alt=\"$K = \\begin{pmatrix} f_x &amp; s_{skew} &amp; c_x \\\\ 0 &amp; f_y &amp; c_y \\\\ 0 &amp; 0 &amp; 1 \\end{pmatrix}$\" data-tex=\"inline\"><\/math>.<br \/>  \u042d\u0444\u0444\u0435\u043a\u0442 \u043e\u0442 \u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0447\u0435\u043c \u0441\u0445\u043e\u0436 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c \u043e\u0442 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A0%D0%BE%D0%BB%D0%BB%D0%B8%D0%BD%D0%B3-%D1%88%D0%B0%D1%82%D1%82%D0%B5%D1%80\" rel=\"nofollow noopener noreferrer\">rolling shutter<\/a>. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0432\u043d\u043e \u043d\u0443\u043b\u044e.<br \/>  \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/760\/cf4\/71b\/760cf471b94382010656617d8448fcd3.svg\" alt=\"$f_x, f_y, c_x, c_y$\" data-tex=\"inline\"><\/math> \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u044b, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041d\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043d\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u0433\u0434\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/817\/b92\/407\/817b92407f764f57af9226e50cc788fd.svg\" alt=\"$x$\" data-tex=\"inline\"><\/math> \u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9b3\/4c4\/da5\/9b34c4da5c757d4982bbd1b6f2e8998a.svg\" alt=\"$y$\" data-tex=\"inline\"><\/math> \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a5d\/538\/f83\/a5d538f83bd73f9d1c9e8338db9a398a.svg\" alt=\"$[0, 1]$\" data-tex=\"inline\"><\/math>. \u0422\u043e\u0433\u0434\u0430 \u044d\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u0443\u0436\u0435 \u0434\u0440\u0443\u0433\u0438\u043c\u0438.<br \/>  \u041f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0438 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u043a\u0430\u043c\u0435\u0440 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0445 \u0441 \u043d\u0438\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445, \u043e\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0446\u0435\u043d\u0442\u0440 \u0441\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442 \u0446\u0435\u043d\u0442\u0440\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0430 \u043a\u0430\u0436\u0434\u0430\u044f \u043a\u0430\u043c\u0435\u0440\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0433\u043a\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u0436\u0434\u0430\u044f \u043a\u0430\u043c\u0435\u0440\u0430 \u043a\u0430\u043b\u0438\u0431\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u043e. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 <a href=\"https:\/\/docs.opencv.org\/master\/dc\/dbb\/tutorial_py_calibration.html\" rel=\"nofollow noopener noreferrer\">OpenCV<\/a>.<br \/>  \u0412 API Android OS \u0438 iOS \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u0430\u043c\u0435\u0440\u044b, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c.<br \/>  \u0421\u0435\u0439\u0447\u0430\u0441 \u0436\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u043f\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0446\u0435\u043d\u0442\u0440\u043e\u043c \u2014 \u0446\u0435\u043d\u0442\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/29e\/16e\/a14\/29e16ea14774607f7de18d0bbda05ca4.svg\" alt=\"$f_x, f_y$\" data-tex=\"inline\"><\/math> \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0442\u044c &quot;\u043d\u0430 \u0433\u043b\u0430\u0437&quot;. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0445\u0432\u0430\u0442\u0438\u0442 \u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430. <\/p>\n<p>  <\/p>\n<h3 id=\"peremeschenie-kamery-v-prostranstve\">\u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043a\u0430\u043c\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435<\/h3>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u2014 \u0438 \u0445\u043e\u0442\u044f \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435, \u0430 \u043c\u0438\u0440 \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435, \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u043c\u0438\u0440, \u0430 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435. \u041c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435. \u0417\u043d\u0430\u0447\u0438\u0442 \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043b\u044f \u043d\u0430\u0441 \u0443\u0434\u043e\u0431\u043d\u0435\u0435. \u0410 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435, \u0438 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0443\u0441\u0442\u044c \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u0435. \u0414\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0443 \u043d\u0430\u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u043c \u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u2014 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b81\/a7c\/1e9\/b81a7c1e9676b36cc02ddeea5d5f6e51.svg\" alt=\"$R$\" data-tex=\"inline\"><\/math> \u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2a8\/7b9\/2bd\/2a87b92bdc1a96411177c30cc3668ef8.svg\" alt=\"$\\vec{t}$\" data-tex=\"inline\"><\/math>. \u0422\u0430\u043a\u0436\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u0430\u043c\u0435\u0440\u044b, \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8b1\/9d8\/49a\/8b19d849a66473b36d68c78d06462129.svg\" alt=\"$K$\" data-tex=\"inline\"><\/math>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0438\u0437 \u043c\u0438\u0440\u043e\u0432\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043d\u0430 \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430: <\/p>\n<p>  <\/p>\n<ol>\n<li>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u043c\u0438\u0440\u043e\u0432\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/ff5\/059\/671\/ff5059671e83505859d66f0b992edb1d.svg\" alt=\"$\\vec{v}$\" data-tex=\"inline\"><\/math> \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043a\u0430\u043c\u0435\u0440\u044b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/377\/4f1\/9e1\/3774f19e13a03eb66f16a38fa132a15c.svg\" alt=\"$\\vec{v'}$\" data-tex=\"inline\"><\/math> \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b81\/a7c\/1e9\/b81a7c1e9676b36cc02ddeea5d5f6e51.svg\" alt=\"$R$\" data-tex=\"inline\"><\/math> \u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2a8\/7b9\/2bd\/2a87b92bdc1a96411177c30cc3668ef8.svg\" alt=\"$\\vec{t}$\" data-tex=\"inline\"><\/math>: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/9d0\/031\/2dc\/9d00312dc9150880f62dfc59c6bd9119.svg\" alt=\"$\\vec{v'} = R \\cdot \\vec{v} + \\vec{t}$\" data-tex=\"inline\"><\/math><\/li>\n<li>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043a\u0430\u043c\u0435\u0440\u044b \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u044b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8b1\/9d8\/49a\/8b19d849a66473b36d68c78d06462129.svg\" alt=\"$K$\" data-tex=\"inline\"><\/math>: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f08\/6f5\/15f\/f086f515f473579e57d7c9050796dd6a.svg\" alt=\"$\\vec{p} = project(K \\cdot \\vec{v'})$\" data-tex=\"inline\"><\/math><\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u043c\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u043c, \u043c\u0430\u0442\u0440\u0438\u0446\u0443 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b81\/a7c\/1e9\/b81a7c1e9676b36cc02ddeea5d5f6e51.svg\" alt=\"$R$\" data-tex=\"inline\"><\/math> \u0438 \u0432\u0435\u043a\u0442\u043e\u0440 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2a8\/7b9\/2bd\/2a87b92bdc1a96411177c30cc3668ef8.svg\" alt=\"$\\vec{t}$\" data-tex=\"inline\"><\/math> \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0432 \u043e\u0434\u043d\u0443 \u043c\u0430\u0442\u0440\u0438\u0446\u0443, \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0435\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/ff5\/059\/671\/ff5059671e83505859d66f0b992edb1d.svg\" alt=\"$\\vec{v}$\" data-tex=\"inline\"><\/math> \u0432 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/436\/4a3\/b30\/4364a3b3084992d082600f4835729ede.svg\" alt=\"$\\begin{pmatrix} {v'}_x \\\\ {v'}_y \\\\ {v'}_z \\\\ 1 \\end{pmatrix} = \\begin{pmatrix} R_{11} &amp; R_{12} &amp; R_{13} &amp; t_x \\\\ R_{21} &amp; R_{22} &amp; R_{23} &amp; t_y \\\\ R_{31} &amp; R_{32} &amp; R_{33} &amp; t_z \\\\ 0 &amp; 0 &amp; 0 &amp; 1 \\end{pmatrix} \\begin{pmatrix} v_x \\\\ v_y \\\\ v_z \\\\ 1 \\end{pmatrix}$\" data-tex=\"inline\"><\/math><br \/>  \u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/05c\/439\/d37\/05c439d377983befaa3d58c94c025efd.svg\" alt=\"${v'}_w = 1$\" data-tex=\"inline\"><\/math> \u0438 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u0435\u043c \u0447\u0443\u0442\u044c \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0443\u043b\u0443:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6c8\/45a\/5e8\/6c845a5e841552195017057df29dac0b.svg\" alt=\"$\\begin{pmatrix} {v'}_x \\\\ {v'}_y \\\\ {v'}_z \\end{pmatrix} = \\begin{pmatrix} R_{11} &amp; R_{12} &amp; R_{13} &amp; t_x \\\\ R_{21} &amp; R_{22} &amp; R_{23} &amp; t_y \\\\ R_{31} &amp; R_{32} &amp; R_{33} &amp; t_z\\end{pmatrix} \\begin{pmatrix} v_x \\\\ v_y \\\\ v_z \\\\ 1 \\end{pmatrix}$\" data-tex=\"inline\"><\/math><br \/>  \u0411\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u044d\u0442\u043e\u0439 \u0436\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u044b:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/db5\/4e8\/67b\/db54e867bab493a770a8b35c271ac6eb.svg\" alt=\"$\\vec{v'} = [R | \\vec{t}] \\begin{pmatrix} \\vec{v} \\\\ 1 \\end{pmatrix}$\" data-tex=\"inline\"><\/math><br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0434\u0432\u0430 \u044d\u0442\u0430\u043f\u0430 \u0432 \u043e\u0434\u043d\u0443 \u0444\u043e\u0440\u043c\u0443\u043b\u0443:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/838\/6d9\/85e\/8386d985ebc36ba367b2407dee151d79.svg\" alt=\"$\\vec{p} = project(K \\cdot [R | \\vec{t}] \\begin{pmatrix} \\vec{v} \\\\ 1 \\end{pmatrix})$\" data-tex=\"inline\"><\/math><br \/>  \u041a \u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441 \u043f\u043e\u0437\u0434\u0440\u0430\u0432\u0438\u0442\u044c \u2014 \u043c\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b. \u041e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u043d\u0435\u0435 \u0434\u0430\u043b\u0435\u0435 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u0435. \u0410 \u0442\u043e\u0447\u043d\u0435\u0435 \u043d\u0430\u0448\u0435\u0439 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b81\/a7c\/1e9\/b81a7c1e9676b36cc02ddeea5d5f6e51.svg\" alt=\"$R$\" data-tex=\"inline\"><\/math> \u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2a8\/7b9\/2bd\/2a87b92bdc1a96411177c30cc3668ef8.svg\" alt=\"$\\vec{t}$\" data-tex=\"inline\"><\/math>. \u042d\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043a\u0430\u043c\u0435\u0440\u044b (extrinsic camera parameters). \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438, \u0447\u0442\u043e \u043a\u0430\u043c\u0435\u0440\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435, \u0430 \u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0438\u0439 \u043c\u0438\u0440, \u0442\u043e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b81\/a7c\/1e9\/b81a7c1e9676b36cc02ddeea5d5f6e51.svg\" alt=\"$R$\" data-tex=\"inline\"><\/math> \u2014 \u044d\u0442\u043e \u043d\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0441\u0430\u043c\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b, \u0430 \u0432\u0435\u043a\u0442\u043e\u0440 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2a8\/7b9\/2bd\/2a87b92bdc1a96411177c30cc3668ef8.svg\" alt=\"$\\vec{t}$\" data-tex=\"inline\"><\/math> \u2014 \u043d\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u0430\u043c\u0435\u0440\u044b. \u041c\u0430\u0442\u0440\u0438\u0446\u0430 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b81\/a7c\/1e9\/b81a7c1e9676b36cc02ddeea5d5f6e51.svg\" alt=\"$R$\" data-tex=\"inline\"><\/math> \u2014 \u044d\u0442\u043e \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0438\u0437 \u043c\u0438\u0440\u043e\u0432\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043a\u0430\u043c\u0435\u0440\u044b, \u0430 \u043a\u043e\u0433\u0434\u0430 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0442\u043e \u0438\u043c\u0435\u044e\u0442 \u0432\u0432\u0438\u0434\u0443 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u043c\u0438\u0440\u043e\u0432\u044b\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0432\u043e\u0440\u043e\u0442 \u043a\u0430\u043c\u0435\u0440\u044b \u2014 \u044d\u0442\u043e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d9f\/6db\/c16\/d9f6dbc1690c3a80114ad162b9562e34.svg\" alt=\"$R_{camera} = R^{-1}$\" data-tex=\"inline\"><\/math>. \u0412\u0435\u043a\u0442\u043e\u0440 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2a8\/7b9\/2bd\/2a87b92bdc1a96411177c30cc3668ef8.svg\" alt=\"$\\vec{t}$\" data-tex=\"inline\"><\/math> \u2014 \u0432\u0435\u043a\u0442\u043e\u0440 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b. \u041f\u043e\u0437\u0438\u0446\u0438\u044e \u043a\u0430\u043c\u0435\u0440\u044b \u0432 \u043c\u0438\u0440\u043e\u0432\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0439\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u044f \u0442\u0430\u043a\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0435: \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u0442\u0430\u0442\u044c \u043d\u0443\u043b\u0435\u0432\u044b\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u2014 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6aa\/46d\/2a3\/6aa46d2a3130ffa4353a9c8852b3e687.svg\" alt=\"$\\vec{0} = R \\cdot \\vec{pos_{camera}} + \\vec{t} \\space \\Rightarrow \\space (\\vec{0} - \\vec{t}) = R \\cdot \\vec{pos_{camera}} \\space \\Rightarrow \\space \\vec{pos_{camera}} = - R^{-1} \\cdot \\vec{t}$\" data-tex=\"inline\"><\/math>. <\/p>\n<p>  <\/p>\n<h3 id=\"poluchaem-koordinaty-kamery-ot-markera\">\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043a\u0430\u043c\u0435\u0440\u044b \u043e\u0442 \u043c\u0430\u0440\u043a\u0435\u0440\u0430<\/h3>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u0443. \u0412 \u043d\u0435\u043c \u043c\u044b \u043d\u0430\u0448\u043b\u0438 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/bd2\/36a\/859\/bd236a859d121c85d92d1acf80ba3597.svg\" alt=\"$H$\" data-tex=\"inline\"><\/math>, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u0442\u043e\u0447\u0435\u043a:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/c4c\/97a\/748\/c4c97a7481dd89195f885c6630fdd7bf.svg\" alt=\"$\\vec{p_i} = project(H \\cdot \\begin{pmatrix} {v_i}_x \\\\ {v_i}_y \\\\ 1 \\end{pmatrix})$\" data-tex=\"inline\"><\/math><br \/>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u044d\u0442\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u0441\u043e\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u0441 \u043d\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a49\/96a\/305\/a4996a30505c78603f12ecfc218c2230.svg\" alt=\"$\\vec{p} = project(K \\cdot [R | \\vec{t}] \\begin{pmatrix} \\vec{v} \\\\ 1 \\end{pmatrix}) = project(K \\cdot \\begin{pmatrix} R_{11} &amp; R_{12} &amp; R_{13} &amp; t_x \\\\ R_{21} &amp; R_{22} &amp; R_{23} &amp; t_y \\\\ R_{31} &amp; R_{32} &amp; R_{33} &amp; t_z \\end{pmatrix} \\begin{pmatrix} v_x \\\\ v_y \\\\ v_z \\\\ 1 \\end{pmatrix})$\" data-tex=\"inline\"><\/math><br \/>  \u0422\u043e\u0447\u043a\u0438 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u0432\u0441\u0435 \u043b\u0435\u0436\u0430\u0442 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0442.\u0435. <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/905\/549\/0d4\/9055490d491eaeb253f42ff3e33eebd6.svg\" alt=\"$v_z = 0$\" data-tex=\"inline\"><\/math>. \u0410 \u0442\u0430\u043a \u043a\u0430\u043a <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/905\/549\/0d4\/9055490d491eaeb253f42ff3e33eebd6.svg\" alt=\"$v_z = 0$\" data-tex=\"inline\"><\/math>, \u0442\u043e \u0441\u0442\u043e\u043b\u0431\u0435\u0446 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6d4\/7cb\/fbe\/6d47cbfbe1b260a9bc9a519911a3465b.svg\" alt=\"$\\begin{pmatrix} R_{13} \\\\ R_{23} \\\\ R_{33} \\end{pmatrix}$\" data-tex=\"inline\"><\/math> \u043d\u0435 \u0432\u043d\u043e\u0441\u0438\u0442 \u0432\u043a\u043b\u0430\u0434\u0430 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044c, \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0432 \u0444\u043e\u0440\u043c\u0443\u043b\u0443:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7e7\/0e8\/4b1\/7e70e84b13663bdd1be48580be34892b.svg\" alt=\"$\\vec{p} = project(K \\cdot \\begin{pmatrix} R_{11} &amp; R_{12} &amp; t_x \\\\ R_{21} &amp; R_{22} &amp; t_y \\\\ R_{31} &amp; R_{32} &amp; t_z \\end{pmatrix} \\begin{pmatrix} v_x \\\\ v_y \\\\ 1 \\end{pmatrix})$\" data-tex=\"inline\"><\/math><br \/>  \u041f\u0443\u0441\u0442\u044c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/15c\/e40\/f83\/15ce40f837c6eb3cc5ff69800b9af990.svg\" alt=\"$H' = K \\cdot \\begin{pmatrix} R_{11} &amp; R_{12} &amp; t_x \\\\ R_{21} &amp; R_{22} &amp; t_y \\\\ R_{31} &amp; R_{32} &amp; t_z \\end{pmatrix}$\" data-tex=\"inline\"><\/math>, \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5cc\/b76\/070\/5ccb76070f757cb2a6903604e4942732.svg\" alt=\"$\\vec{p_i} = project(H' \\cdot \\begin{pmatrix} {v_i}_x \\\\ {v_i}_y \\\\ 1 \\end{pmatrix})$\" data-tex=\"inline\"><\/math><br \/>  \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0443\u043b\u0443. \u041d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434, \u0447\u0442\u043e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/31a\/8c9\/679\/31a8c96796e1103aa8edff6a382ca8e3.svg\" alt=\"$H' = H$\" data-tex=\"inline\"><\/math> \u2014 \u043d\u0435\u043b\u044c\u0437\u044f. \u041f\u0440\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u044b <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/bd2\/36a\/859\/bd236a859d121c85d92d1acf80ba3597.svg\" alt=\"$H$\" data-tex=\"inline\"><\/math> \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0446\u0435\u043b\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0438 \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0443\u0434\u043e\u0431\u043d\u043e\u0435 \u0434\u043b\u044f \u043d\u0430\u0441. \u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u043a\u0430\u043b\u044f\u0440 \u043d\u0435 \u0438\u0433\u0440\u0430\u0435\u0442 \u0440\u043e\u043b\u0438, \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u044b \u0443\u0436\u0435 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u0435\u0432\u043a\u043b\u0438\u0434\u043e\u0432\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/540\/edd\/d58\/540eddd5850f79f12ed92b4ca1a73dbf.svg\" alt=\"$s \\cdot H' = H$\" data-tex=\"inline\"><\/math>. \u041e\u0442\u0441\u044e\u0434\u0430:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/2bf\/831\/90d\/2bf83190db1c97b8b5f4adee10aef32f.svg\" alt=\"$H = s \\cdot K [R | \\vec{t}] = K \\cdot \\begin{pmatrix} s \\cdot R_{11} &amp; s \\cdot R_{12} &amp; s \\cdot t_x \\\\ s \\cdot R_{21} &amp; s \\cdot R_{22} &amp; s \\cdot t_y \\\\ s \\cdot R_{31} &amp; s \\cdot R_{32} &amp; s \\cdot t_z \\end{pmatrix}$\" data-tex=\"inline\"><\/math>.<br \/>  \u041f\u0443\u0441\u0442\u044c <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/060\/543\/9c8\/0605439c84e8d39cf1f0afd11644e222.svg\" alt=\"$T = K^{-1} \\cdot H = \\begin{pmatrix} s \\cdot R_{11} &amp; s \\cdot R_{12} &amp; s \\cdot t_x \\\\ s \\cdot R_{21} &amp; s \\cdot R_{22} &amp; s \\cdot t_y \\\\ s \\cdot R_{31} &amp; s \\cdot R_{32} &amp; s \\cdot t_z \\end{pmatrix} = K^{-1} \\cdot H$\" data-tex=\"inline\"><\/math><br \/>  \u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0430 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0434\u0432\u0430 \u0431\u0430\u0437\u0438\u0441\u043d\u044b\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430. \u0414\u043b\u0438\u043d\u044b \u044d\u0442\u0438\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u044b \u0435\u0434\u0438\u043d\u0438\u0446\u0435. \u041e\u0442\u0441\u044e\u0434\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0439\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a46\/bde\/60b\/a46bde60bcdea0c9dfbd73448897be96.svg\" alt=\"$s = |\\begin{pmatrix} T_{11} &amp; T_{21} &amp; T_{31} \\end{pmatrix}^T| = |\\begin{pmatrix} T_{12} &amp; T_{22} &amp; T_{32} \\end{pmatrix}^T|$\" data-tex=\"inline\"><\/math>. \u0418\u0437-\u0437\u0430 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0435\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0443\u0442 \u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438: <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/944\/078\/102\/9440781023afdc0c0a0bd9972fa42ef0.svg\" alt=\"$s = \\frac{|\\begin{pmatrix} T_{11} &amp; T_{21} &amp; T_{31} \\end{pmatrix}^T| + |\\begin{pmatrix} T_{12} &amp; T_{22} &amp; T_{32} \\end{pmatrix}^T|}{2}$\" data-tex=\"inline\"><\/math>.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043c \u0434\u0432\u0430 \u0431\u0430\u0437\u0438\u0441\u043d\u044b\u0445 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430:<br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/24d\/02f\/e1f\/24d02fe1f856a2d5f9fbe6b5b539c96d.svg\" alt=\"$\\vec{r_1} = \\frac{\\begin{pmatrix} T_{11} &amp; T_{21} &amp; T_{31} \\end{pmatrix}^T}{|\\begin{pmatrix} T_{11} &amp; T_{21} &amp; T_{31} \\end{pmatrix}^T|}$\" data-tex=\"inline\"><\/math><br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/cda\/6bb\/f87\/cda6bbf8793a85747e03d5b79d301e6f.svg\" alt=\"$\\vec{r_2} = \\frac{\\begin{pmatrix} T_{12} &amp; T_{22} &amp; T_{32} \\end{pmatrix}^T}{|\\begin{pmatrix} T_{12} &amp; T_{22} &amp; T_{32} \\end{pmatrix}^T|}$\" data-tex=\"inline\"><\/math><br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5a2\/76b\/569\/5a276b569388bd8e376be9228b82496f.svg\" alt=\"$R = \\begin{pmatrix} \\vec{r_1} &amp; \\vec{r_2} &amp; \\vec{r_1} \\times \\vec{r_2} \\end{pmatrix}$\" data-tex=\"inline\"><\/math><br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/764\/630\/b85\/764630b855c70f4641655676df565951.svg\" alt=\"$\\vec{t} = \\frac{\\begin{pmatrix} T_{13} &amp; T_{23} &amp; T_{33} \\end{pmatrix}^T}{s}$\" data-tex=\"inline\"><\/math><br \/>  <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/fa0\/be9\/790\/fa0be97907f28d3860d2381918251770.svg\" alt=\"$R_{camera} = R^{-1}, \\space \\vec{pos_{camera}} = - R^{-1} \\cdot \\vec{t}$\" data-tex=\"inline\"><\/math><br \/>  \u0418\u0442\u0430\u043a, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043a\u0430\u043c\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u044d\u0442\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u043e\u043c\u0443 \u0434\u0432\u0438\u0436\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0432\u044b\u0432\u0435\u043b \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e\u0432\u0435\u0440\u0445 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0427\u0442\u043e \u0438 \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0435 \u0434\u043b\u044f Unity. \u0412\u0438\u0434\u0435\u043e, \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0441 android-\u0441\u043c\u0430\u0442\u0444\u043e\u043d\u0430: <\/p>\n<p>  <\/p>\n<div class=\"oembed\"><iframe allowfullscreen id=\"6055d6c795bc5d2dedbee1d6\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/6055d6c795bc5d2dedbee1d6\"><\/iframe><\/div>\n<p>  <\/p>\n<p>\u0422\u043e\u0447\u043a\u0438 \u043c\u0430\u0440\u043a\u0435\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0448\u0443 \u043c\u0438\u0440\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u043d\u0430\u0448\u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445 \u0438 \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0448\u0438\u043c \u043f\u043e\u043b\u043e\u043c, \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/015\/9be\/388\/0159be38859190b65929d4fdc856f8b2.svg\" alt=\"$XY$\" data-tex=\"inline\"><\/math>. \u0423 Unity \u0436\u0435 \u043f\u043e\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c\u044e <math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a52\/a04\/7d3\/a52a047d302e6970c2099622dd002abb.svg\" alt=\"$XZ$\" data-tex=\"inline\"><\/math>. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043e\u043b \u0432 \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u044f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0432 Unity \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u2014 \u0441\u043e\u0437\u0434\u0430\u043b \u043f\u0443\u0441\u0442\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u043b \u0435\u0433\u043e &quot;\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c&quot; \u043a\u0430\u043c\u0435\u0440\u044b, \u0438 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u043b \u0442\u0430\u043a, \u043a\u0430\u043a \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u043d\u0435 \u0441\u0430\u043c\u043e\u043c\u0443 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u0422\u0430\u043a\u0436\u0435 \u0432\u0430\u0436\u043d\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b \u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439. \u041f\u0440\u0438\u043c\u0435\u0440 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/DistinctVision\/sonar\/blob\/article2\/UnityProject\/Assets\/Scripts\/SonarCameraController.cs\" rel=\"nofollow noopener noreferrer\">\u043a\u043e\u0434\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041d\u0443\u0436\u043d\u043e \u0435\u0449\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u0447\u0435\u043a \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 3&#215;3 \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u0438\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u0435\u043a \u0441 \u043e\u0434\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e. \u0422\u0430\u043a\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u0433\u043e\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 (homography matrix). \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0448\u043b\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438. \u041d\u043e \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c direct linear transformation \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043a\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b.<\/p>\n<p>  <\/p>\n<h2 id=\"zaklyuchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u041a\u043e\u0434, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u0432\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u044b\u0448\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431 \u0432 \u0432\u0435\u0442\u043a\u0435 <a href=\"https:\/\/github.com\/DistinctVision\/sonar\/tree\/article2\" rel=\"nofollow noopener noreferrer\">article2<\/a>.<br \/>  \u0422\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0436\u0435\u043b\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435\u0433\u043e. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435 \u0441\u0430\u043c\u043e\u043c \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u043e\u0439\u0442\u0438 \u043e\u0442 \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0443\u043b\u0443\u0447\u0448\u0430\u0442\u044c \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/547898\/\"> https:\/\/habr.com\/ru\/post\/547898\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ij\/ug\/-q\/ijug-qx9e20ukcinxlhjks_vixu.png\"><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440.<br \/>  \u041f\u043e \u043c\u0435\u0440\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f <a href=\"https:\/\/github.com\/DistinctVision\/sonar\" rel=\"nofollow noopener noreferrer\">\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/a> \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0447\u0443 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443, \u043b\u0435\u0436\u0430\u0449\u0435\u0439 \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435 Unity, \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u044e\u0449\u0438\u0439 \u043c\u0430\u0440\u043a\u0435\u0440 \u0438 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043d\u0435\u0433\u043e \u0442\u0440\u0435\u0445\u043c\u0435\u0440\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0443. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043d\u0430 C++ \u043f\u043e\u0434 Android, \u043d\u043e \u0444\u043e\u043a\u0443\u0441 \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u043d\u0430 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0443. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 <a href=\"https:\/\/habr.com\/ru\/post\/547876\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439<\/a>, \u0431\u0443\u0434\u0435\u0442 \u0431\u043b\u0438\u0436\u0435 \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u043d\u043e \u0435\u0441\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u0441\u043d\u043e\u0432\u0430\u043c\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u043d\u0435\u0435. <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-320122","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/320122","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=320122"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/320122\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=320122"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=320122"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=320122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}