点群フィット-平面フィット
964 ワード
平面方程式:Ax+By+Cz+D=0
方程式自体は複雑ではありません.原理は他の人を導いてすでにはっきり書いています.私のところは住所だけを貼って、繰り返しません.フィッティング方法1-最小二乗: https://blog.csdn.net/konglingshneg/article/details/82585868
係数行列を構築した後、最小二乗で解くことができます.
Ax=b
x=(ATA)-1ATb
実際の使用中に、いくつかの問題が発生しました.
元のブログで提案した方法を参考にして、係数c=0の平面をフィットするために使用された場合、結果は正しい場合もあるし、間違っている場合もある.最初は係数行列がdoubleタイプのデータ範囲を超えているのではないかと疑っていたが、8万点以上の計算を採用した結果、データ型が限界を超えていないことが分かった.残りはC≠0の場合に導出したモデルがすべての場合に適用されない可能性があるので,A≠0と仮定し,同様の方法で係数行列を再導出し,点群計算に代入してフィットした平面が正しいことを発見した.
まとめ:方法1は平面をフィッティングするのに用いることができるが、平面が導出した係数行列仮定条件(A≠0 or B≠0 or C≠0)と一致しないとフィッティングが失敗しやすい(フィッティングできる場合もある).先行知識と結びつけて事前に知っておけば(A≠0 or B≠0 or C≠0)対応して対応するモデルを用いてフィッティングすることができ、少し面倒になる.
簡単な例を貼ります.
z= a0*x+a1*y+a2 ( C≠0 )
方程式自体は複雑ではありません.原理は他の人を導いてすでにはっきり書いています.私のところは住所だけを貼って、繰り返しません.
係数行列を構築した後、最小二乗で解くことができます.
Ax=b
x=(ATA)-1ATb
% matlab
inv(A'*A)*A'*b
実際の使用中に、いくつかの問題が発生しました.
元のブログで提案した方法を参考にして、係数c=0の平面をフィットするために使用された場合、結果は正しい場合もあるし、間違っている場合もある.最初は係数行列がdoubleタイプのデータ範囲を超えているのではないかと疑っていたが、8万点以上の計算を採用した結果、データ型が限界を超えていないことが分かった.残りはC≠0の場合に導出したモデルがすべての場合に適用されない可能性があるので,A≠0と仮定し,同様の方法で係数行列を再導出し,点群計算に代入してフィットした平面が正しいことを発見した.
まとめ:方法1は平面をフィッティングするのに用いることができるが、平面が導出した係数行列仮定条件(A≠0 or B≠0 or C≠0)と一致しないとフィッティングが失敗しやすい(フィッティングできる場合もある).先行知識と結びつけて事前に知っておけば(A≠0 or B≠0 or C≠0)対応して対応するモデルを用いてフィッティングすることができ、少し面倒になる.
簡単な例を貼ります.
z= a0*x+a1*y+a2 ( C≠0 )
#include
int Leastsquare::plane_fit_z(const double *pts, const int n, double *Para) {
using namespace Eigen;
using namespace