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

我试图用OpenCV三角测量一些点,我发现这个cv :: triangulatePoints()函数。问题是几乎没有文件或例子。

我有一些疑问。

>它使用什么方法?
我对三角测量进行了小量研究,有几种方法(线性,线性LS,特征,迭代LS,迭代特征,…),但是我找不到在OpenCV中使用哪种方法。
>我该怎么用?它似乎作为一个输入,它需要一个投影矩阵和3xN均匀的2D点。我把它们定义为std :: vector< cv :: Point3d> pnts,但作为输出,它需要4xN数组,显然我不能创建一个std :: vector< cv :: Point4d>因为它不存在,那么我应该如何定义输出向量?

对于我尝试的第二个问题:cv :: Mat pnts3D(4,N,CV_64F);和cv :: Mat pnts3d,两者似乎都不起作用(引发异常)。

1.-最简单的方法是最小二乘法。有比这更好的方法。仍然是最常见的,因为在某些情况下其他方法可能会失败(即某些其他方法如果点在平面上或无限的话)会失败。

该方法可以在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个chanel点矩阵。

cam0和cam1是Mat3x4相机矩阵(内在参数和外部参数)。您可以通过乘以A * RT来构造它们,其中A是固有参数矩阵,RT是旋转平移3×4姿态矩阵。

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

注意:pnts3D定义时需要为4通道1xN cv :: Mat,如果不是则抛出异常,但结果是cv :: Mat(4,N,cv_64FC1)矩阵。真的很混乱,但这是我没有例外的唯一方法。

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

http://stackoverflow.com/questions/16295551/how-to-correctly-use-cvtriangulatepoints

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c++ 如何正确使用cv :: triangulatePoints()