Кто-нибудь знает, как проектировать набор 3D-точек в виртуальную плоскость изображения в opencv c++
спасибо
регистрация (OpenNI 2) или альтернативная возможность viewPoint (openNI 1.5) действительно помогают выравнивать глубину с rgb, используя одну строку кода. Цена, которую вы платите, заключается в том, что вы не можете реально восстановить точные местоположения точек X, Y в трехмерном пространстве, так как строка и столбец перемещаются после выравнивания.
Иногда вам нужно не только Z, но и X, Y и хотите, чтобы они были точными; плюс вы хотите выравнивание глубины и rgb. Затем вы должны выровнять rgb до глубины. Обратите внимание, что это выравнивание не поддерживается Kinect/OpenNI. Цена, которую вы платите за это - нет значений RGB в местах, где глубина не определена.
Если известны внешние параметры, которые представляют собой поворот и перевод камеры глубины относительно цветной, то выравнивание - это всего лишь вопрос создания альтернативной точки зрения: восстановление 3D с глубины, а затем просмотр облака точек с точки зрения цвета камера: применяется обратное вращение и перевод. Например, перемещение камеры вправо подобно перемещению мира (точек) влево. Reproject 3D в 2D и интерполировать при необходимости. Это действительно легко и просто обратное к 3D-реконструкции; ниже Cx близок к w/2 и Cy к h/2;
col = focal * X/Z + Cx row = -focal * Y/Z + Cy//это потому, что строка на изображении увеличивается вниз
Правильный, но и более дорогой способ получить красивую карту глубины после поворота точечного облака - проследить лучи от каждого пикселя, пока он не пересечет облако точек или не окажется достаточно близко к одной из точек. Таким образом, у вас будет меньше отверстий на карте глубины из-за артефактов выборки.
Сначала вам нужно определить матрицу трансформации (поворот, перевод и т.д.), Чтобы отобразить 3D-пространство на плоскость 2D-изображения, а затем просто умножить ваши трехмерные координаты точки (x, y, z) на матрицу, чтобы получить 2D-координаты на изображении.