关于结构从运动流程的问题

12
我一直在尝试在OpenCV中实现一个简单的SFM流水线来完成一个项目,但遇到了一些问题。

由于是针对非标定相机,所以我没有相机矩阵(是的,我知道这会让事情变得更加复杂和模糊)。
我知道在尝试这样的事情之前应该多读一些相关资料,但时间紧迫,我正在尝试边做边学习。

以下是我从一些文章、代码示例和书籍中收集的当前流程。我将在之后发布关于具体步骤的问题,并想知道是否有什么我在做错或者遗漏的地方?

以下是我当前的流程。

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

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

    问:我需要这样做吗?这太多了吗?还是我应该做其他事情,比如使用单应性来避免8点退化情况?

  • 接下来,我需要选择两个图像开始重建。

    1. 找到图像对之间的单应性内点数量。我按照内点最多的图像对列表进行迭代。
    2. 计算基础矩阵。
    3. “猜测”一个K矩阵并使用Hartley公式计算本质矩阵。
    4. 使用SVD分解此本质矩阵,然后验证4个解。
      • 我使用了维基百科条目和这个Python代码片段中的逻辑来实现我的检查。

    问:这样做对吗?还是我只需三角化这些点,然后确定它们是否在相机前面,或者它们是否达到同样的效果?

  • 如果存在找到本质矩阵的问题,则跳过该步骤并检查下一个图像对。
  • 设置P=[I|0]和P1=[R|T],执行三角测量并将3D点存储在某个数据结构中。还要存储P矩阵。

  • 运行Bundle Adjustment步骤,进行大量迭代以最小化误差。

    从这里开始有点模糊,我很确定我搞错了什么。

  • 根据观察到的3D点数量最多的图像选择下一个要添加的图像。

  • 使用类似于PnPRasnac的方法,从已知的3D点中估计新图像的姿态。将R和t的值用作其投影矩阵P1=[R|t]。
  • 使用它们的P矩阵作为P=PMatrices[ImageAlreadyTriangulated]以及上面得到的P1,对迄今为止三角化的所有图像进行三角化。(我知道我不需要使用全部的图像进行三角化)

    问:只是使用我们已经使用过的P的原始值真的就这么简单吗? 这样做会把所有东西都放入相同的坐标系中吗?也就是说,从三角测量得到的三角化点与从初始P和P1的值获得的点是相同的系统,还是我需要在这里执行某种转换?

  • 从我们从三角化得到的点中,只添加那些我们还没有存储的3D点。

  • 每隔几张图像运行一次捆绑调整。
  • 回到第6步,直到所有图像都被添加。
  • 一般问题:

    • 即使我的相机矩阵K只是一个猜测,我是否应该使用undistort对点进行处理或其他处理方式?
    • 对于捆绑调整,我将点输出到符合Bundle Adjustment at Large(BAL)格式的文件中。我应该通过 R=R' & T=-RT 将它们转换为世界坐标系,还是保持不变?

    我知道这可能会读起来很长。非常感谢你的时间 :)


    也许可以看一下这位作者的论文: http://www.graphics.rwth-aachen.de/person/21/我知道他使用了运动结构技术,但我不确定他是否在论文中解释了所有内容。 - Micka
    我不知道第二个问题的答案,但对于第一个问题。通常我会先去畸变点,但是我读到AR库(如Metaio)并没有真正使用镜头畸变,所以也许你可以放弃这一步。 - sub_o
    一些注释:A. 步骤2.2和步骤3.1+3.2不是多余的吗? B. 在第6步中,您如何知道另一张图像是否观察到任何已知的3D点? C. 在第8步中,“用到目前为止三角化的所有图像对这个新图像进行三角化”是什么意思? D. 您能澄清一下您的第二个通用问题吗?它是关于存储文件格式还是3D坐标系统? E. 最终,您真正感兴趣的是估计3D场景、3D轨迹还是两者都是? - BConic
    2个回答

    2
    您提出的流程基本正确,除了3.1。
    2.2)正确。RANSAC随机选择点来估计基础矩阵,并且足够强大以处理离群值(当然,您需要有足够的有效匹配)。单应性离群值不一定是坏匹配,因此不应该使用单应性过滤匹配。
    3.1)不正确:单应性内点是在两个视图中完全对齐的匹配,例如在两个视图之间表现出比例或相似运动的点。这意味着,在视图对中,单应性内点的数量越高,该视图对作为基线三角测量的种子的可行性越低。这样的两个视图的相机矩阵从通过RANSAC估计的基础矩阵中得出的可能会不准确,重建将无法进行。您要做的是,从具有最低百分比单应性内点但仍具有较高匹配数的视图对开始。不幸的是,具有最高匹配数的图像对通常也具有最高数量的单应性内点。这是由于通常这些对包含非常少的相机移动...
    3.4)我的做法是尝试使用所有四种可能的相机矩阵模糊。R1 | t1,R1 | t2,R2 | t1,R2 | t2
    8)是的

    1
    我可以推荐这篇文章; https://github.com/godenlove007/master-opencv-book/tree/master/Chapter4_StructureFromMotion 为了构建它,您需要SSBA和PCL库作为先决条件。 SSBA相当简单,但如果您计划使用Visual Studio 2013,则PCL可能会有些棘手。在这种情况下,您必须从源代码构建PCL的先决条件,这将需要一些时间。
    一旦您构建了该项目,您可以查看那个人是如何做的,并与您的想法进行比较。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接