gpt4 book ai didi

c++ - 如何正确使用 cv::triangulatePoints()

转载 作者:太空宇宙 更新时间:2023-11-04 13:37:57 30 4
gpt4 key购买 nike

我试图用 OpenCV 对一些点进行三角测量,我发现了这个 cv::triangulatePoints()功能。问题是几乎没有文档或示例。

我对此有些怀疑。

  1. 它使用什么方法?我对三角剖分做了一些研究,有几种方法(线性、线性 LS、本征、迭代 LS、迭代本征等),但我找不到 OpenCV 中使用的是哪一种。

  2. 我应该如何使用它? 作为输入,它似乎需要一个投影矩阵和3xN 齐次2D 点。我将它们定义为 std::vector<cv::Point3d> pnts ,但作为输出,它需要 4xN 数组,显然我无法创建 std::vector<cv::Point4d>因为它不存在,所以我应该如何定义输出 vector ?

对于我试过的第二个问题:cv::Mat pnts3D(4, N, CV_64F);cv::Mat pnts3d; , 但似乎都不起作用(它抛出异常)。

最佳答案

1.- 方法 使用的是最小二乘法。还有比这个更复杂的算法。尽管如此,它仍然是最常见的一种,因为其他方法在某些情况下可能会失败(即,如果点在平面上或无限远,则其他方法会失败)。

该方法可以在 计算机视觉中的多 View 几何 中找到,作者是 Richard Hartley 和 Andrew Zisserman (p312)

2.-用法:

cv::Mat pnts3D(1, N, CV_64FC4);
cv::Mat cam0pnts(1, N, CV_64FC2);
cv::Mat cam1pnts(1, N, CV_64FC2);

用图像中的点填充 2 channel 点矩阵。

cam0cam1Mat3x4 相机矩阵(内部和外部参数)。您可以通过乘以 A*RT 来构造它们,其中 A 是内在参数矩阵,RT 是旋转平移 3x4 位姿矩阵。

cv::triangulatePoints(cam0,cam1,cam0pnts,cam1pnts,pnts3D);

注意:pnts3D 需要是 4 channel 1xN cv::Mat 当定义时,抛出异常如果不是,但结果是 cv::Mat(4, N, cv_64FC1) 矩阵。确实令人困惑,但这是我没有得到异常的唯一方法。


更新:从 3.0 版或更早版本开始,这不再适用,pnts3D 也可以是 Mat(4, N, CV_64FC1 ) 或者可以完全留空(像往常一样,它是在函数内部创建的)。

关于c++ - 如何正确使用 cv::triangulatePoints(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28885186/

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