4x4行列を3x3行列に変換するにはどうすればよいですか?

私はiOS上でARアプリケーションを作成しており、UIViewでCATransform3D変換を使用しています。

OpenCVを通して、私はcvGetPerspectiveTransform()を呼び出すことによってパースペクティブマトリックスを得ることができます。これは、3x3の行列を返します。

私はどこでそれを見つけたのか覚えていませんが、私は次のようなサンプルコードを持っていました:

//the opencv transform matrix is put into map_matrix
cvGetPerspectiveTransform (src_pnt, dst_pnt, map_matrix);

CATransform3D t = CATransform3DIdentity;

// map over the CATransform3D 4x4 matrix from the opencv 3x3 matrix
t.m11 = cvmGet(map_matrix,0,0); 
t.m12 = cvmGet(map_matrix,1,0); 
t.m14 = cvmGet(map_matrix,2,0); 
t.m21 = cvmGet(map_matrix,0,1); 
t.m22 = cvmGet(map_matrix,1,1); 
t.m24 = cvmGet(map_matrix,2,1); 
t.m41 = cvmGet(map_matrix,0,2); 
t.m42 = cvmGet(map_matrix,1,2); 
t.m44 = cvmGet(map_matrix,2,2); 

myView.layer.transform = t;

しかし、このフォームを適用すると、私の見解が狂ってしまい、その場でジャンプしてしまいます。少し実験をして、私はこれらの3つのマッピングだけがいくらか働くことを発見しました:

t.m14 = cvmGet(map_matrix,2,0); //left and right transform
t.m24 = cvmGet(map_matrix,2,1); //up and down transform
t.m21 = cvmGet(map_matrix,0,1); //some kind of skew?

私は3Dグラフィックスと変換数学を読んできましたが、それはかなり難しい作業です。

3x3マトリックスからの4x4マトリックスの正しいマッピングは何でしょうか?

ありがとうございました!

3

1 答え

異なる問題があるかもしれません:

まず、行列の逆行列を試す必要があります(実際には変換先がソースからソースになっている場合)。 mat.inv()を使用するか、getPerspectiveMatrixに送信されたパラメータをスワップします。

問題が解決しない場合は、3x3マトリックスを回転と平行移動に分解し、組み合わせて4x4マトリックスを形成する必要があります。近似解は、最後の行と3番目の列(3D回転に対応)を削除することですが、これはおおよその近似に過ぎません。

Please check also this very good post about creating perspective transform matrices Opencv virtually camera rotating/translating for bird's eye view

2
追加された
ありがとう、これは良い読書です!
追加された 著者 kurisukun,