コンピューター ビジョンに関する別の質問です。
カメラ行列 (射影行列とも呼ばれます) は、次の関係を介して、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]])
られます。まったく同じになるはずです。これが回転行列によるものかどうかはわかりません。また、それについて何か助けていただければ幸いです。
ありがとう!