{"id":269682,"date":"2015-12-05T11:30:01","date_gmt":"2015-12-05T08:30:01","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=269682"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=269682","title":{"rendered":"\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u043e\u043a\u043e\u043f\u0442\u0435\u0440 \u043d\u0430 Unity + OpenCV (\u0427\u0430\u0441\u0442\u044c 3)"},"content":{"rendered":"<p>       <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/615\/d6d\/2af\/615d6d2af5d64a1b8ee955dae6e5aef8.png\" alt=\"\u041a\u041f\u0414\u0412\"\/><\/p>\n<p>  \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!<\/p>\n<p>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0441\u0435\u0440\u0438\u044e \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c Unity, C++ \u0438 OpenCV. \u0410 \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0433\u043e \u0437\u0440\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0434\u0440\u043e\u043d\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Unity. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043e \u0442\u043e\u043c, <a href=\"http:\/\/habrahabr.ru\/post\/267791\/\">\u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u043e\u043a\u043e\u043f\u0442\u0435\u0440 \u0432 Unity<\/a> \u0438 <a href=\"http:\/\/habrahabr.ru\/post\/269007\/\">\u043a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c C++ \u043f\u043b\u0430\u0433\u0438\u043d, \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c OpenCV<\/a>. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u0430\u043c\u0435\u0440 \u043d\u0430 \u043a\u0432\u0430\u0434\u0440\u043e\u043a\u043e\u043f\u0442\u0435\u0440\u0435 \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u0443 \u0438 \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 (disparity map), \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h4>\u0418\u0434\u0435\u044f<\/h4>\n<p>  \u041e \u0442\u043e\u043c, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c 3\u0434 \u0440\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0435 \u043c\u0430\u043b\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0441\u0442\u044c <a href=\"http:\/\/habrahabr.ru\/post\/130300\/\">\u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430 \u0445\u0430\u0431\u0440\u0435<\/a>. \u041e\u0447\u0435\u043d\u044c \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0435\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0432 \u0442\u0435\u043c\u0435. \u0411\u043e\u043b\u0435\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0442\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/www.robots.ox.ac.uk\/~vgg\/hzbook\/\">\u0442\u0443\u0442<\/a>. \u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u044f \u043e\u043e\u043e\u0447\u0435\u043d\u044c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e \u0438\u0437\u043b\u043e\u0436\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0438\u0434\u0435\u044e. \u0422\u0435\u0445\u043d\u0438\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u044b \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043b\u043e\u0442\u043d\u0430\u044f 3\u0434 \u0440\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f (dense 3d reconstruction) \u043f\u043e \u0434\u0432\u0443\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0434\u0432\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0440\u044f\u0434\u043e\u043c \u0438 \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u043e\u0434\u043d\u0443 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043a\u0430\u043c\u0435\u0440\u044b \u0432\u0438\u0434\u044f\u0442 \u043e\u0434\u043d\u0443 \u0441\u0446\u0435\u043d\u0443 \u0441 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0442\u043e\u0447\u0435\u043a \u0437\u0440\u0435\u043d\u0438\u044f. \u041d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D1%82%D0%B5%D1%80%D0%B5%D0%BE%D0%BF%D0%B0%D1%80%D0%B0\">\u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u0430<\/a>. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u044b, \u0441\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u043f\u0435\u043d\u0434\u0438\u043a\u0443\u043b\u044f\u0440\u043d\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u00ab\u0437\u0440\u0435\u043d\u0438\u044f\u00bb \u043a\u0430\u043c\u0435\u0440\u044b. \u0415\u0441\u043b\u0438 \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0438 \u0432\u0442\u043e\u0440\u043e\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0442\u043e\u0447\u043a\u0443 \u0441\u0446\u0435\u043d\u044b, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u0439\u0442\u0438 \u0434\u0432\u0435 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0442\u043e\u0447\u043a\u0438 \u0441\u0446\u0435\u043d\u044b, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e, \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0439 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u044b \u0434\u0440\u0443\u0433 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433\u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043d\u0438\u043c\u043a\u043e\u0432. \u042d\u0442\u043e \u0438 \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u0442\u043e\u0447\u043a\u0438 \u0441\u0446\u0435\u043d\u044b \u043f\u043e \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f (\u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e: \u0442\u043e\u0447\u043a\u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0431\u043b\u0438\u0436\u0435 \u0442\u043e\u0447\u0435\u043a \u0441\u043c\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u043d\u044c\u0448\u0435).<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/d80\/b6c\/a3f\/d80b6ca3fc0f4a72a81557e2c9859ff5.jpg\" alt=\"\u0421\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u0430 \u0438 \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0442\u043e\u0447\u0435\u043a\"\/><br \/>  \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 <a href=\"http:\/\/www.adept.net.au\/news\/newsletter\/201211-nov\/article_3D_stereo.shtml\">www.adept.net.au\/news\/newsletter\/201211-nov\/article_3D_stereo.shtml<\/a><\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u044b. \u0414\u0430\u043b\u0435\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u0443, \u0443\u0431\u0440\u0430\u0442\u044c <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%94%D0%B8%D1%81%D1%82%D0%BE%D1%80%D1%81%D0%B8%D1%8F\">\u0434\u0438\u0441\u0442\u043e\u0440\u0441\u0438\u044e<\/a> \u0438 \u0432\u044b\u043f\u0440\u044f\u043c\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u0447\u0442\u043e\u0431\u044b \u0442\u0435 \u0441\u0430\u043c\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0442\u043e\u0447\u043a\u0438 \u043b\u0435\u0436\u0430\u043b\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u044f\u043c\u043e\u0439. \u042d\u0442\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043b\u043e\u0442\u043d\u043e\u0439 3\u0434 \u0440\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u0437 OpenCV, \u0443\u0441\u043a\u043e\u0440\u044f\u044e\u0449\u0435\u0435 \u043f\u043e\u0438\u0441\u043a \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0442\u043e\u0447\u0435\u043a. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0441\u0430\u043c\u044b\u0439 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438\u0437 OpenCV \u2014 StereoBM. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0410\u041f\u0418 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f <a href=\"http:\/\/docs.opencv.org\/3.0-beta\/modules\/calib3d\/doc\/camera_calibration_and_3d_reconstruction.html\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c.<\/p>\n<h4>\u041a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0430 \u043a\u0430\u043c\u0435\u0440<\/h4>\n<p>  \u041a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u043a\u0430\u043c\u0435\u0440\u0443 \u043d\u0430 \u043a\u0432\u0430\u0434\u0440\u043e\u043a\u043e\u043f\u0442\u0435\u0440 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441 \u043d\u0435\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0435\u0434\u0438\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \u043a\u0430\u043c\u0435\u0440. \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0434\u0432\u0435 \u043a\u0430\u043c\u0435\u0440\u044b \u0441 \u0443\u0433\u043b\u043e\u043c \u043e\u0431\u0437\u043e\u0440\u0430 (field of view) 70 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432, \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441 \u043a\u0430\u043c\u0435\u0440 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c 512 x 512 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u041e\u0442\u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443 \u2014 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 3\u04453 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u0432\u0435\u043a\u0442\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0435\u0435 \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0439. \u041a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0443\u0442\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u044b\u0445 \u0441\u044d\u043c\u043f\u043b\u043e\u0432. \u041e\u0434\u0438\u043d \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0441\u044d\u043c\u043f\u043b \u2014 \u044d\u0442\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u0435\u043a \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u0441 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0435\u0439 \u0432 \u0434\u0432\u0443\u0445\u043c\u0435\u0440\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043e\u0442\u0441\u0447\u0435\u0442\u0430 \u0441\u043d\u0438\u043c\u043a\u0430 \u043a\u0430\u043c\u0435\u0440\u044b. \u041e\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0430 \u0432\u0441\u0435\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u0442\u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u044b. \u042f \u043a\u0430\u043b\u0438\u0431\u0440\u0443\u044e \u043f\u043e 40-50 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u044b\u043c \u0441\u044d\u043c\u043f\u043b\u0430\u043c, \u043f\u0440\u0438\u0447\u0435\u043c, \u0432\u0430\u0436\u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0432\u0430\u0440\u0438\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u044b\u0445 \u0441\u044d\u043c\u043f\u043b\u043e\u0432, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0440\u0430\u0437\u0431\u0440\u043e\u0441 \u043f\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u043c \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u043c \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u0430\u043c\u0435\u0440\u044b. \u041f\u0440\u0435\u0434\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0447\u0442\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 50 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u044b\u0445 \u0441\u044d\u043c\u043f\u043b\u043e\u0432 \u0434\u0430\u0441\u0442 \u043d\u0435\u0432\u044b\u0441\u043e\u043a\u043e\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \u043a\u0430\u043c\u0435\u0440\u044b. \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <a href=\"http:\/\/docs.opencv.org\/2.4\/_downloads\/pattern.png\">\u044d\u0442\u043e\u0442 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u043f\u0435\u0442\u0442\u0430\u0440\u043d<\/a>. \u0415\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u0440\u0430\u0433-\u044d\u043d-\u0434\u0440\u043e\u043f\u043d\u0443\u0442\u044c \u0432 Unity \u0438 \u0437\u0430\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0443\u0440\u043e\u0439 \u0434\u043b\u044f 2\u0434 \u0441\u043f\u0440\u0430\u0439\u0442\u0430. \u0412\u0441\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u044f \u0437\u0430\u0434\u0430\u044e \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445, \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 167 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u0414\u043b\u044f \u043d\u0435\u0433\u043e \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0435\u0433\u043e \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0432 OpenCV. \u0414\u043b\u044f \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 opencv-source\/samples\/cpp\/calibration.cpp. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044f \u0442\u0430\u043a \u0438 \u0441\u0434\u0435\u043b\u0430\u043b.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>\/** @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u0449\u0435\u0442 \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043d\u0430\u0448 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0438 \t\u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430. \tSize boardSize (9, 6) - \u044d\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432 \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438 \u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438, \t\u0432 sampleFound \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0431\u044b\u043b \u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 *\/ void CameraCalibrator::findSample (const cv::Mat& img) {  \tcurrentSamplePoints.clear();  \tint chessBoardFlags = CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_NORMALIZE_IMAGE; \tsampleFound = findChessboardCorners( img, boardSize, currentSamplePoints, chessBoardFlags); \tcurrentImage = &img; }  bool CameraCalibrator::isSampleFound () { \treturn sampleFound; }  \/** @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u044d\u043c\u043f\u043b\u0430 *\/ void CameraCalibrator::acceptSample () { \t\/\/ \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u044d\u043c\u043f\u043b\u0430 \tMat viewGray; \tcvtColor(*currentImage, viewGray, COLOR_BGR2GRAY); \tcornerSubPix( viewGray, currentSamplePoints, Size(11,11), \tSize(-1,-1), TermCriteria( TermCriteria::EPS+TermCriteria::COUNT, 30, 0.1 )); \t \t\/\/ \u0440\u0438\u0441\u0443\u0435\u0442 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 (\u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u044b\u043b\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043e) \tdrawChessboardCorners(*currentImage, boardSize, Mat(currentSamplePoints), sampleFound); \t \t\/\/\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0441\u044d\u043c\u043f\u043b \tsamplesPoints.push_back(currentSamplePoints); }  \/** @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 *\/ void CameraCalibrator::makeCalibration () { \tvector&lt;Mat&gt; rvecs, tvecs; \tvector&lt;float&gt; reprojErrs; \tdouble totalAvgErr = 0; \t\/\/\u043c\u044b \u0437\u043d\u0430\u0435\u043c \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u0430\u044f \t\/\/\u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043d\u0435 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u0430\u0442\u044c, \t\/\/\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043a\u0430\u043c\u0435\u0440\u0430\u0445, \u0435\u0435 \u0442\u043e\u0436\u0435 \t\/\/\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u043b\u0430\u0433\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \t\/\/\u043c\u043e\u0436\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \tfloat aspectRatio = 1.0; \tint flags = CV_CALIB_FIX_ASPECT_RATIO;  \tbool ok = runCalibration(samplesPoints, imageSize, boardSize, squareSize,                         aspectRatio, flags, cameraMatrix, distCoeffs,                         rvecs, tvecs, reprojErrs, totalAvgErr); \t \t\/\/ \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0432 \u043b\u043e\u0433 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \tstringstream sstr; \tsstr &lt;&lt; &quot;--- calib result: &quot; &lt;&lt; (ok ? &quot;Calibration succeeded&quot; : &quot;Calibration failed&quot;) &lt;&lt; &quot;. avg reprojection error = &quot; &lt;&lt; totalAvgErr; \tDebugLog(sstr.str()); \t \tsaveCameraParams(imageSize, boardSize, squareSize, aspectRatio, flags, cameraMatrix, distCoeffs, rvecs, tvecs, reprojErrs, samplesPoints, totalAvgErr); }  \/** @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u0441\u0447\u0435\u0442\u0430 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 *\/ void calcChessboardCorners(Size boardSize, float squareSize, vector&lt;Point3f&gt;& corners) { \tcorners.resize(0); \tfor( int i = 0; i &lt; boardSize.height; ++i ) \t\tfor( int j = 0; j &lt; boardSize.width; ++j ) \t\t\tcorners.push_back(Point3f(j*squareSize, i*squareSize, 0)); }  \/** @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0430\u044f \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0443 *\/ bool runCalibration( \tvector&lt;vector&lt;Point2f&gt; &gt; imagePoints, \tSize imageSize, Size boardSize, \tfloat squareSize, float aspectRatio, \tint flags, Mat& cameraMatrix, Mat& distCoeffs, \tvector&lt;Mat&gt;& rvecs, vector&lt;Mat&gt;& tvecs, \tvector&lt;float&gt;& reprojErrs, \tdouble& totalAvgErr ) { \t\/\/\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u044b \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 \tcameraMatrix = Mat::eye(3, 3, CV_64F); \tif( flags & CALIB_FIX_ASPECT_RATIO ) \tcameraMatrix.at&lt;double&gt;(0,0) = aspectRatio;  \t\/\/\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432 \u0434\u0438\u0441\u0442\u043e\u0440\u0441\u0438\u0438 \tdistCoeffs = Mat::zeros(8, 1, CV_64F);  \t\/\/\u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u0435\u043a \u043d\u0430 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u043e\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0435 \t\/\/\u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \t\/\/\u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \tvector&lt;vector&lt;Point3f&gt; &gt; objectPoints(1); \tcalcChessboardCorners(boardSize, squareSize, objectPoints[0]);  \tobjectPoints.resize(imagePoints.size(),objectPoints[0]);  \t\/\/\u0432\u044b\u0437\u043e\u0432 OpenCV \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \t\/\/objectPoints - \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044f \u043a\u0430\u043b\u0438\u0440\u043e\u0432\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \t\/\/imagePoints - \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u044b\u0435 \u0441\u044d\u043c\u043f\u043b\u044b \t\/\/imageSize - \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b \tdouble rms = calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix,                     distCoeffs, rvecs, tvecs, flags|CALIB_FIX_K4|CALIB_FIX_K5);                     \/\/\/*|CALIB_FIX_K3*\/|CALIB_FIX_K4|CALIB_FIX_K5); \t \t\/\/rms - \u043e\u0446\u0435\u043d\u043a\u0430 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438, \u043f\u0440\u0438 \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0435, \t\/\/\u043f\u0440\u0438 \u0437\u0430\u0434\u0430\u043d\u0438\u0438 \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u0430\u0445, \u0434\u043e\u043b\u0436\u043d\u043e \u043e\u043a\u043e\u043b\u043e 1 \tprintf(&quot;RMS error reported by calibrateCamera: %g\\n&quot;, rms);  \tbool ok = checkRange(cameraMatrix) && checkRange(distCoeffs);  \ttotalAvgErr = computeReprojectionErrors(objectPoints, imagePoints,                 rvecs, tvecs, cameraMatrix, distCoeffs, reprojErrs);  \treturn ok; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<h4>\u0421\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u0430<\/h4>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u0434\u0432\u0443\u0445 \u043a\u0430\u043c\u0435\u0440 \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"http:\/\/docs.opencv.org\/3.0-beta\/modules\/calib3d\/doc\/camera_calibration_and_3d_reconstruction.html#stereocalibrate\">stereoCalibrate<\/a>. \u0414\u043b\u044f \u043d\u0435\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0441\u044d\u043c\u043f\u043b\u044b \u043e\u0431\u0435\u0438\u0445 \u043a\u0430\u043c\u0435\u0440. \u041c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0441\u044d\u043c\u043f\u043b\u0430\u043c\u0438 \u0432\u0437\u044f\u0442\u044b\u043c\u0438 \u0441 \u0448\u0430\u0433\u0430 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \u043a\u0430\u043c\u0435\u0440. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0430\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u0441\u044d\u043c\u043f\u043b\u044b, \u0433\u0434\u0435 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0431\u0430\u043b \u043d\u0430\u0439\u0434\u0435\u043d \u043d\u0430 \u0434\u0432\u0443\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u0441\u0440\u0430\u0437\u0443. \u041c\u0430\u0442\u0440\u0438\u0446\u044b \u043a\u0430\u043c\u0435\u0440 \u0438 \u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u0438\u0441\u0442\u043e\u0440\u0441\u0438\u0438 \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u044f.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u044b<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>\/** @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0430\u044f \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0443 \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u044b *\/ void StereoCalibrator::makeCalibration ( \tconst std::vector&lt;std::vector&lt;cv::Point2f&gt;&gt;& camera1SamplesPoints, \tconst std::vector&lt;std::vector&lt;cv::Point2f&gt;&gt;& camera2SamplesPoints, \tcv::Mat& camera1Matrix, \tcv::Mat& camera1DistCoeffs, \tcv::Mat& camera2Matrix, \tcv::Mat& camera2DistCoeffs ) {  \t\/\/\u0441\u043d\u043e\u0432\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \tstd::vector&lt;vector&lt;Point3f&gt;&gt; objectPoints; \tfor( int i = 0; i &lt; camera1SamplesPoints.size(); i++ ) { \t\tobjectPoints.push_back(chessboardCorners); \t}  \tdouble rms = stereoCalibrate( \t\tobjectPoints, camera1SamplesPoints, camera2SamplesPoints, \t\t\/\/\u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0439 \u0431\u0443\u0434\u0443\u0442 \u0443\u0442\u043e\u0447\u043d\u0435\u043d\u044b \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \t\tcamera1Matrix, camera1DistCoeffs, \t\tcamera2Matrix, camera2DistCoeffs, \t\t\/\/\u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043a\u0430\u043c\u0435\u0440\u044b \t\timageSize, \t\t\/\/\u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \t\trotationMatrix, \t\t\/\/\u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u043a\u0442\u043e\u0440 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \t\ttranslationVector, \t\t\/\/\u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \t\tessentialMatrix, \t\t\/\/\u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \t\tfundamentalMatrix, \t\t\/\/\u0444\u043b\u0430\u0433, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0447\u0442\u043e \u043d\u0430\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043a\u0430\u043c\u0435\u0440 \t\t\/\/\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u044f \t\tCV_CALIB_USE_INTRINSIC_GUESS, \t\tTermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 100, 1e-5) \t); \t \t\/\/\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0446\u0435\u043d\u043a\u0443 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 - \t\/\/\u043e\u0448\u0438\u0431\u043a\u0443 \u0440\u0435\u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438, \u043e\u043d\u0430, \u043f\u043e \u0438\u0434\u0435\u0435, \u0434\u043e\u043b\u0436\u043d\u0430 \u0442\u043e\u0436\u0435 \u0431\u044b\u0442\u044c \u0432 \u0440\u0430\u0439\u043e\u043d\u0435 1 \tstringstream outs; \touts &lt;&lt; &quot;--- stereo calib: done with RMS error=&quot; &lt;&lt; rms; \tDebugLog(outs.str()); \t } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/108\/89a\/876\/10889a8763c14b169347d244d3056129.png\" alt=\"\u0421\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u0430 \u0432 Unity\"\/><\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0435\u0441\u044f \u0443 \u043c\u0435\u043d\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>\t\/\/512, 70 deg \tMat cam1 = (Mat_&lt;double&gt;(3, 3) &lt;&lt; \t355.3383989449604, 0, 258.0008490063121, \t 0, 354.5068750418187, 255.7252273330564, \t 0, 0, 1);  \tMat dist1 = (Mat_&lt;double&gt;(5, 1) &lt;&lt; \t-0.02781875153957544, \t 0.05084431574408409, \t 0.0003262438299225566, \t 0.0005420218184546293, \t -0.06711413339515834);  \tMat cam2 = (Mat_&lt;double&gt;(3, 3) &lt;&lt; \t354.8366825622115, 0, 255.7668702403205, \t 0, 353.9950515096826, 254.3218524455621, \t 0, 0, 1);  \tMat dist2 = (Mat_&lt;double&gt;(12, 1) &lt;&lt; \t-0.03429254591232522, \t 0.04304840389703278, \t -0.0005799461588668822, \t 0.0005396568753307817, \t -0.01867317550268149);  \tMat R = (Mat_&lt;double&gt;(3, 3) &lt;&lt; \t0.9999698145104303, 3.974878365893637e-06, 0.007769816740176146, \t -3.390471048492443e-05, 0.9999925806915616, 0.003851936175643478, \t -0.00776974378253147, -0.003852083336451321, 0.9999623955607145);  \tMat T = (Mat_&lt;double&gt;(3, 1) &lt;&lt; \t498.2890078004688, \t 0.3317087752736566, \t -6.137837861924672); <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<h4>\u041a\u0430\u0440\u0442\u0430 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439<\/h4>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0441\u0442\u0430\u043b\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u0438\u0434\u0443\u0449\u0438\u0435 \u0448\u0430\u0433\u0438 \u0432\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043d\u0435 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0435\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043a\u0430\u0440\u0442\u044b \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 10 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443. \u041e\u0447\u0435\u043d\u044c \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c \u0432 \u0447\u0435\u043c \u0442\u0443\u0442 \u0434\u0435\u043b\u043e \u0432\u043e\u0442 \u044d\u0442\u043e \u0432\u0438\u0434\u0435\u043e<\/p>\n<p>  <iframe loading=\"lazy\" width=\"420\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/FX7AMktf24E?feature=oembed\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p>  \u0438\u0437 <a href=\"http:\/\/blog.martinperis.com\/2011\/08\/opencv-stereo-matching.html\">\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>. \u041f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0440\u0442\u0440\u043e\u0432 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0437\u0430\u0434\u0438\u0440\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 TextureThreshold \u0431\u043e\u043b\u044c\u0448\u0435 50, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c StereoBM \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0441\u043f\u043e\u043d\u0442\u0430\u043d\u043d\u043e \u043f\u0430\u0434\u0430\u0442\u044c.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u044b \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>\/\/\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u0440\u0442 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 DisparityMapCalculator::DisparityMapCalculator () { \tbm = StereoBM::create(16,9); }  \/** @brief \u0417\u0430\u0434\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u0430\u043b\u0438\u0431\u0440\u043e\u0432\u043a\u0438 \u0438 \t\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0440\u0435\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 *\/ void DisparityMapCalculator::set ( \tcv::Mat camera1Matrix, \tcv::Mat camera2Matrix, \tcv::Mat camera1distCoeff, \tcv::Mat camera2distCoeff, \tcv::Mat rotationMatrix, \tcv::Mat translationVector, \tcv::Size imageSize ) { \tthis-&gt;camera1Matrix = camera1Matrix; \tthis-&gt;camera2Matrix = camera2Matrix; \tthis-&gt;camera1distCoeff = camera1distCoeff; \tthis-&gt;camera2distCoeff = camera2distCoeff; \tthis-&gt;rotationMatrix = rotationMatrix; \tthis-&gt;translationVector = translationVector; \t \t\/\/\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0435\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 (\u0432\u044b\u043f\u0440\u044f\u043c\u043b\u0435\u043d\u0438\u044f) \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \tstereoRectify( camera1Matrix, camera1distCoeff, camera2Matrix, camera2distCoeff, imageSize, rotationMatrix, translationVector, R1, R2, P1, P2, Q, \/*CALIB_ZERO_DISPARITY*\/0, -1, imageSize, &roi1, &roi2 ); \t \t\/\/\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0440\u0435\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \t\/\/\u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \tinitUndistortRectifyMap(camera1Matrix, camera1distCoeff, R1, P1, imageSize, CV_16SC2, map11, map12); \tinitUndistortRectifyMap(camera2Matrix, camera2distCoeff, R2, P2, imageSize, CV_16SC2, map21, map22);  \tbm-&gt;setROI1(roi1); \tbm-&gt;setROI2(roi2); }  \/** @brief \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0440\u0430\u0441\u0441\u0447\u0435\u0442\u0430 \u043a\u0430\u0440\u0442\u044b \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 *\/ void DisparityMapCalculator::setBMParameters ( \tint preFilterSize, \tint preFilterCap, \tint blockSize, \tint minDisparity, \tint numDisparities, \tint textureThreshold, \tint uniquenessRatio, \tint speckleWindowSize, \tint speckleRange, \tint disp12maxDiff ) { \tbm-&gt;setPreFilterSize(preFilterSize); \tbm-&gt;setPreFilterCap(preFilterCap); \tbm-&gt;setBlockSize(blockSize); \tbm-&gt;setMinDisparity(minDisparity); \tbm-&gt;setNumDisparities(numDisparities); \tbm-&gt;setTextureThreshold(textureThreshold); \tbm-&gt;setUniquenessRatio(uniquenessRatio); \tbm-&gt;setSpeckleWindowSize(speckleWindowSize); \tbm-&gt;setSpeckleRange(speckleRange); \tbm-&gt;setDisp12MaxDiff(disp12maxDiff); }  \/** @brief \u0420\u0430\u0441\u0441\u0447\u0435\u0442 \u043a\u0430\u0440\u0442\u044b \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 *\/ void DisparityMapCalculator::compute ( \tconst cv::Mat& image1, \tconst cv::Mat& image2, \tcv::Mat& image1recified, \tcv::Mat& image2recified, \tcv::Mat& disparityMap ) {  \t\/\/ \u0440\u0435\u043a\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \tremap(image1, image1recified, map11, map12, INTER_LINEAR); \tremap(image2, image2recified, map21, map22, INTER_LINEAR); \t \t\/\/ \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0443\u0442\u0430\u0442\u044c \u043b\u0435\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u0430\u0432\u043e\u0435. \t\/\/ \u043f\u0440\u0438 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438\u0437 OpenGL \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a, \u0447\u0442\u043e \u043e\u043d\u0438 \t\/\/ \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u044b, \t\/\/ \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0443\u0440 \u0432 OpenGL \u0438 OpenCV \t\/\/ \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u043e\u0442\u0440\u0430\u0437\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438, \u043d\u0438\u0430\u0447\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \tflip(image1recified, L, 1); \tflip(image2recified, R, 1);  \t\/\/ stereo bm - \u043c\u043d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c sgbm, \t\/\/ \u043f\u0440\u043e\u0449\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0441\u044f \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \t\/\/ StereoBM \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044f\u0445 \u0441\u0435\u0440\u043e\u0433\u043e \tcv::cvtColor(L, image1gray, CV_RGBA2GRAY, 1); \tcv::cvtColor(R, image2gray, CV_RGBA2GRAY, 1); \t \tint numberOfDisparities = bm-&gt;getNumDisparities(); \t\/\/\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \tbm-&gt;compute(image1gray, image2gray, disp);  \t\/\/\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u0440\u0442\u0443 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \tdisp.convertTo(disp8bit, CV_8U, 255\/(numberOfDisparities*16.)); \t\/\/\u043e\u0442\u0440\u0430\u0436\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0435\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0432 Unity \tflip (disp8bit, disp, 1);  \t\/\/\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u044b \u0443 \u043d\u0430\u0441 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 4 \u043a\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \t\/\/\u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u043e\u0434\u043d\u043e\u043a\u0430\u043b\u044c\u0430\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \t\/\/\u0432 4 \u043a\u0430\u043d\u0430\u043b\u0430 \tcv::cvtColor(disp, disparityMap, CV_GRAY2RGBA, 4); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0432\u0438\u0434\u0435\u043e \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443 \u043c\u0435\u043d\u044f.<\/p>\n<p>  <iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/7nm1UAeaf6E?feature=oembed\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043a\u0430\u0440\u0442\u044b \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u0440\u044b\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f. \u042f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0434\u043d\u043e\u0433\u043e OpenCV \u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<\/p>\n<p>  \u0417\u0430 \u0441\u0446\u0435\u043d\u0443 \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043f\u0430\u0441\u0438\u0431\u043e <a href=\"https:\/\/sketchfab.com\/ThomasKole\">ThomasKole<\/a><br \/>  \u041a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c <a href=\"https:\/\/github.com\/parilo\/quadrocopter-unity-opencv\">\u0438\u0437 \u0433\u0438\u0442\u0445\u0430\u0431\u0430<\/a>, \u0432\u0435\u0442\u043a\u0430 habr_part3_disparity_map_opencv_stereobm<\/p>\n<p>  \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435               <\/p>\n<div class=\"clear\"><\/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=\"http:\/\/habrahabr.ru\/post\/271337\/\"> http:\/\/habrahabr.ru\/post\/271337\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/615\/d6d\/2af\/615d6d2af5d64a1b8ee955dae6e5aef8.png\" alt=\"\u041a\u041f\u0414\u0412\"\/><\/p>\n<p>  \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!<\/p>\n<p>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0441\u0435\u0440\u0438\u044e \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u043e\u0434\u0440\u0443\u0436\u0438\u0442\u044c Unity, C++ \u0438 OpenCV. \u0410 \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0433\u043e \u0437\u0440\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0434\u0440\u043e\u043d\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Unity. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u043e \u0442\u043e\u043c, <a href=\"http:\/\/habrahabr.ru\/post\/267791\/\">\u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0432\u0430\u0434\u0440\u043e\u043a\u043e\u043f\u0442\u0435\u0440 \u0432 Unity<\/a> \u0438 <a href=\"http:\/\/habrahabr.ru\/post\/269007\/\">\u043a\u0430\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c C++ \u043f\u043b\u0430\u0433\u0438\u043d, \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c OpenCV<\/a>. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u0430\u043c\u0435\u0440 \u043d\u0430 \u043a\u0432\u0430\u0434\u0440\u043e\u043a\u043e\u043f\u0442\u0435\u0440\u0435 \u0441\u0442\u0435\u0440\u0435\u043e\u043f\u0430\u0440\u0443 \u0438 \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 (disparity map), \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.  <\/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-269682","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/269682","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=269682"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/269682\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=269682"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=269682"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=269682"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}