我一直在尝试在OpenCV中实现一个简单的SFM流水线来完成一个项目,但遇到了一些问题。
由于是针对非标定相机,所以我没有相机矩阵(是的,我知道这会让事情变得更加复杂和模糊)。
我知道在尝试这样的事情之前应该多读一些相关资料,但时间紧迫,我正在尝试边做边学习。
以下是我从一些文章、代码示例和书籍中收集的当前流程。我将在之后发布关于具体步骤的问题,并想知道是否有什么我在做错或者遗漏的地方?
如果存在找到本质矩阵的问题,则跳过该步骤并检查下一个图像对。
使用类似于PnPRasnac的方法,从已知的3D点中估计新图像的姿态。将R和t的值用作其投影矩阵P1=[R|t]。
每隔几张图像运行一次捆绑调整。
回到第6步,直到所有图像都被添加。
由于是针对非标定相机,所以我没有相机矩阵(是的,我知道这会让事情变得更加复杂和模糊)。
我知道在尝试这样的事情之前应该多读一些相关资料,但时间紧迫,我正在尝试边做边学习。
以下是我从一些文章、代码示例和书籍中收集的当前流程。我将在之后发布关于具体步骤的问题,并想知道是否有什么我在做错或者遗漏的地方?
以下是我当前的流程。
- 从图像中提取SIFT/SURF关键点。
- 成对匹配图像。
- 在成对匹配期间,我运行“比率测试”以减少关键点的数量。
- (不确定)我读到计算基础矩阵(RANSAC)并从匹配中去除离群值可以进一步帮助它。
问:我需要这样做吗?这太多了吗?还是我应该做其他事情,比如使用单应性来避免8点退化情况?
接下来,我需要选择两个图像开始重建。
- 找到图像对之间的单应性内点数量。我按照内点最多的图像对列表进行迭代。
- 计算基础矩阵。
- “猜测”一个K矩阵并使用Hartley公式计算本质矩阵。
- 使用SVD分解此本质矩阵,然后验证4个解。
- 我使用了维基百科条目和这个Python代码片段中的逻辑来实现我的检查。
问:这样做对吗?还是我只需三角化这些点,然后确定它们是否在相机前面,或者它们是否达到同样的效果?
设置P=[I|0]和P1=[R|T],执行三角测量并将3D点存储在某个数据结构中。还要存储P矩阵。
运行Bundle Adjustment步骤,进行大量迭代以最小化误差。
从这里开始有点模糊,我很确定我搞错了什么。
根据观察到的3D点数量最多的图像选择下一个要添加的图像。
使用它们的P矩阵作为P=PMatrices[ImageAlreadyTriangulated]以及上面得到的P1,对迄今为止三角化的所有图像进行三角化。(我知道我不需要使用全部的图像进行三角化)
问:只是使用我们已经使用过的P的原始值真的就这么简单吗? 这样做会把所有东西都放入相同的坐标系中吗?也就是说,从三角测量得到的三角化点与从初始P和P1的值获得的点是相同的系统,还是我需要在这里执行某种转换?
从我们从三角化得到的点中,只添加那些我们还没有存储的3D点。
一般问题:
- 即使我的相机矩阵K只是一个猜测,我是否应该使用undistort对点进行处理或其他处理方式?
- 对于捆绑调整,我将点输出到符合Bundle Adjustment at Large(BAL)格式的文件中。我应该通过 R=R' & T=-RT 将它们转换为世界坐标系,还是保持不变?
我知道这可能会读起来很长。非常感谢你的时间 :)