我有一个校准的相机(已知的固有参数,即相机矩阵K是已知的,以及失真系数) .
我想重建相机的三维轨迹 . 关于场景没有先验知识 .
通过呈现两个看起来在同一场景上的图像并从中提取两组相应的匹配特征点(SIFT,SURF,ORB等)来简化问题我的问题是如何计算相机外部参数(即旋转矩阵) R和视点之间的平移向量t)?
我已经设法计算基本矩阵,并且因为知道了K,所以也是基本矩阵 . 使用David Nister's efficient solution to the Five-Point Relative Pose Problem我设法获得了4种可能的解决方案但是:
-
对基本矩阵E~U * diag(s,s,0)* V'的约束并不总是适用 - 导致不正确的结果 . [编辑]:采取平均奇异值似乎纠正结果:)一个下来
-
如何判断四者中哪一个是正确的?
谢谢
2 回答
恭喜你的努力,听起来像你've tried hard to learn these techniques. For actual production-strength code, I'建议下载libmv和ceres,并使用它们重新编码你的解决方案 .
您的两个问题实际上是一个:根据您收集的数据拒绝无效的解决方案 . 特别是,Nister(以及Stewenius的)算法通常用在类似RANSAC的求解器的内环中,它选择具有最佳拟合/最大内点数的解 .
您对点1的解决方案是正确的:diag((s1 s2)/ 2,(s1 s2)/ 2,0) .
至于告知四种解决方案中的哪一种是正确的,只有一种解决方案将相对于相机帧给出所有点的正深度 . 这就是你想要的那个 .
可以在此处找到用于检查哪个解决方案正确的代码:http://cs.gmu.edu/%7Ekosecka/examples-code/essentialDiscrete.m来自http://cs.gmu.edu/%7Ekosecka/bookcode.html他们使用U和V的决定因素来确定具有正确方向的解决方案 . 寻找评论"then four possibilities are" . 由于你很容易受到噪音的影响,并且如果所有的点都是共面的,那么它们的表现就不会很好 .
此外,转换仅恢复到恒定的比例因子内,因此您看到单位幅度的标准化平移向量的事实是完全正确的 . 原因是深度未知并且估计为1.你必须找到一些方法来恢复深度,就像在8点算法3d重建的代码中一样(书签代码链接中的算法5.1) .
上面的示例代码中的书籍也是一个非常好的参考书 . http://vision.ucla.edu/MASKS/第5章,您感兴趣的那个,可以在Sample Chapters链接中找到 .