OpenCV:从triangulatePoints获取3D坐标

3

我正在尝试使用OpenCV从两个立体图像中获取点云数据,但无法获得坐标。

  1. 我使用光流找到了点的坐标。
  2. 我找到了相机的投影矩阵。
Mat RT1;<br>
hconcat(R, T1, RT1);<br>
Mat P1 = C*RT1;<br>


R是3x3旋转矩阵,T是3x1变换矩阵(列),P1为投影矩阵。

  1. 我将它们传递给triangulatePoints函数。
triangulatePoints(P1, P2, leftPoints, rightPoints, out);
P1和P2是3x4投影矩阵(Mat_<double>)。leftPoints和rightPoints是Point2f的std::vector。那么out是什么?它应该是4D坐标的1xN矩阵。这是Vec4f吗?
我正在尝试获取坐标。
for (int i = 0; i < out.cols; i++)
{
  Vec4f vec = out.at<Vec4f>(0, i);
  float w = vec[3];
  stream << "v " << vec[0] / w << " " << vec[1]/w << " " << vec[2]/w << "\n";
}

但是我有两个问题:

  • 这个循环会抛出异常(对于小的 i,大约 20% 的 out.cols 可以正常运行)

OpenCV 错误:断言失败(dims <= 2 && data && (unsigned)i0 < (unsigned)si ze.p[0] && (unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p1 * cha nnels()) && ((((sizeof(size_t)<<28)|0x8442211) >> ((DataType<_Tp>::depth) & ((1 << 3) - 1))*4) & 15) == elemSize1())in cv::Mat::at, file c:\opencv\build\includ e\opencv2\core\mat.inl.hpp, line 89

我认为这是一种索引超出范围的异常。

  • 结果非常奇怪: 图片

所以,我做错了什么。如何正确地使用此函数并获取点的三维坐标?希望你能帮助我。

1个回答

0

我不太明白你获取坐标的方法。

就我所看到的,你不应该访问像

out.at<Vec4f>(0, i);

相反,应该这样做:

float x = out.at<float>(0, i);
float y = out.at<float>(1, i);
float z = out.at<float>(2, i);
float w = out.at<float>(3, i);
stream << "v " << x << " " << y << " " << z << "\n";

或者使用 double... 取决于您的 out 是否为类型 CV_32FCV_64F

这是我的做法:

Mat points3DHomogeneous;
triangulatePoints(projectionMatrixL, projectionMatrixR, pointsL, pointsR, points3DHomogeneous);

projectionMatrixL:

enter image description here

projectionMatrixR:

enter image description here

pointsL:

    700 250
    200 300
    600 350
    400 400
    500 450
    600 500
    700 550
    800 600
    150 650
    1000 700

pointsR:

    690 250
    180 300
    590 350
    385 400
    495 450
    575 500
    691 550
    782 600
    120 650
    960 700

points3DHomogeneous 是结果:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接