2013-02-27 60 views
1

Point ::(x y)是已知的。變形點在飛機上

我在三角形區域內有點。
我知道初始位置和最終位置的頂點座標。我知道三角形區域內所有點的初始座標。

現在我想找出三角區域內所有點的最終座標。

下圖顯示了初始位置和最終位置上的點。

enter image description hereenter image description here

誰能告訴我如何做到這一點在OpenCV中和C++平臺?

我還可以爲任意形狀的輪廓做這個嗎?

回答

4

我用三維座標通過矢量考慮

  • 翻譯[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:做你的數學,以獲得變換矩陣M使A' = M AB' = M BC' = M C
  3. 應用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中:

+1

所以..怎麼樣第三個頂點?三個頂點隨機移位... – 2vision2 2013-02-27 10:15:19

+1

你說得對。我忘了一個可能的翻譯。 – rds 2013-02-27 10:28:54

+2

現在我有6個未知變量(4個在M中,2個在T中)和6個等式(每個變換* 3個變換2個)。 Eveything聽起來不錯:) – rds 2013-02-27 10:32:35

2

在數學上,您可以通過計算每個點的重心座標在原來的三角形,並使用新的座標轉換回位做到這一點

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,baryresult的列數設置爲point_count而不是1(while增加p_data大小相應地,等等)

根據應用的不同,它可能會更方便/高效首先明確地計算仿射矩陣,並把它directiy:

Mat_<float> Affine = N * M.inv(); 
Mat_<float> result = Affine * p;