我已经用OpenCV(findChessboard等)校准了我的相机,所以我有:
-相机失真系数和本征矩阵
-相机姿态信息(平移和旋转,通过其他方式分别计算)为欧拉角和4x4
-相机框架内的2D点
如何将这些2D点转换为指向世界的3D单位 vector ?我尝试使用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坐标。然后的步骤是
关于c++ - 在OpenCV中,将2d图像点转换为3d世界单位 vector ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12977980/