【发布时间】: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 创建的视差图的默认“基本”坐标系是什么?非常感谢提前