【问题标题】:Finding translation of the camera matrix寻找相机矩阵的平移
【发布时间】:2012-10-11 04:48:31
【问题描述】:

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

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

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

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

P = K [ R | t ]

[ R | 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]])。我们应该得到完全相同的结果。我不知道这是否是由于旋转矩阵。我也将不胜感激。

谢谢!

【问题讨论】:

    标签: python camera computer-vision translation linear-algebra


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 优秀的答案。正确的!我对 P[:,3] 感到困惑。我不知道你可以做 K[R|t] = [KR | Kt]。有cmet吗?关于我得到的不同向量,绝对是,但我认为这个问题是用 T 来解决的。我做了一个测试,它工作正常。
    • 好吧 K[R|t] = [KR | Kt] 来自这样一个事实,即当您将矩阵 A * B 相乘时,您所做的是 A * [b1 b2 .. bn] = [Ab1 .. Abn]。您正在使用 A 转换 B 的列空间。或者换句话说,通过将 A 的每一行与 B 的 n 列的点积来获得 A*B 的列 n。
    猜你喜欢
    • 1970-01-01
    • 2013-06-09
    • 2013-12-06
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    相关资源
    最近更新 更多