gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:44:49 42 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.- 使用的方法是最小二乘法。还有比这更复杂的算法。它仍然是最常见的一种,因为其他方法在某些情况下可能会失败(即,如果点在平面上或无限上,其他一些方法会失败)。

该方法可以在 Richard Hartley 和 Andrew Zisserman 的 Multiple View Geometry in Computer Vision 中找到(p312)

2.-用法:

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

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

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) 矩阵。真的很困惑,但这是我没有异常的唯一方法。


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

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

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