3

コンピューター ビジョンに関する別の質問です。

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

ありがとう!

4

1 に答える 1

4

inv(K)の 4 列目Pの乗算として並進ベクトルを計算します。あなたのコードでそれが言うことに注意してください

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

は、インデックス付けが 0 から始まるため、射影P[:,3]行列の 4 番目の列です。これは、4 番目の列であるため、元に戻ることtが期待されることを意味します。P = [KR | Kt]Ktinv(K) * Kt = t

キャリブレーション行列は上三角行列であり、回転行列は直交するため、 RQ 分解を再度P[:,:3]キャリブレーション行列Kと回転行列に行うことができます。RP = [KR | Kt]

予想とは異なる変換ベクトルが得られる理由については、 QR 分解が一般的に一意ではないという事実が原因である可能性があると思います。ウィキペディアによると、それらはすべての対角要素Rが正である必要がある場合にのみ一意です。あなたRの場合の上三角行列は次のとおりKです。

行列Kが対角のどこかに負の要素を持っている場合K、QR 分解とは異なる (おそらく符号が 1 つだけ異なる) ものが返される可能性があります。これは、期待どおりの結果が得られないことを意味しますt

于 2012-10-21T00:43:21.557 に答える