【问题标题】:calculate the V from A = USVt in objective-C with SVD from LAPACK in xcode使用 xcode 中 LAPACK 的 SVD 从 Objective-C 中的 A = USVt 计算 V
【发布时间】:2012-08-07 04:07:10
【问题描述】:

我的目标是将透视坐标从已知矩形(例如 800 x 600 屏幕)转移到倾斜/旋转的四边形。为此,我发现了这一点,这非常有帮助:Transforming captured co-ordinates into screen co-ordinates

我想这个问题还有更多的解决方案。 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 要做到这一点,您可以包含加速.h 框架,然后能够使用 C-LAPACK 等效 dgesvd_(...);

顺便说一句。我使用与Transforming captured co-ordinates into screen co-ordinates 相同的坐标,以使其更易于测试。

解决了 我遇到的问题是计算多维数组 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)

已解决!!

【问题讨论】:

    标签: objective-c xcode4 coordinates lapack svd


    【解决方案1】:

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

    我用工作代码编辑了我的问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多