【问题标题】:In OpenCV, converting 2d image point to 3d world unit vector在 OpenCV 中,将 2d 图像点转换为 3d 世界单位向量
【发布时间】:2012-10-10 06:55:06
【问题描述】:

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

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

【问题讨论】:

  • 你在说什么二维点?
  • 在相机框架内捕获的二维图像(像素)坐标。本质上,给定一个 2D 图像坐标和上述数据,我应该能够构造一个 3D 单位向量,指向来自相机的 2D 图像坐标。

标签: c++ opencv computer-vision


【解决方案1】:

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

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

  1. 使用失真系数对二维坐标进行不失真
  2. 转换为射线(如上图)
  3. 将该射线移动到您喜欢的任何坐标系。

【讨论】:

  • 您忘记标准化 hom_pt。 :)
  • @IanMedeiros 你的意思是让它成为一个单位向量还是让第三个元素成为1?由这些点定义的向量无论是否经过任何归一化都是正确的,在乘以相机矩阵的倒数后,第三个元素可以解释为 z 坐标。
  • 实际上,我已经赞成您的回答,但现在我不确定它是否正确。我认为在进行您正在谈论的同质化之前,您需要使用内在矩阵将 2D 坐标从像素转换为世界坐标。您可以使用相机姿势信息对其进行变换以获取光线方向。
  • @IanMedeiros 我打算将 camera_mat 用作内在函数,我更新了答案以使其更清楚。你说的是这个吗?
  • 是的,没错。现在,您确定将均质化的 2D 点乘以固有矩阵会得到单位向量吗?如果不是,则需要对其进行规范化。
猜你喜欢
  • 1970-01-01
  • 2020-12-11
  • 2020-03-04
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
相关资源
最近更新 更多