如何从单个相机多个图像三角测量点?

时间:2017-04-10 13:52:21

标签: c++ opencv 3d camera

我有一个校准过的相机指向不同位置的棋盘,并且已知

  1. Camera Intrinsics 。 FX,FY,CX,CY
  2. 失真系数 K1,K2,K3,T1,T2等。
  3. 相机旋转&来自IMU的翻译(R,T) enter image description here
  4. 在Undistortion之后,我使用已知的相机到相机旋转和平移向量计算了所有图像中棋盘点的点对应关系。

    如何估算所有图像中棋盘的3D点?

    我认为OpenCV有这样做的功能,但我无法理解如何使用它!

    1)cv::sfm::triangulatePoints

    2)triangulatePoints

    如何使用OpenCV计算3D点数?

1 个答案:

答案 0 :(得分:1)

由于您已经从图像中获得了匹配点,因此您可以使用findFundamentalMat()来获取基本矩阵。请记住,您需要至少7个匹配点才能执行此操作。如果你有超过8分,CV_FM_RANSAC可能是最好的选择。

然后使用cv::sfm::projectionsFromFundamental()查找每个图像的投影矩阵,检查投影矩阵是否有效(例如,如果点位于摄像机前面,则检查。)

然后将投影和点数输入cv :: sfm :: triangulatePoints()。

希望这会有所帮助:)

修改

需要旋转和平移矩阵来更改参考帧,因为摄像机在SFM中移动。参考框架位于摄像机的位置。需要变换以确保点的位置是相干的(在相同的参考帧下,通常是第一图像中的相机的反面帧),因此所有点都在相同的坐标系中。

IE。将第二帧收集的点与第一帧,第三帧和第二帧相关联,依此类推。

所以基本上你可以使用R和T向量为每个帧构造一个变换矩阵,并将它与你的点相乘,将它们放在第一帧的摄像机的reface帧中。