我试图用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矩阵转换为矢量。还是同样的问题。
我很抱歉,如果之前有人问过,但我不确定如何搜索此问题。我希望我的文字能够帮助我......如果您需要更多信息,我很乐意提供。
非常感谢提前。
答案 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;
}