私はLevenberg-Marquardt algorithmを使用して、6つのパラメータの非線形関数を最小限に抑えています。私は各最小化のために約50データポイントを持っていますが、私は十分に正確な結果を得ていません。私のパラメータが数オーダーの大きさでお互いに異なるという事実は、それほど重要なことでしょうか?はいの場合は、どこで解決策を探すべきですか?そうでない場合は、あなたの仕事であなたが会ったLMAのどのような制限がありますか(それは私のapplictaionで他の問題を見つけるのに役立ちます)? 多くのお手伝いをありがとうございます。Levenberg-Marquardtアルゴリズムの制限
編集:3Dラインの束に3D点の集合にフィットするように
typedef struct
{
double x_translation, y_translation, z_translation;
double x_rotation, y_rotation, z_rotation;
} transform_3D;
:私が解決しようとしています問題は、最高の変換Tを決定することです。詳細には、3Dポイントの座標と対応する3Dラインの式のセットがあります。理想的な状況では、これらのポイントを通過する必要があります。 LMAは、変換された3D点の対応する3D線に対する距離の和を最小にする。 は、次のように関数である変換:...この説明は少し役立つ
cv::Point3d Geometry::transformation_3D(cv::Point3d point, transform_3D transformation)
{
cv::Point3d p_odd,p_even;
//rotation x
p_odd.x=point.x;
p_odd.y=point.y*cos(transformation.x_rotation)-point.z*sin(transformation.x_rotation);
p_odd.z=point.y*sin(transformation.x_rotation)+point.z*cos(transformation.x_rotation);
//rotation y
p_even.x=p_odd.z*sin(transformation.y_rotation)+p_odd.x*cos(transformation.y_rotation);
p_even.y=p_odd.y;
p_even.z=p_odd.z*cos(transformation.y_rotation)-p_odd.x*sin(transformation.y_rotation);
//rotation z
p_odd.x=p_even.x*cos(transformation.z_rotation)-p_even.y*sin(transformation.z_rotation);
p_odd.y=p_even.x*sin(transformation.z_rotation)+p_even.y*cos(transformation.z_rotation);
p_odd.z=p_even.z;
//translation
p_even.x=p_odd.x+transformation.x_translation;
p_even.y=p_odd.y+transformation.y_translation;
p_even.z=p_odd.z+transformation.z_translation;
return p_even;
}
希望を
をEDIT2:
いくつかの例示的なデータを以下に貼り付けられます。 3D線は、中心点および方向ベクトルによって記述される。全ての行のための中心点である(0,0,0)と「UZ」各ベクトルは方向ベクトルの「UX」座標の1 セットに等しい座標:「UY」座標の
-1.0986, -1.0986, -1.0986,
-1.0986, -1.0990, -1.0986,
-1.0986, -1.0986, -0.9995,
-0.9996, -0.9996, -0.9995,
-0.9995, -0.9995, -0.9996,
-0.9003, -0.9003, -0.9004,
-0.9003, -0.9003, -0.9003,
-0.9003, -0.9003, -0.8011,
-0.7020, -0.7019, -0.6028,
-0.5035, -0.5037, -0.4045,
-0.3052, -0.3053, -0.2062,
-0.1069, -0.1069, -0.1075,
-0.1070, -0.1070, -0.1069,
-0.1069, -0.1070, -0.0079,
-0.0079, -0.0079, -0.0078,
-0.0078, -0.0079, -0.0079,
0.0914, 0.0914, 0.0913,
0.0913, 0.0914, 0.0915,
0.0914, 0.0914
セット
-0.2032, -0.0047, 0.1936,
0.3919, 0.5901, 0.7885,
0.9869, 1.1852, -0.1040,
0.0944, 0.2927, 0.4911,
0.6894, 0.8877, 1.0860,
-0.2032, -0.0047, 0.1936,
0.3919, 0.5902, 0.7885,
0.9869, 1.1852, 1.0860,
0.9869, 1.1852, 1.0861,
0.9865, 1.1853, 1.0860,
0.9870, 1.1852, 1.0861,
-0.2032, -0.0047, 0.1937,
0.3919, 0.5902, 0.7885,
0.9869, 1.1852, -0.1039,
0.0944, 0.2927, 0.4911,
0.6894, 0.8877, 1.0860,
-0.2032, -0.0047, 0.1935,
0.3919, 0.5902, 0.7885,
0.9869, 1.1852
と(xyzxyzxyz ...)形式で3D点の集合:方向ベクトルの
{{0, 0, 0}, {0, 16, 0}, {0, 32, 0},
{0, 48, 0}, {0, 64, 0}, {0, 80, 0},
{0, 96, 0}, {0, 112,0}, {8, 8, 0},
{8, 24, 0}, {8, 40, 0}, {8, 56, 0},
{8, 72, 0}, {8, 88, 0}, {8, 104, 0},
{16, 0, 0}, {16, 16,0}, {16, 32, 0},
{16, 48, 0}, {16, 64, 0}, {16, 80, 0},
{16, 96, 0}, {16, 112, 0}, {24, 104, 0},
{32, 96, 0}, {32, 112, 0}, {40, 104, 0},
{48, 96, 0}, {48, 112, 0}, {56, 104, 0},
{64, 96, 0}, {64, 112, 0}, {72, 104, 0},
{80, 0, 0}, {80, 16, 0}, {80, 32, 0},
{80,48, 0}, {80, 64, 0}, {80, 80, 0},
{80, 96, 0}, {80, 112, 0}, {88, 8, 0},
{88, 24, 0}, {88, 40, 0}, {88, 56, 0},
{88, 72, 0}, {88, 88, 0}, {88, 104, 0},
{96, 0, 0}, {96, 16, 0}, {96, 32, 0},
{96, 48,0}, {96, 64, 0}, {96, 80, 0},
{96, 96, 0}, {96, 112, 0}}
これは非常に小さな回転にデータをモデル化し、 "簡単" の一種です。
こんにちはMarcin!あなたはモデルといくつかのデータを投稿できますか?私はLMを使用して実行中のオプティマイザを持っており、私はあなたのデータでそれを試すことができます。それが大きければ、pastebinやideoneに投稿するかもしれません。 –
@Marcin [Mathematica]タグを使用しています。それは大丈夫ですか?私はあなたがC++/qt/OpenGLを使っていると思った。 –
はい、申し訳ありませんが、私はそれが科学としてのマテマチクスを参照していると思いました。私はC++でプログラミングしています。あなたの最初の質問については、少し複雑すぎるので、モデルを投稿しないでください。申し訳ありませんが、あなたが答える際にあなたを邪魔するでしょう:/ – Marcin