OpenCV でアフィン変換を行っていますが、その動作を直感的に理解するのに苦労しています。具体的には、特定の目的の結果を得るためにマップ マトリックスのパラメーターを指定する方法を教えてください。
質問を設定するために、私が使用している手順は、最初にワープマトリックスを定義してから変換を行うことです。
OpenCV の 2 つのルーチンは次のとおりです (Bradski & Kaehler による優れた本 OpenCV の例を使用しています)。
cvGetAffineTransorm(srcTri, dstTri, warp_matrix);
cvWarpAffine(src, dst, warp_mat);
ワープ マトリックスを定義するには、srcTri
次のdstTri
ように定義します。
CvPoint2D32f srcTri[3], dstTri[3];
srcTri[3]
次のように入力されます。
srcTri[0].x = 0;
srcTri[0].y = 0;
srcTri[1].x = src->width - 1;
srcTri[1].y = 0;
srcTri[2].x = 0;
srcTri[2].y = src->height -1;
これは基本的に、画像の左上の点、右上の点、および左下の点で、行列の開始点となります。この部分は私には理にかなっています。
しかし、dstTri[3]
just の値は紛らわしいです。少なくとも、1 つのポイントを変更すると、期待した結果が得られません。
たとえば、次のように使用すると、次のようになりますdstTri[3]
。
dstTri[0].x = 0;
dstTri[0].y = 0;
dstTri[1].x = src->width - 1;
dstTri[1].y = 0;
dstTri[2].x = 0;
dstTri[2].y = 100;
src ポイントと dst ポイントの唯一の違いは、左下のポイントが 100 ピクセル右に移動することです。直感的には、画像の下の部分を100ピクセル右にずらした方がいい気がしますが、そうではありません。
また、 に使用するのとまったく同じ値をdstTri[3]
に使用するsrcTri[3]
と、変換によってまったく同じ画像が生成されると思いますが、そうではありません。
明らかに、ここで何が起こっているのか理解できません。srcTri[]
では、 からへのマッピングは何をdstTri[]
表しているのでしょうか。