12

我一直在尝试在 OpenCV 中为一个项目实现一个简单的 SFM 管道,但遇到了一些麻烦。

它适用于未校准的相机,所以我没有相机矩阵(是的,我知道这会让事情变得更加复杂和模糊)。
我知道在尝试这样的事情之前我应该​​阅读更多内容,但我的时间非常紧迫,我正在尝试阅读遇到的事情。

这是我从许多文章、代码示例和书籍中收集的当前管道。我已经发布了有关具体步骤的问题,并且还想知道我在此过程中遗漏了什么或者我做错了什么?

这是我目前的管道。

  1. 从图像中提取 SIFT/SURF 关键点。
  2. 图像的成对匹配。

    1. 在成对匹配期间,我运行“比率测试”以减少关键点的数量。
    2. (对此不确定)我读到计算基本矩阵(RANSAC)并从匹配中消除异常值会进一步帮助它。

      问)我需要这样做吗?是不是太多了或者我应该做一些其他的事情,比如 Homography 来避免 8 点的退化情况?

  3. 接下来,我需要选择 2 张图像来开始重建。

    1. 我找到了图像对之间的 Homography Inliers 的数量。我按最大内点数的顺序遍历图像对列表。
    2. 我计算基本矩阵。
    3. 我“猜测”一个 K 矩阵并使用 Hartley's 中的公式计算基本矩阵。
    4. 我用 SVD 分解这个基本矩阵,然后验证 4 个解决方案。
      • 我使用维基百科条目中的逻辑和这个 python gist 来实现我的检查。

        问)这是对的吗?或者我应该只是对这些点进行三角测量,然后确定它们是否在相机前面,或者它是否适用于同一件事?

    5. 如果在查找基本矩阵时遇到问题,请跳过它并检查下一个图像对

  4. 设置 P=[I|0] 和 P1=[R|T],执行三角剖分并将 3d 点存储在一些数据结构中。同时存储 P 矩阵。

  5. 运行具有大量迭代的捆绑调整步骤以最小化错误。

    从这里开始有点朦胧,我很确定我搞砸了。

  6. 根据观察到的最多 3d 点选择要添加的下一个图像。

  7. 使用 PnPRasnac 之类的方法从已知的 3D 点估计这个新图像的位姿。使用 R & t 的值作为它的投影矩阵 P1=[R|t]
  8. 对这个新图像进行三角剖分(我知道,我不需要对所有这些图像进行三角剖分)到目前为止使用它们的 P 矩阵作为 P=PMatrices[ImageAlreadyTriangulated] 和上面获得的 P1 三角剖分的图像。

    Q) 真的只是使用我们使用过的 P 的原始值那么简单吗?这会让所有东西都进入同一个坐标空间吗?如中,三角点是否都与从 P 和 P1 的初始值获得的系统相同,还是我需要在这里进行某种转换?

  9. 从我们从三角测量中获得的点中,只添加我们尚未存储的那些 3D 点。

  10. 每几张图像后运行一次捆绑调整
  11. 返回第 6 步,直到添加所有图像。

一般的问题:

  • 即使我的相机矩阵 K 只是一个猜测,我是否应该对这些点使用 undistort 或其他东西?
  • 对于捆绑调整,我将点输出到大捆绑调整 (BAL) 格式的文件中。我应该通过 R=R' & T=-RT 将它们转换为世界坐标空间还是让它们保持原样?

我知道这一定是读了很久。非常感谢您的宝贵时间 :)

4

2 回答 2

2

您建议的管道通常是正确的。3.1除外。

2.2) 正确。RANSAC 随机选取点来估计基本矩阵,并且对异常值足够鲁棒(当然,只要你有足够的有效匹配)。单应性异常值不一定是坏匹配,因此不应使用单应性过滤匹配。

3.1) 不正确:Homography inliers 是在两个视图中完全对齐的匹配,例如在两个视图之间表现出比例或类似移动的点。这意味着,视图对中单应性内点的数量越高,视图对作为基线三角剖分种子的良好候选者就越少。使用 RANSAC 估计的基本矩阵中的这 2 个视图的相机矩阵很可能会出现不准确的结果,并且重建将永远不会恢复。相反,您想要做的是从具有最低单应性内点百分比的 ViewPair 开始,并且仍然有大量匹配项。不幸的是,具有最多匹配数的图像对通常也具有最多的单应性内点。这是因为这些对通常包含很少的相机移动。

3.4) 我所做的是尝试使用所有 4 种可能的相机矩阵歧义进行三角测量。R1|t1, R1|t2, R2|t1, R2|t2

8) 是的

于 2016-01-05T03:05:12.673 回答
1

我可以推荐这篇文章;https://github.com/godenlove007/master-opencv-book/tree/master/Chapter4_StructureFromMotion

为了构建它,您需要 SSBA 和 PCL 库作为先决条件。SSBA 的构建非常简单,但如果您计划使用 Visual Studio 2013,PCL 可能会很棘手。在这种情况下,您必须从源代码构建 PCL 的先决条件,这需要一些时间。

一旦你建立了这个项目,你就可以检查那个人是如何做到的,并与你的想法进行比较。

于 2014-07-22T11:54:54.347 回答