ポイント::(xy)は既知です。
三角形の領域内にポイントがあります。
初期位置と最終位置の頂点の座標を知っています。三角形の領域内のすべての点の初期座標を知っています。
次に、三角形の領域内のすべての点の最終的な座標を調べたいと思います。
下の写真は、初期位置と最終位置のポイントを示しています。
OpenCVおよびC++プラットフォームでこれを行う方法を誰かに教えてもらえますか?
任意の形状の輪郭に対してもこれを行うことはできますか?
ポイント::(xy)は既知です。
三角形の領域内にポイントがあります。
初期位置と最終位置の頂点の座標を知っています。三角形の領域内のすべての点の初期座標を知っています。
次に、三角形の領域内のすべての点の最終的な座標を調べたいと思います。
下の写真は、初期位置と最終位置のポイントを示しています。
OpenCVおよびC++プラットフォームでこれを行う方法を誰かに教えてもらえますか?
任意の形状の輪郭に対してもこれを行うことはできますか?
考慮するために3D座標を使用しています
[u v]
全体の変換行列は次の形式になります。
[ a b u]
M = [ c d v]
[ 0 0 1]
A=[x1 y1 1]
とB=[x2 y2 1]
と を取るC=[x3 y3 1]
A' = [x1' y1' 1]
およびB'=[x2' y2' 1]
およびC'=[x3' y3' 1]
. Id est: 計算を行って変換行列を取得しM
、A' = M A
andB' = M B
とC' = M C
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()
行列に関する機能があります。
数学的には、元の三角形の各点の重心座標を計算し、新しい座標を使用して位置に戻すことでこれを行うことができます。
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;