2012-08-09 96 views
1

我的目标是将已知矩形(例如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) 

解决!

回答

1

我解决了!我遇到的问题是多维数组A被计算并转换成一维数组的方式。因为Lapacks输入总是一维的,它似乎:)

我编辑我的问题与工作代码。

在Objective-C的工作代码中玩得开心!我在ARC的第一个MAC的Xcode 4.4项目中使用了它!