在OpenCV中,将2d图像点转换为3d世界单位矢量

时间:2012-10-19 15:53:23

标签: c++ opencv computer-vision

我已经用OpenCV(findChessboard等)校准了我的相机,所以我有: - 相机失真系数&内在矩阵 - 相机姿势信息(平移和旋转,通过其他方式分开计算),如Euler Angles&一个4x4 - 相机框架内的2D点

如何将这些2D点转换为指向世界的3D单位矢量?我尝试使用cv :: undistortPoints但似乎没有这样做(只返回2D重映射点),而且我不确定使用什么方法的矩阵数学来通过我内置的Camera内在函数来建模相机。< / p>

1 个答案:

答案 0 :(得分:17)

将您的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. 将该光线移动到您喜欢的任何坐标系。