2012-10-19 222 views
9

我已校准的我的相机用的OpenCV(findChessboard等),所以我有: - 相机畸变系数&内在函数矩阵 - 相机姿势信息(翻译&旋转,separatedly计算通过其他方式)作为欧拉角& a 4x4 - 相机框架内的二维点在OpenCV中,2D图像点转换为3D世界单位矢量

如何将这些二维点转换为指向世界的三维单位向量?我尝试使用cv :: undistortPoints,但似乎没有做到这一点(只返回二维重新映射的点),并且我不确定用什么矩阵数学方法来通过相机内在函数对相机进行建模。

+0

你在说什么2D点? –

+0

在相机框架内捕获的2D图像(像素)坐标。基本上,给定一个二维图像坐标和上述数据,我应该能够构建一个3D单位矢量指向来自相机的二维图像坐标。 – Yeraze

回答

14

将您的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. Undistort图2d与畸变系数坐标
  2. 转换为射线(如上所示)
  3. 动议射线到任何坐标你喜欢的系统。
+0

你忘了标准化hom_pt。 :) –

+0

@IanMedeiros你的意思是使它成为一个单位矢量或使第三个元素1?由这些点定义的向量在有或没有任何类型的归一化的情况下是正确的,在乘以相机矩阵的逆矩阵之后,第三个元素可以被解释为z坐标。 – Hammer

+0

其实,我已经upvoted你的答案,但现在我不知道它的正确。我认为在进行所讨论的均匀化之前,您需要使用固有矩阵将二维坐标从像素转换为世界坐标。您可以使用相机姿态信息将其转换为光线方向。 –