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

In OpenCV, converting 2d image point to 3d world unit vector

我已经用OpenCV(findchessboard等)校准了我的相机,所以我有:-摄像机畸变系数和内部矩阵-摄像机姿态信息(平移和旋转,通过其他方式单独计算)作为欧拉角和4x4-相机帧内的二维点

如何将这些二维点转换为指向世界的三维单位向量?我试过使用cv::unsortpoints,但似乎没有这样做(只返回2d重新映射的点),我也不确定用什么样的矩阵数学方法通过我拥有的相机内部来模拟相机。


将二维点转换为均匀点(给它一个等于1的第三个坐标),然后乘以相机内部矩阵的倒数。例如

1
2
3
4
5
6
7
8
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);

原点和方向现在定义与该图像点对应的世界空间中的光线。请注意,原点在相机上居中,可以使用相机姿势转换到其他原点。畸变系数从您的实际相机映射到针孔相机模型,应该在一开始就使用它来找到您的实际二维坐标。接下来的步骤是

  • 失真二维坐标与失真系数
  • 转换为光线(如上所示)
  • 把光线移动到你喜欢的坐标系。