OpenCV:从triangulatePoints

时间:2015-07-08 05:40:13

标签: c++ opencv

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

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


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

    1. 我将它们传递给triangulatePoints函数
    2. triangulatePoints(P1, P2, leftPoints, rightPoints, out);
      

      P1和P2是3×4投影矩阵(Mat_&lt; double&gt;)。 leftPoints和rightPoints是Point2f的std :: vector。 什么出来了?它应该是1xN 4D坐标矩阵。这是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&lt; = 2&amp;&amp; data&amp;&amp;(unsigned)i0&lt;   (无符号)si ze.p [0]&amp;&amp; (无符号)(i1 * DataType&lt; _Tp&gt; :: channels)&lt;   (未签名)(size.p 1 * cha nnels())&amp;&amp;   ((((sizeof(size_t)&lt;&lt; 28)| 0x8442211)&gt;&gt;((DataType&lt; _Tp&gt; :: depth)&amp;((1&lt;&lt;   3) - 1))* 4)&amp; 15)== elemSize1())在cv :: Mat :: at,file中   c:\ opencv \ build \ includ e \ opencv2 \ core \ mat.inl.hpp,第89行

      我认为这是某种索引范围异常

      • 结果很奇怪: Image

      所以,我做错了什么。如何正确使用此功能并获得点的3D坐标?我希望你能帮助我。

1 个答案:

答案 0 :(得分: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 ...取决于您outCV_32F还是CV_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