В OpenCV преобразование 2-й точки изображения в вектор трехмерного мира

Я откалибровал свою камеру с помощью OpenCV (findChessboard и т. Д.), Поэтому у меня есть:
— Коэффициенты искажения камеры & Встроенная матрица
— Информация о позе камеры (перевод & Вращение, рассчитанное отдельно с помощью других средств) как углы Эйлера & 4×4
— 2D точки в кадре камеры

Как я могу преобразовать эти 2D точки в 3D единичные векторы, указывающие на мир? Я попытался использовать cv :: undistortPoints, но, похоже, это не сработало (возвращает только переназначенные 2D-точки), и я не совсем уверен, какой метод математической математики использовать для моделирования камеры с помощью встроенных функций Camera.

11

Решение

Преобразуйте вашу 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-координату. Затем шаги

  1. Undistort 2d координата с коэффициентами искажения
  2. Преобразовать в луч (как показано выше)
  3. Переместите этот луч в любую нужную вам систему координат.
17

Другие решения

Других решений пока нет …