.-- --

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 comment(-) trackback(-)
.23 2013

Eigenで最小2乗法を解いてみた 〜再投影誤差編

こんにちわ。Uedaです。

今回は下の資料を参考にカメラ運動パラメータを推定する計算をしてみました。

http://www.ime.info.hiroshima-cu.ac.jp/~hiura/lec/iip/geometry.pdf

最小2乗法の計算はEigenのjacobiSVDを使いました。


const int DATA_COUNT = 100;
const double ANS_P11 = 1.0, ANS_P12 = 0.0, ANS_P13 = 0.0, ANS_P14 = 1.0;
const double ANS_P21 = 0.0, ANS_P22 = 1.0, ANS_P23 = 0.0, ANS_P24 = 1.0;
const double ANS_P31 = 0.0, ANS_P32 = 0.0, ANS_P33 = 1.0, ANS_P34 = 1.0;

const double NOIZE1 = 1.0;

double *Xa = new double[DATA_COUNT];
double *Ya = new double[DATA_COUNT];
double *Za = new double[DATA_COUNT];
double *ua = new double[DATA_COUNT];
double *va = new double[DATA_COUNT];

for (int i = 0; i < DATA_COUNT; i++)
{
double X = 0.5 - [self random];
double Y = 0.5 - [self random];
double Z = 0.5 - [self random];
double u = (ANS_P11*X + ANS_P12*Y + ANS_P13*Z + ANS_P14) / (ANS_P31*X + ANS_P32*Y + ANS_P33*Z + ANS_P34) + (0.5 - [self random])*NOIZE1;
double v = (ANS_P21*X + ANS_P22*Y + ANS_P23*Z + ANS_P24) / (ANS_P31*X + ANS_P32*Y + ANS_P33*Z + ANS_P34) + (0.5 - [self random])*NOIZE1;
Xa[i] = X;
Ya[i] = Y;
Za[i] = Z;
ua[i] = u;
va[i] = v;
}

MatrixXd A(DATA_COUNT*2, 11);
VectorXd b(DATA_COUNT*2);

for (int i = 0, j = 0; j < DATA_COUNT; i+=2, j++)
{
b(i) = ua[j];
b(i+1) = va[j];

A(i, 0) = Xa[j]; A(i, 1) = Ya[j]; A(i, 2) = Za[j]; A(i, 3) = 1.0;
A(i, 4) = 0.0; A(i, 5) = 0.0; A(i, 6) = 0.0; A(i, 7) = 0.0;
A(i, 8) = -Xa[j]*ua[j]; A(i, 9) = -Ya[j]*ua[j]; A(i, 10) = -Za[j]*ua[j];

A(i+1, 0) = 0.0; A(i+1, 1) = 0.0; A(i+1, 2) = 0.0; A(i+1, 3) = 0.0;
A(i+1, 4) = Xa[j]; A(i+1, 5) = Ya[j]; A(i+1, 6) = Za[j]; A(i+1, 7) = 1.0;
A(i+1, 8) = -Xa[j]*va[j]; A(i+1, 9) = -Ya[j]*va[j]; A(i+1, 10) = -Za[j]*va[j];
}

MatrixXd ans = A.jacobiSvd(ComputeThinU | ComputeThinV).solve(b);
// MatrixXd ans = (A.transpose() * A).inverse() * A.transpose() * b;

NSLog(@"\n %f, %f, %f, %f \n %f, %f, %f, %f \n %f, %f, %f"
, ans(0, 0), ans(1, 0), ans(2, 0), ans(3, 0),
ans(4, 0), ans(5, 0), ans(6, 0), ans(7, 0),
ans(8, 0), ans(9, 0), ans(10, 0));


正解データ
1.0 0.0 0.0 1.0
0.0 1.0 0.0 1.0
0.0 0.0 1.0 1.0

出力結果
0.830548 -0.178821 -0.476796 1.108733
-0.103757 0.920693 -0.573100 1.011145
-0.072787 -0.137976 0.506778 1.0

前回計算で失敗した原因は, 関数を係数を定数倍しても意味が不変であることを考慮していなかったためだと思います。今回は参考資料して, そこのところを解消しました。
回転行列の性質を満たしていないのでこのまま使うことはできないですが, Eigenの最小2乗法計算手法jacobiSVDのテストも踏まえて計算してみました。
関連記事
スポンサーサイト

Comment

Post comment

  • comment
  • secret
  • 管理者にだけ表示を許可する

Trackback

trackbackURL:http://appteam.blog114.fc2.com/tb.php/267-ace0f15d

ブログ内検索

関連リンク

製品情報

最新記事

カテゴリ

プロフィール

neoxneo



NEXT-SYSTEM iOS Developers Blog


  • UTO:
    カナダ版iPhone4Sは、マナーモードでシャッター音がならない…


  • Ehara:
    ...


  • Hayate:
    ...


  • Tasaki:
    Developer登録完了...したのはいいけど


  • Ueda:
    ...



リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。