Я откалибровал свою камеру с помощью OpenCV (findChessboard и т. Д.), Поэтому у меня есть:
— Коэффициенты искажения камеры & Встроенная матрица
— Информация о позе камеры (перевод & Вращение, рассчитанное отдельно с помощью других средств) как углы Эйлера & 4×4
— 2D точки в кадре камеры
Как я могу преобразовать эти 2D точки в 3D единичные векторы, указывающие на мир? Я попытался использовать cv :: undistortPoints, но, похоже, это не сработало (возвращает только переназначенные 2D-точки), и я не совсем уверен, какой метод математической математики использовать для моделирования камеры с помощью встроенных функций Camera.
Преобразуйте вашу 2d точку в однородную точку (задайте для нее третью координату, равную 1), а затем умножьте ее на обратную матрицу внутренней камеры. Например
cv::Matx31f hom_pt(point_in_image.x, point_in_image.y, 1);
hom_pt = camera_intrinsics_mat.inv()*hom_pt; //put in world coordinates
cv::Point3f origin(0,0,0);
cv::Point3f direction(hom_pt(0),hom_pt(1),hom_pt(2));
//To get a unit vector, direction just needs to be normalized
direction *= 1/cv::norm(direction);
начало и направление теперь определяют луч в мировом пространстве, соответствующий этой точке изображения. Обратите внимание, что здесь центр находится в центре камеры, вы можете использовать позу камеры для преобразования в другой источник. Коэффициенты искажения отображаются в вашей фактической камере на модель камеры-обскуры и должны использоваться в самом начале, чтобы найти вашу фактическую 2D-координату. Затем шаги
Других решений пока нет …