18

私はOpenCVによって計算されたホモグラフィを扱っています。現在、このホモグラフィを使用して、以下の関数を使用してポイントを変換しています。この関数は私が必要とするタスクを実行しますが、実際にどのように機能するかはわかりません。

最後の3行のコードの背後にあるロジック/理論を1行ずつ正確に説明できますか?これが点x、yを変換することは理解していますが、なぜこれが機能するのかは不明です:

なぜ はZ、このようpxpy計算され、 の要素は何にh対応するのでしょうか?

あなたのコメントは大歓迎です:)

double h[9];
homography = cvMat(3, 3, CV_64F, h);
CvMat ps1 = cvMat(MAX_CALIB_POINTS/2,2,CV_32FC1, points1);
CvMat ps2 = cvMat(MAX_CALIB_POINTS/2,2,CV_32FC1, points2);

cvFindHomography(&ps1, &ps2, &homography, 0);

...

// This is the part I don't fully understand
double x = 10.0;
double y = 10.0;
double Z = 1./(h[6]*x + h[7]*y + h[8]);
px = (int)((h[0]*x + h[1]*y + h[2])*Z);
py = (int)((h[3]*x + h[4]*y + h[5])*Z);
4

2 に答える 2

34

cvFindHomography()同次座標を使用した行列を返します:

同次座標は、変換、回転、スケーリング、透視投影などの一般的な操作を行列操作として実装できるため、コンピューター グラフィックスではどこにでもあります。

コードで何が起こっているか: デカルト ポイントp_origin_cartesian(x,y)が同次座標に変換され、次に 3x3 透視変換マトリックスhが適用され、結果がデカルト座標に変換されますp_transformed_cartesian(px,py)

アップデート

詳細に:

p_origin_cartesianに変換p_origin_homogenous:

(x,y)  =>  (x,y,1)

透視変換を行う:

p_transformed_homogenous = h * p_origin_homogenous =

(h0,h1,h2)    (x)   (h0*x + h1*y + h2)   (tx)   
(h3,h4,h5)  * (y) = (h3*x + h4*y + h5) = (ty) 
(h6,h7,h8)    (1)   (h6*x + h7*y + h8)   (tz)

p_transformed_homogenousに変換p_transformed_cartesian:

(tx,ty,tz)  =>  (tx/tz, ty/tz) 

翻訳されたコード:

px = tx/tz;
py = ty/tz;
Z  = 1/tz;
于 2012-02-14T10:54:45.587 に答える