我已经用OpenCV(findChessboard等)校准了我的相机,所以我有: - 相机失真系数&内在矩阵 - 相机姿势信息(平移和旋转,通过其他方式分开计算),如Euler Angles&一个4x4 - 相机框架内的2D点
如何将这些2D点转换为指向世界的3D单位矢量?我尝试使用cv :: undistortPoints但似乎没有这样做(只返回2D重映射点),而且我不确定使用什么方法的矩阵数学来通过我内置的Camera内在函数来建模相机。< / p>
答案 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坐标。然后是步骤