Point ::(x y)是已知的。變形點在飛機上
我在三角形區域內有點。
我知道初始位置和最終位置的頂點座標。我知道三角形區域內所有點的初始座標。
現在我想找出三角區域內所有點的最終座標。
下圖顯示了初始位置和最終位置上的點。
誰能告訴我如何做到這一點在OpenCV中和C++平臺?
我還可以爲任意形狀的輪廓做這個嗎?
Point ::(x y)是已知的。變形點在飛機上
我在三角形區域內有點。
我知道初始位置和最終位置的頂點座標。我知道三角形區域內所有點的初始座標。
現在我想找出三角區域內所有點的最終座標。
下圖顯示了初始位置和最終位置上的點。
誰能告訴我如何做到這一點在OpenCV中和C++平臺?
我還可以爲任意形狀的輪廓做這個嗎?
我用三維座標通過矢量考慮
[u v]
由2D線性變換整體變換矩陣將有形式
[ 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
和B' = M B
和C' = M C
x -> M x
每一個輸入點編輯:納入翻譯使用Translation in transformation matrix
編輯矩陣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
(while增加p_data
大小相應地,等等)
根據應用的不同,它可能會更方便/高效首先明確地計算仿射矩陣,並把它directiy:
Mat_<float> Affine = N * M.inv();
Mat_<float> result = Affine * p;
所以..怎麼樣第三個頂點?三個頂點隨機移位... – 2vision2 2013-02-27 10:15:19
你說得對。我忘了一個可能的翻譯。 – rds 2013-02-27 10:28:54
現在我有6個未知變量(4個在M中,2個在T中)和6個等式(每個變換* 3個變換2個)。 Eveything聽起來不錯:) – rds 2013-02-27 10:32:35