gpt4 book ai didi

python - 查找相机矩阵的翻译

转载 作者:行者123 更新时间:2023-11-28 16:46:58 28 4
gpt4 key购买 nike

关于计算机视觉的另一个问题。

相机矩阵(也称为投影矩阵)将 3D 点 X(例如在现实世界中)映射到图像点 x(在照片中,对于例如)通过以下关系:

l **x** = P **X**

P 描述了相机的一些外部和内部特征(它的方向、位置和投影属性)。当我们引用投影属性时,我们使用校准矩阵 K。同样,R 表示相机的旋转和平移,因此我们可以将 P 写为:

P = K [ R | t ]

[ 右 | t ] 表示矩阵 R 和 t 的串联。

R  is a matrix 3 X 3
t is a vector 3 X 1
K is a matrix 3 X 3
[R | t ] is a matrix 3 X 4
As a consequence, P is a matrix 3 X 4

好吧,介绍够多了。我想找到相机矩阵P的翻译。根据Computer Vision with Python这本书中的代码,可以找到这样的:

def rotation_matrix(a):
""" Creates a 3D rotation matrix for rotation
around the axis of the vector a. """
a = array(a).astype('float')
R = eye(4)
R[:3,:3] = linalg.expm([[0,-a[2],a[1]],[a[2],0,-a[0]],[-a[1],a[0],0]])
return R

tmp = rotation_matrix([0,0,1])[:3,:3]
Rt = hstack((tmp,array([[50],[40],[30]])))
P = dot(K, Rt)
K, R = linalg.rq(P[:,:3])

# This part gets rid of some ambiguity in the solutions of K and R
T = diag(sign(diag(K)))
if linalg.det(T) < 0:
T[1,1] *= -1
K = dot(K, T)
R = dot(T, R) # T is its own inverse

t = dot(linalg.inv(K), P[:,3])

代码是独立的。我们有 Rt 矩阵 [R | t]P 照常计算,并执行 RQ 因式分解。但是,我不明白那部分。为什么我们只取前 3 列?然后我们得到翻译向量作为 K^{-1} 和 P 的前 3 列的点积。为什么?我还没有找到理由,但也许这是我明显遗漏的东西。

顺便说一句,代码似乎有点偏离。当我运行它时,我得到一个翻译向量 [ 50. -40. 30.] 而不是我们用作输入的 array([[50],[40],[30]])。我们应该得到完全一样的。不知道是不是旋转矩阵的问题。我也将不胜感激。

谢谢!

最佳答案

您将平移向量计算为 inv(K)P 的第 4 列的乘积。请注意,在您的代码中它说

t = dot(linalg.inv(K), P[:,3])

其中 P[:,3] 是投影矩阵的第四列,因为索引从 0 开始。这意味着返回 t 是预期的,因为 P = [KR | Kt] 所以 Kt 是第 4 列。 inv(K) * Kt = t

您可以 RQ 再次将 P[:,:3] 分解为校准矩阵 K 和旋转矩阵 R 因为 P = [KR | Kt] 并且因为校准矩阵是上三角矩阵和旋转矩阵是正交的。

至于为什么你得到的翻译向量与你预期的不同,我认为这可能是因为 QR decompositions一般来说不是唯一的。根据维基百科,只有当我们要求 R 的所有对角线元素都是正数时,它们才是唯一的。这里 R 是上三角矩阵,在你的例子中是 K

如果您的矩阵 K 在对角线上的任何位置都有一个负元素,您可能会从 QR 分解中得到不同的 K(可能只有一个符号不同)。这意味着您不会返回预期的 t

关于python - 查找相机矩阵的翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12993432/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com