1

ポイント::(xy)は既知です。

三角形の領域内にポイントがあります。
初期位置と最終位置の頂点の座標を知っています。三角形の領域内のすべての点の初期座標を知っています。

次に、三角形の領域内のすべての点の最終的な座標を調べたいと思います

下の写真は、初期位置と最終位置のポイントを示しています。

ここに画像の説明を入力してください ここに画像の説明を入力してください

OpenCVおよびC++プラットフォームでこれを行う方法を誰かに教えてもらえますか?

任意の形状の輪郭に対してもこれを行うことはできますか?

4

2 に答える 2

4

考慮するために3D座標を使用しています

  • ベクトルによる平行移動[u v]
  • matrixabcd による 2D 線形変換

全体の変換行列は次の形式になります。

    [ a b u]
M = [ c d v]
    [ 0 0 1]
  1. 三角形から3 点A=[x1 y1 1]B=[x2 y2 1]と を取るC=[x3 y3 1]
  2. それらを変換後の位置と比較しますA' = [x1' y1' 1]およびB'=[x2' y2' 1]およびC'=[x3' y3' 1]. Id est: 計算を行って変換行列を取得しMA' = M AandB' = M BC' = M C
  3. x -> M xすべての入力ポイントに適用

編集:変換マトリックスの翻訳Mを使用して、マトリックスに翻訳を組み込みます

編集:「あなたの計算を行う」ことはあなたにとって明確ではないようです。

3 つの方程式は次のように書けることがわかります。

[x1' x2' x3']     [x1 x2 x3]
[y1' y2' y3'] = M [y1 y2 y3]
[1   1   1  ]     [1  1  1 ]

また

X' = M X

または

M = X . X'^-1

はい、OpenCVにはinv()行列に関する機能があります。

于 2013-02-27T10:12:17.763 に答える
2

数学的には、元の三角形の各点の重心座標を計算し、新しい座標を使用して位置に戻すことでこれを行うことができます。

given initial triangle vertices A, B, and C, and point p,
find barycentric coordinates (a,b,c) such that a+b+c=1 and p = a*A + b*B + c*C:
  -> solve  [A.x B.x C.x]   [a]     [p.x]
            [A.y B.y C.y] * [b]  =  [p.y]
            [ 1   1   1 ]   [c]     [ 1 ]

then, given new vertices D, E, and F,
resulting point q = a*D + b*E + c*F:
  -> compute  [q.x]  =  [D.x E.x F.x] * [a]
              [q.y]     [D.y E.y F.y]   [b]
                                        [c]

したがって、OpenCV では次のようになります。

float p_data[3] =
  { p.x,
    p.y,
    1.0
  };
Mat_<float> p(3, 1, p_data);

float m_data[9] =
  { A.x, B.x, C.x,
    A.y, B.y, C.y,
    1.0, 1.0, 1.0
  };
Mat_<float> M(3, 3, m_data);

Mat_<float> bary(3,1);
cv::solve(M, p, bary, DECOMP_LU);

float n_data[6] =
  { D.x, E.x, F.x,
    D.y, E.y, F.y
  };
Mat_<float> N(2, 3, n_data);

Mat_<float> result(2,1) = N * bary;

point_countポイントを同時にマッピングするにはp、 、bary、およびの列数resultをのpoint_count代わりに設定します1(それに応じて のサイズを大きくするp_dataなど)。

アプリケーションによっては、最初にアフィン行列を明示的に計算し、それを直接適用する方が便利/効率的です。

Mat_<float> Affine = N * M.inv();
Mat_<float> result = Affine * p;
于 2013-02-28T01:22:14.213 に答える