关于计算机视觉的另一个问题。
相机矩阵(也称为投影矩阵)通过以下关系将 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]])
我们用作输入的那个。我们应该得到完全相同的结果。我不知道这是否是由于旋转矩阵。我也将不胜感激任何帮助。
谢谢!