【问题标题】:Projection matrix from Fundamental matrix基本矩阵的投影矩阵
【发布时间】:2013-08-03 20:15:20
【问题描述】:
我已经获得了两个相机之间的基本矩阵。我也将它们的内部参数放在我之前通过棋盘获得的3 X 3 矩阵中。使用基本矩阵,我得到了P1和P2 by
P1 = [I | 0] 和 P2 = [ [e']x * F | e']
这些投影矩阵在获取准确的 3D 位置方面并不是很有用。
因为,我有内部参数K1和K2,所以我把P1和P2改成了
P1 = K1 * [I | 0] 和 P2 = K2 * [ [e']x * F | e']
- 这是获得真实投影矩阵的正确方法,它给出了 3D 世界和图像之间的实际关系?
- 如果不是,请帮助我了解正确的方法以及我哪里出错了。
- 如果这是正确的方法,我该如何验证这些矩阵?
【问题讨论】:
标签:
matlab
opencv
computer-vision
camera-calibration
【解决方案1】:
刚遇到这个问题,想对这个问题给出更直接的答案。
当P1 = [I, 0] 是您的第一个投影矩阵但它应该是P1 = K1 * [I, 0] 时,那么您的“世界”会被4x4 矩阵M = [K1, 0; 0, 1] 扭曲。世界中的任何点X 投影到x1 = P1 * X = (P1 * M) * (M^-1 * X) = P1' * X',其中X' 现在是“未扭曲世界”中的点(注意X = M * X' 再次是“扭曲世界”中的点)并且P1' = P1 * M = [I, 0] * [K1, 0; 0, 1] = K1 * [I, 0] 是未失真世界中的投影矩阵。
类似地,P2' = P1 * M 是未失真世界中的投影矩阵,形式为P2' = [ [e']x * F | e'] * [K1, 0; 0, 1] = [ [e']x * F * K1 | e']。
请注意,P2 = [ [e']x * F | e'] 只是一种可能的投影矩阵,但对于一些实数 s 和 3 向量 v,通常具有 P2 = [ [e']x * F + e' * v^T | s * e'] 的形式。进一步注意,如果您想为某个旋转矩阵R 找到形式为P2' ~ K2 * [R, t] 的投影矩阵,您最好使用基于 Damien 概述并在 Hartley&Zisserman(2.Ed) 中描述的基本矩阵的算法) 秒。 9.6.2.
【解决方案2】:
Hartley 和 Zisserman 的“计算机视觉中的多视图几何”是一本很好的参考书。
首先,您的 P 公式是错误的。如果你想要里面有K的公式,那就是
P = K * [R | t]
或
P = [ [e']x * F | e']
但不是两者兼而有之。
如果您通过 8 点算法计算 F,那么您只能将射影几何恢复到 3D 单应性(即 4x4 变换)。
要升级到欧几里得空间,有两种可能性,都从计算本质矩阵开始。
第一种可能性是从 F 计算基本矩阵:E = transpose(K2)*F*K1。
第二种可能性,是直接估计这两个视图的本质矩阵:
- 通过预先乘以每个图像的 K 倒数来标准化您的 2D 点(“标准化图像坐标”)
- 对这些归一化点应用(与 F 相同)8 点算法
- 通过 SVD 分解和强制对角值强制基本矩阵的 2 个奇异值等于 1,最后一个为 0。
一旦你有了基本矩阵,我们就可以计算投影矩阵的形式
P = K * [R | t]
由于 E 的 SVD 的元素,可以找到 R 和 t(参见前面提到的书)。
但是,您将有 4 种可能性。其中只有一个在两个摄像头前面投射点,因此您应该测试一个点(如果您确定的话)以消除 4 个之间的歧义。
在这种情况下,您将能够在 3D 场景中放置相机及其方向(投影的 R 和 t)。
确实不那么明显……