关于运动管道结构的问题

use*_*068 11 3d opencv computer-vision 3d-reconstruction

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

它适用于未经校准的相机,因此我没有相机矩阵(是的,我知道它会使事情变得更复杂和模糊).
我知道在尝试这样的事情之前我应该​​阅读更多内容但是我很难按时间而且我正试图在我遇到它们时阅读相关内容.

这是我从许多文章,代码示例和书籍中收集的当前管道.我已经发布了关于它之后的具体步骤的问题,并且还想知道我在这方面缺少什么或者我做错了什么?

这是我目前的管道.

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

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

      问)我是否需要这样做?它是否太多或者我应该做一些像Homography这样的事情以避免8点的堕落情况?

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

    1. 我找到了图像对之间的Homography Inlier的数量.我按照大多数%内点的顺序迭代图像对列表.
    2. 我计算基本矩阵.
    3. 我"猜测"一个K矩阵并用哈特利的公式计算基本矩阵.
    4. 我用SVD分解这个Essential Matrix,然后验证4个解决方案.
      • 我使用维基百科条目中的逻辑和这个python要点来实现我的检查.

        问)这是对的吗?或者我应该对这些点进行三角测量,然后确定它们是否在摄像机前面,或者它是否能够完成相同的操作?

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

  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.

    问)它是否真的像使用我们使用的P的原始值一样简单?这会将所有东西都放到相同的坐标空间吗?如上所示,三角测量点是否与从P和P1的初始值获得的系统相同,或者我是否需要在此进行某种转换?

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

  10. 每两张图像后运行一次包调整
  11. 返回步骤6,直到添加所有图像.

一般的问题:

  • 即使我的相机矩阵K只是猜测,我应该使用undistort来获得积分吗?
  • 对于束调整,我将点输出到Bundle Adjustment of Large(BAL)格式的文件.我应该通过R = R'和T = -RT将它们转换为世界坐标空间还是留下它们?

我知道这一定是长篇大论.非常感谢您的宝贵时间 :)

小智 1

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

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

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