.-- --

スポンサーサイト

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

Eigenを使って非線形最小2乗法 ~Levenberg-Marquardt法 2

こんにちわ。Uedaです。

今回は ui = (Xi*p11 + Yi*P12 + Zi*P13 + P14) / (Xi*p31 + Yi*P32 + Zi*P33 + P34)
vi = (Xi*p21 + Yi*P22 + Zi*P23 + P24) / (Xi*p31 + Yi*P32 + Zi*P33 + P34)
の関数についてLevenberg-Marquardt法を使ってみます。

ちなみに、この関数は動画像から再投影誤差を最小にすることで、カメラの運動を推定するときに使ったりします。

前回の関数の定義を

reprojection_functor(int inputs, int values, double *X, double *Y, double *Z, double *u, double *v)
: inputs_(inputs), values_(values), X(X), Y(Y), Z(Z), u(u), v(v) {}

double *X;
double *Y;
double *Z;
double *u;
double *v;
int operator()(const VectorXd& b, VectorXd& fvec) const
{
for (int i = 0; i < values_; ++i)
{
fvec[i] = u[i] - ((b[0]*X[i] + b[1]*Y[i] + b[2]*Z[i] + b[3]) / (b[8]*X[i] + b[9]*Y[i] + b[10]*Z[i] + b[11]))
+ v[i] - ((b[4]*X[i] + b[5]*Y[i] + b[6]*Z[i] + b[7]) / (b[8]*X[i] + b[9]*Y[i] + b[10]*Z[i] + b[11]));
}
return 0;
}

に変更して、テストケースを作れば完成です。

テストケース

const int DATA_COUNT = 100;
const double ANS_P11 = 1.0, ANS_P12 = 4.0, ANS_P13 = 7.0, ANS_P14 = 10.0;
const double ANS_P21 = 2.0, ANS_P22 = 5.0, ANS_P23 = 8.0, ANS_P24 = 11.0;
const double ANS_P31 = 3.0, ANS_P32 = 6.0, ANS_P33 = 9.0, ANS_P34 = 12.0;

const double NOIZE1 = 2.0;
const double NOIZE2 = 2.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];

double p11, p12, p13, p14, p21, p22, p23, p24, p31, p32, p33, p34;
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_P31*X + ANS_P32*Y + ANS_P33*Z) + (0.5 - [self random])*NOIZE1;
double v = (ANS_P21*X + ANS_P22*Y + ANS_P23*Z) / (ANS_P31*X + ANS_P32*Y + ANS_P33*Z) + (0.5 - [self random])*NOIZE1;
Xa[i] = X;
Ya[i] = Y;
Za[i] = Z;
ua[i] = u;
va[i] = v;
}

VectorXd p(12);
p11 = ANS_P11 + (0.5 - [self random])*NOIZE2; p12 = ANS_P12 + (0.5 - [self random])*NOIZE2; p13 = ANS_P13 + (0.5 - [self random])*NOIZE2; p14 = ANS_P14 + (0.5 - [self random])*NOIZE2;
p21 = ANS_P21 + (0.5 - [self random])*NOIZE2; p22 = ANS_P22 + (0.5 - [self random])*NOIZE2; p23 = ANS_P23 + (0.5 - [self random])*NOIZE2; p24 = ANS_P24 + (0.5 - [self random])*NOIZE2;
p31 = ANS_P31 + (0.5 - [self random])*NOIZE2; p32 = ANS_P32 + (0.5 - [self random])*NOIZE2; p33 = ANS_P33 + (0.5 - [self random])*NOIZE2; p34 = ANS_P34 + (0.5 - [self random])*NOIZE2;
p(0) = p11; p(1) = p12; p(2) = p13; p(3) = p14;
p(4) = p21; p(5) = p22; p(6) = p23; p(7) = p24;
p(8) = p31; p(9) = p32; p(10) = p33; p(11) = p34;


結果
正解
1.000000, 4.000000, 7.000000, 10.000000
2.000000, 5.000000, 8.000000, 11.000000
3.000000, 6.000000, 9.000000, 12.000000
推定
1.001588, 4.518335, 6.761741, 10.181617
2.237630, 4.923387, 7.199742, 10.156541
3.348539, 6.064186, 9.443100, 12.882333

以上です。
関連記事
スポンサーサイト

Comment

Post comment

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

Trackback

trackbackURL:http://appteam.blog114.fc2.com/tb.php/265-8d269292

ブログ内検索

関連リンク

製品情報

最新記事

カテゴリ

プロフィール

neoxneo



NEXT-SYSTEM iOS Developers Blog


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


  • Ehara:
    ...


  • Hayate:
    ...


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


  • Ueda:
    ...



リンク

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