【问题标题】:Project point from point cloud to Image in OpenCV在OpenCV中将点从点云投影到图像
【发布时间】:2018-04-18 12:49:16
【问题描述】:

我正在尝试使用 C++ 在 OpenCV 中将一个点从 3D 投影到 2D。目前,我正在使用 cv::projectPoints() 但它只是不工作。

但首先要做的事情。我正在尝试编写一个程序,该程序可以找到点云和空间线之间的交点。所以我校准了两台相机,使用SGBM进行了校正和匹配。最后,我使用 reprojectTo3D() 将视差图投影到 3d。这一切都很好,在 meshlab 中,我可以可视化我的点云。

之后我编写了一个算法来找到点云和我手动编码的线之间的交点。这也很好用。我在点云中找到了一个距离线约 1.5 毫米的点,这对于开始来说已经足够了。所以我抓住了这一点并尝试将其投影回图像,以便我可以标记它。但这就是问题所在。

现在该点不再位于图像内部。当我在图像中间进行交叉时,这是不可能的。我认为问题可能出在坐标系中,因为我不知道点云是在哪个坐标系中写入的(左相机、右相机或其他)。

我的 projectPoints 函数如下所示:

projectPoints(intersectionPoint3D, R, T, cameraMatrixLeft, distortionCoeffsLeft, intersectionPoint2D, noArray(), 0);

R 和 T 是从一台摄像机到另一台摄像机的旋转和平移(从 stereoCalibrate 获得)。这可能是我的错误,但我该如何解决呢?我也尝试将它们设置为 (0,0,0) 但它也不起作用。我还尝试使用 Rodrigues 将 R 矩阵转换为向量。还是同样的问题。

如果之前有人问过这个问题,我很抱歉,但我不知道如何搜索这个问题。我希望我的文字足够清楚以帮助我...如果您需要更多信息,我很乐意提供。

非常感谢。

【问题讨论】:

  • 我不确定您的点云在哪个坐标系中...但 R 和 T 是相机相对于点云原点的位置。如果点云已经在原点,则不需要 R 和 T。如果它在模型的观点(点云中心的原点)中,那么您需要一个 R 和 T 来表示该原点的相机姿势.... 看看 this 它解释了如何使用您的 Q 矩阵从 3D 转到视差图
  • 感谢您的回答。这已经很有帮助了。但现在我想知道如何获得该点的实际左侧(校正)图像的坐标。所以我是对的,如果我说要获取左图中某个点的坐标,我可以只取该点的视差图的坐标。为了获得正确图像的坐标,我获取视差坐标并在该点添加实际视差?我不确定我试图解释的内容是否清楚。使用立体 SGBM 创建的视差图的默认“基本”坐标系是什么?非常感谢提前

标签: c++ opencv


【解决方案1】:

你有一个 3D 点,你想得到它对应的 2D 位置,对吗?如果您有相机校准矩阵(3x3 矩阵),您将能够将点投影到图像上

cv::Point2d get2DFrom3D(cv::Point3d p, cv::Mat1d CameraMat)
{
    cv::Point2d pix;
    pix.x = (p.x * CameraMat(0, 0)) / p.z + CameraMat(0, 2);
    pix.y = ((p.y * CameraMat(1, 1)) / p.z + CameraMat(1, 2));
    return pix;
}

【讨论】:

  • 感谢您的回答。但我意识到我在这里遇到了一个更基本的问题。我会为此提出新的问题。感谢您的帮助。
猜你喜欢
  • 2015-05-05
  • 2018-04-29
  • 1970-01-01
  • 2015-07-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多