3

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 マトリックスへの正しいマッピングは何ですか?

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

4

1 に答える 1

2

さまざまな問題が発生する可能性があります:

まず、マトリックスの逆を試す必要があります (取得した変換が実際に宛先からソースへの変換である場合)。mat.inv() を使用するか、getPerspectiveMatrix に送信されるパラメーターを交換します。

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

透視変換行列の作成に関するこの非常に良い投稿も確認してください 。

于 2011-10-28T11:27:36.893 に答える