P1
和 P2
:
P1 = [I | 0]
和 P2 = [ [e']x * F | e']
K1
和 K2
,我将 P1
和 P2
更改为:
P1 = K1 * [I | 0]
和 P2 = K2 * [ [e']x * F | e']
- 这是获得实际投影矩阵的正确方法,以便给出三维世界和图像之间的实际关系吗?
- 如果不是,请帮我理解正确的方法和我的错误之处。
- 如果这是正确的方法,请问如何验证这些矩阵?
P1
和 P2
:
P1 = [I | 0]
和 P2 = [ [e']x * F | e']
K1
和 K2
,我将 P1
和 P2
更改为:
P1 = K1 * [I | 0]
和 P2 = K2 * [ [e']x * F | e']
P = K * [R | t]
P = [ [e']x * F | e']
但不是两者混合。
如果您使用8点算法计算出F,那么您只能恢复到一个三维单应性(即4x4变换)的射影几何。
要升级到欧几里得空间,有两种可能性,都始于计算本质矩阵。
第一种可能性是从F计算本质矩阵:E = transpose(K2)*F*K1。
第二种可能性是直接估计这两个视图的本质矩阵:
一旦您有了本质矩阵,我们就可以计算投影矩阵,形式如下:
P = K * [R | t]
通过E的奇异值分解可以找到R和t(参见之前提到的书)。 然而,你将有4种可能性。只有一种情况可以将点投影到两个相机的前方,所以你需要测试一个点(如果你确定它),以消除4种可能性中的歧义。 在这种情况下,你将能够在你的3D场景中放置相机和其方向(使用投影的R和t)。
确实不太明显...
刚看到这个问题,想给出一个更直接的答案。
当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']
只是一个可能的投影矩阵,但通常具有形式 P2 = [ [e']x * F + e' * v^T | s * e']
,其中 s
是实数,v
是三维向量。此外,请注意,如果您想找到形如 P2' ~ K2 * [R, t]
的投影矩阵,其中 R
是旋转矩阵,则最好使用基于本质矩阵的算法,该算法由Damien概述并在Hartley&Zisserman(第2版)第9.6.2节中描述。