c++ - Eigen and SVD to find Best Fitting Plane given a Set of Points -
given set of n points in 3d space, trying find best fitting plane using svd , eigen.
my algorithm is:
- center data points around (0,0,0).
- form 3xn matrix of point coordinates.
- calculate svd of matrix.
- set smallest singular vector corresponding least singular value normal of plane.
- set distance origin plane normal∙centroid.
i can't figure out how use eigen's svd module find smallest singular vector corresponding least singular value of point coordinates matrix.
so far have code (steps 1, 2 , 5 of algorithm):
eigen::matrix<float, 3, 1> mean = points.rowwise().mean(); const eigen::matrix3xf points_centered = points.colwise() - mean; int setting = eigen::computethinu | eigen::computethinv; eigen::jacobisvd<eigen::matrix3xf> svd = points_centered.jacobisvd(setting); eigen::vector3d normal = **???** double d = normal.dot(mean);
denoting u = svd.matrixu()
, vectors u.col(0)
, u.col(1)
defines base of plane , u.col(2)
normal plane.
u.col(0)
defines direction greatest standard deviation.
you should use flag computefullu
instead of computethinu
have correct dimensions if points coplanar.
Comments
Post a Comment