项目从点云到OpenCV中的图像

时间:2018-04-18 12:49:16

标签: c++ opencv

我试图用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矩阵转换为矢量。还是同样的问题。

我很抱歉,如果之前有人问过,但我不确定如何搜索此问题。我希望我的文字能够帮助我......如果您需要更多信息,我很乐意提供。

非常感谢提前。

1 个答案:

答案 0 :(得分:0)

你有一个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;
}