12

我已经用 OpenCV(findChessboard 等)校准了我的相机,所以我有: - 相机失真系数和内在矩阵 - 相机姿势信息(平移和旋转,通过其他方式单独计算)作为欧拉角和 4x4 - 相机框架内的 2D 点

如何将这些 2D 点转换为指向世界的 3D 单位向量?我尝试使用 cv::undistortPoints 但这似乎没有做到(仅返回 2D 重新映射的点),而且我不确定使用哪种矩阵数学方法通过我拥有的相机内在函数对相机进行建模。

4

1 回答 1

20

将您的 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);

原点和方向现在定义了世界空间中与该图像点相对应的射线。请注意,此处原点以相机为中心,您可以使用相机姿势转换到不同的原点。失真系数从您的实际相机映射到针孔相机模型,应该在一开始就用于查找您的实际二维坐标。然后的步骤是

  1. 使用失真系数不失真 2d 坐标
  2. 转换为射线(如上图)
  3. 将该射线移动到您喜欢的任何坐标系。
于 2012-10-19T16:14:43.163 回答