【问题标题】:Opencv - Triangulation origin with stereo systemOpencv - 立体系统的三角测量原点
【发布时间】:2016-07-01 06:50:15
【问题描述】:

我正在使用立体系统,因此我正在尝试获取某些点的世界坐标。我可以对每个相机进行特定校准,然后计算旋转矩阵和平移向量。最后我进行了三角测量,但我不确定世界坐标的原点。

正如您在我的图中看到的,值对应于深度值,但它们应该接近 400,因为它是平坦的。所以我想原点是左相机,这就是它变化的原因......

我的投影数组和三角函数的一段代码:

#C1 and C2 are the cameras matrix (left and rig)
#R_0 and T_0 are the transformation between cameras
#Coord1 and Coord2 are the correspondant coordinates of left and right respectively
P1 = np.dot(C1,np.hstack((np.identity(3),np.zeros((3,1))))) 

P2 =np.dot(C2,np.hstack(((R_0),T_0)))

for i in range(Coord1.shape[0])
    z = cv2.triangulatePoints(P1, P2, Coord1[i,],Coord2[i,])

我的相机呈现一个角度,Z 轴方向(深度方向)不垂直于我的表面。我想要基线方向的深度。所以我必须轮换我的积分?

【问题讨论】:

  • 使用恒等式和零平移意味着一切都是根据C1坐标系计算的,C1传感器是原点。
  • 好的,但是对于三角测量,我必须这样做,不是吗?如果我想在具有法线表面的地标中“传输”深度,该怎么做?它是“刚体运动”变换吗?感谢您的帮助;)
  • 您可以使用世界坐标系中的 C1 旋转矩阵和世界坐标系中的 C1 平移来形成您的 P1 和 P2。然后使用相同的想法形成 P2。这样 triangluatePoints 将在世界坐标系中给出 4D 点。如果你想要这个,我可以提供一个答案,但我只在 C++ 中做过,但你会明白的
  • 对不起,我在吃东西...我在 python 上工作,但要清楚地知道如何做到这一点会很有帮助:) 我有一个小问题...这是纠正的义务吗?如果我使用somme光流方法不是必需的吗?感谢您的帮助

标签: opencv triangulation stereo-3d


【解决方案1】:

在以下代码中,points4DNorm 将包含世界坐标中的 3D 点。我根本没有使用 rectify,我只是使用了几个 2d/3d 点对,然后在这些对上求解 PnPRansac。

// rotMat1, rotMat2,tvec1 and tvec2 are retrieved from solvePnPRansac and Rodrigues
        Mat points4D;
        rotMat1.copyTo(myCam1.ProjectionMat(Rect(0, 0, 3, 3)));
        tvec1.copyTo(myCam1.ProjectionMat(Rect(3, 0, 1, 3)));

        rotMat2.copyTo(myCam2.ProjectionMat(Rect(0, 0, 3, 3)));
        tvec2.copyTo(myCam2.ProjectionMat(Rect(3, 0, 1, 3)));

        myCam1.ProjectionMat = myCam1.NewCameraMat* myCam1.ProjectionMat;
        myCam2.ProjectionMat = myCam2.NewCameraMat* myCam2.ProjectionMat;
        triangulatePoints(myCam1.ProjectionMat, myCam2.ProjectionMat, balls12d, balls22d, points4D);
        Mat points4DNorm;
      for (int k = 0; k < points4D.cols;k++)
      {
        points4D.at<float>(0, k) = (points4D.at<float>(0, k) / points4D.at<float>(3, k))/304.8;
        points4D.at<float>(1, k) = (points4D.at<float>(1, k) / points4D.at<float>(3, k)) / 304.8;
        points4D.at<float>(2, k) = (points4D.at<float>(2, k) / points4D.at<float>(3, k)) / 304.8;
        points4D.at<float>(3, k) = (points4D.at<float>(3, k) / points4D.at<float>(3, k)) / 304.8;
        std::cout << std::setprecision(9) << points4D.at<float>(0, k) << "," << points4D.at<float>(1, k) << "," << points4D.at<float>(2, k) << std::endl;
       }

【讨论】:

    猜你喜欢
    • 2021-04-27
    • 1970-01-01
    • 2014-07-04
    • 2016-07-02
    • 2015-11-16
    • 2014-03-07
    • 1970-01-01
    • 2012-04-03
    • 2014-04-15
    相关资源
    最近更新 更多