2016-03-05 53 views
2

我已經在2D中構建了一個矩形,並且它們的座標已經應用了透視變換之後的4個點的座標。從MATLAB中的4個點計算2D齊次透視變換矩陣

enter image description here

透視變換在齊次座標計算並通過一個3×3矩陣M定義。如果矩陣不知道,我如何從給定的點計算它?

用於一個點的計算是:

| M11 M12 M13 | | P1.x | | w*P1'.x | 
| M21 M22 M23 | * | P1.y | = | w*P1'.y | 
| M31 M32 M33 | | 1 | | w*1  | 

要同時計算所有點我寫在一起在一個矩陣A和類似的變換點以矩陣B

| P1.x P2.x P3.x P4.x | 
A = | P1.y P2.y P3.y P4.y | 
    | 1 1 1 1 | 

所以等式爲M*A=B,並且這可以通過M = B/AM = (A'\B')'在MATLAB中解決爲M

但這並不容易。我知道轉換後點的座標,但我不知道確切的B,因爲存在因子w,並且在齊次轉換後不需要1。因爲在齊次座標中,矢量的每個倍數都是相同的點,我不知道我會得到多少。

考慮到這些未知因素我寫的公式爲M*A=B*W 其中W與係數w1對角矩陣... W4爲在對角線上的B的每一個點。所以AB現在是完全已知的,我必須解決這個公式爲MW

如果我能方程重新進入形式x*A=BA*x=B其中x會像M*W我可以解決這個問題,並知道了M*W的解決辦法或許是已經足夠。然而,儘管嘗試了所有可能的重新安排,但我沒有設法做到這一點。直到它碰到我,封裝(M*W)將不可能,因爲一個是3x3矩陣,另一個是4x4矩陣。在這裏,我卡住了。

另外M*A=B*W沒有針對M的單一解決方案,因爲M的每個倍數都是相同的轉換。把它寫成一個線性方程組,可以簡單地修復M的其中一個條目以獲得單個解決方案。此外,可能有輸入沒有M的解決方案,但我們現在不用擔心這一點。

我實際上試圖實現的是某種矢量圖形編輯程序,用戶可以拖動形狀的邊界框的角來轉換它,而在內部計算轉換矩陣。

實際上,我需要JavaScript,但如果我甚至無法在MATLAB中解決這個問題,我完全被卡住了。

回答

2

應該是一個簡單的問題。那麼我如何才能將M*A=B*W變成可解決的形式?這只是矩陣乘法,所以我們可以把它寫成一個線性方程組。你知道像:M11*A11 + M12*A21 + M13*A31 = B11*W11 + B12*W21 + B13*W31 + B14*W41。線性方程組的每個系統都可以寫成Ax=b的形式,或者避免與我的問題中已經使用的變量混淆:N*x=y。就這樣。

根據我的問題的一個例子:我生成具有已知MW一些輸入數據:

M = [ 
    1 2 3; 
    4 5 6; 
    7 8 1 
]; 
A = [ 
    0 0 1 1; 
    0 1 0 1; 
    1 1 1 1 
]; 
W = [ 
    4 0 0 0; 
    0 3 0 0; 
    0 0 2 0; 
    0 0 0 1 
]; 
B = M*A*(W^-1); 

然後我忘記MW。意思我現在有13個變量我正在尋求解決。我把M*A=B*W改寫成一個線性方程組,並從那裏轉換成N*x=y的形式。在N每列具有用於一個可變的因素:

N = [ 
    A(1,1) A(2,1) A(3,1)  0  0  0  0  0  0 -B(1,1)  0  0  0; 
     0  0  0 A(1,1) A(2,1) A(3,1)  0  0  0 -B(2,1)  0  0  0; 
     0  0  0  0  0  0 A(1,1) A(2,1) A(3,1) -B(3,1)  0  0  0; 
    A(1,2) A(2,2) A(3,2)  0  0  0  0  0  0  0 -B(1,2)  0  0; 
     0  0  0 A(1,2) A(2,2) A(3,2)  0  0  0  0 -B(2,2)  0  0; 
     0  0  0  0  0  0 A(1,2) A(2,2) A(3,2)  0 -B(3,2)  0  0; 
    A(1,3) A(2,3) A(3,3)  0  0  0  0  0  0  0  0 -B(1,3)  0; 
     0  0  0 A(1,3) A(2,3) A(3,3)  0  0  0  0  0 -B(2,3)  0; 
     0  0  0  0  0  0 A(1,3) A(2,3) A(3,3)  0  0 -B(3,3)  0; 
    A(1,4) A(2,4) A(3,4)  0  0  0  0  0  0  0  0  0 -B(1,4); 
     0  0  0 A(1,4) A(2,4) A(3,4)  0  0  0  0  0  0 -B(2,4); 
     0  0  0  0  0  0 A(1,4) A(2,4) A(3,4)  0  0  0 -B(3,4); 
     0  0  0  0  0  0  0  0  1  0  0  0  0 
]; 

而且y是:

y = [ 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 1 ]; 

通知書的最後一行中N其溶液中描述的等式根據y是1。這就是我在我的問題中提到的,您必須修復M的條目之一以獲得單一解決方案。 (我們可以做到這一點,因爲每M多是相同的變換),並用這個公式我說M33應爲1

我們解決這個問題的x

x = N\y 

,並得到:

x = [ 1.00000; 2.00000; 3.00000; 4.00000; 5.00000; 6.00000; 7.00000; 8.00000; 1.00000; 4.00000; 3.00000; 2.00000; 1.00000 ] 

這對於[ M11, M12, M13, M21, M22, M23, M31, M32, M33, w1, w2, w3, w4 ]

當在JavaScript這樣做,我可以用解決方案3210庫,它具有所需的功能solve來解決Ax = b。