gpt4 book ai didi

c++ - 在 OpenCV 中从点云到图像的项目点

转载 作者:行者123 更新时间:2023-11-28 04:42:41 26 4
gpt4 key购买 nike

我正在尝试使用 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 矩阵转换为 vector 。还是一样的问题。

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

非常感谢。

最佳答案

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

关于c++ - 在 OpenCV 中从点云到图像的项目点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49900179/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com