我的目標是將已知矩形(例如800×600屏幕)的透視座標轉換爲偏斜/旋轉的四邊形。要做到這一點,我發現這是非常有幫助的:Transforming captured co-ordinates into screen co-ordinates用xcode計算A = USVt中的V,用xcode中的LAPACK計算SVD
我想這個問題還有更多的解決方案。 1通過在你的四邊形外面製作三角形並應用一些我還不能解決的數學函數。 或使用來自公式A = USVt的H矩陣。這看起來不錯,因爲一旦你有了正確的H矩陣,你可以很容易地轉換任何座標,如上面的鏈接所述。所以我想我會去那個!
經過一番努力,我能夠在matlab中做到這一點(我測試了上面的鏈接),它的工作:)但現在在Objective-C ?!
我寫下了以(A = USVt)的A開頭的代碼。爲了計算Vt,這是我第一次進入H矩陣的下一步,我應該使用與matlab相似的函數[U S V] = SVD(A);功能。所以我在這裏找到了:Calling MATLAB's built-in LAPACK/BLAS routines爲了做到這一點,你可以包含speeds.h框架,然後可以使用C-LAPACK等效的dgesvd _(...);
b.t.w.我使用與Transforming captured co-ordinates into screen co-ordinates相同的座標使其更容易測試。
求助IT 我遇到的問題是多維數組A被計算和翻譯成一維數組的方式。因爲Lapacks輸入總是一維的,所以似乎:)
我還包括數組A的計算方式。 WP =網絡攝像頭和SC = 800 * 600屏幕。
float WP[4][3];
WP[0][0] = 98;
WP[0][1] = 86;
WP[0][2] = 1;
WP[1][0] = 119;
WP[1][1] = 416;
WP[1][2] = 1;
WP[2][0] = 583;
WP[2][1] = 80;
WP[2][2] = 1;
WP[3][0] = 569;
WP[3][1] = 409;
WP[3][2] = 1;
float SC[4][3];
SC[0][0] = 0;
SC[0][1] = 0;
SC[0][2] = 1;
SC[1][0] = 799;
SC[1][1] = 0;
SC[1][2] = 1;
SC[2][0] = 0;
SC[2][1] = 599;
SC[2][2] = 1;
SC[3][0] = 799;
SC[3][1] = 599;
SC[3][2] = 1;
float A[9][8];
int i=0;
int j=0;
float X[3], x, y;
for (i=0; i<4; i++) {
X[0] = WP[i][0];
X[1] = WP[i][1];
X[2] = WP[i][2];
x = SC[i][0]; y = SC[i][1];
A[0][j] = 0; A[1][j] = 0; A[2][j] = 0; A[3][j] = -X[0]; A[4][j] = -X[1];
A[5][j] = -1; A[6][j] = y*X[0]; A[7][j] = y*X[1]; A[8][j] = y;
j++;
A[0][j] = X[0]; A[1][j] = X[1]; A[2][j] = 1; A[3][j] = 0; A[4][j] = 0;
A[5][j] = 0; A[6][j] = (-x)*X[0]; A[7][j] = (-x)*X[1]; A[8][j] = (-x);
j++;
}
int m = 8;
int n = 9;
int p = (m < n ? m : n);
double B[m*n];
//Recalculate multidimentional A to one-dimentional array B for LAPACK
int k = 0;
for (i=0; i<n; i++) {
for (j=0; j<m; j++) {
B[k]=A[i][j];
// NSLog(@"%f", A[i][j]);
k++;
}
}
double U[m*m];
double VT[n*n];
double S[p * 1];
int info=0;
double work[5*m];
int lwork = 5*m;
//do the actual computation
dgesvd_("N","A", &m, &n, B, &m, S, U, &m, VT, &n, work, &lwork, &info);
for (int i=0; i<(n*n); i++) {
NSLog(@"%f", VT[i]);
}
// NEXT STEP IN MATLAB, have to still translate this to C-language
// H = transpose(reshape(V(:,end),[3 3]));
// H = H/H(3,3);
然後在matlab中,我們取Vt的最後一列,並在3x3矩陣中對其進行整形。並轉置這使它變成H.
0.0001
0.0099
-0.8647
0.0054
-0.0003
-0.5021
-0.0000
-0.0000
0.0045
Vt_reshaped = reshape(V(:,end),[3 3]);
H = transpose(Vt_reshaped)
解決!