我一直在尝试在 OpenCV 中为一个项目实现一个简单的 SFM 管道,但遇到了一些麻烦。
它适用于未校准的相机,所以我没有相机矩阵(是的,我知道这会让事情变得更加复杂和模糊)。
我知道在尝试这样的事情之前我应该阅读更多内容,但我的时间非常紧迫,我正在尝试阅读遇到的事情。
这是我从许多文章、代码示例和书籍中收集的当前管道。我已经发布了有关具体步骤的问题,并且还想知道我在此过程中遗漏了什么或者我做错了什么?
这是我目前的管道。
- 从图像中提取 SIFT/SURF 关键点。
- 图像的成对匹配。
- 在成对匹配期间,我运行“比率测试”以减少关键点的数量。
- (对此不确定)我读到计算基本矩阵(RANSAC)并从匹配中消除异常值会进一步帮助它。
问)我需要这样做吗?是不是太多了或者我应该做一些其他的事情,比如 Homography 来避免 8 点的退化情况?
接下来,我需要选择 2 张图像来开始重建。
- 我找到了图像对之间的 Homography Inliers 的数量。我按最大内点数的顺序遍历图像对列表。
- 我计算基本矩阵。
- 我“猜测”一个 K 矩阵并使用 Hartley's 中的公式计算基本矩阵。
- 我用 SVD 分解这个基本矩阵,然后验证 4 个解决方案。
- 我使用维基百科条目中的逻辑和这个 python gist 来实现我的检查。
问)这是对的吗?或者我应该只是对这些点进行三角测量,然后确定它们是否在相机前面,或者它是否适用于同一件事?
- 我使用维基百科条目中的逻辑和这个 python gist 来实现我的检查。
- 如果在查找基本矩阵时遇到问题,请跳过它并检查下一个图像对
设置 P=[I|0] 和 P1=[R|T],执行三角剖分并将 3d 点存储在一些数据结构中。同时存储 P 矩阵。
运行具有大量迭代的捆绑调整步骤以最小化错误。
从这里开始有点朦胧,我很确定我搞砸了。
根据观察到的最多 3d 点选择要添加的下一个图像。
- 使用 PnPRasnac 之类的方法从已知的 3D 点估计这个新图像的位姿。使用 R & t 的值作为它的投影矩阵 P1=[R|t]
对这个新图像进行三角剖分(我知道,我不需要对所有这些图像进行三角剖分)到目前为止使用它们的 P 矩阵作为 P=PMatrices[ImageAlreadyTriangulated] 和上面获得的 P1 三角剖分的图像。
Q) 真的只是使用我们使用过的 P 的原始值那么简单吗?这会让所有东西都进入同一个坐标空间吗?如中,三角点是否都与从 P 和 P1 的初始值获得的系统相同,还是我需要在这里进行某种转换?
从我们从三角测量中获得的点中,只添加我们尚未存储的那些 3D 点。
- 每几张图像后运行一次捆绑调整
- 返回第 6 步,直到添加所有图像。
一般的问题:
- 即使我的相机矩阵 K 只是一个猜测,我是否应该对这些点使用 undistort 或其他东西?
- 对于捆绑调整,我将点输出到大捆绑调整 (BAL) 格式的文件中。我应该通过 R=R' & T=-RT 将它们转换为世界坐标空间还是让它们保持原样?
我知道这一定是读了很久。非常感谢您的宝贵时间 :)