implemented least squares rigid motion
This commit is contained in:
parent
50939143f5
commit
d46c581ffb
|
|
@ -161,6 +161,58 @@ void ComputeRigidMatchMatrix(std::vector<Point3<S> > &Pfix,
|
||||||
res=Trn*Rot;
|
res=Trn*Rot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*! \brief Computes the best fitting rigid transformations to align two sets of corresponding points
|
||||||
|
*
|
||||||
|
* Ref:
|
||||||
|
* Olga Sorkine-Hornung and Michael Rabinovich
|
||||||
|
* Least-Squares Rigid Motion Using SVD
|
||||||
|
*/
|
||||||
|
template <class S>
|
||||||
|
Matrix44<S> ComputeLeastSquaresRigidMotion(std::vector<Point3<S> > &pFix,
|
||||||
|
std::vector<Point3<S> > &pMov)
|
||||||
|
{
|
||||||
|
if (pFix.size() != pMov.size() || pFix.size() < 3)
|
||||||
|
return Matrix44<S>::Identity();
|
||||||
|
|
||||||
|
Eigen::Matrix3Xd p(3, pMov.size()); // moving
|
||||||
|
Eigen::MatrixX3d q(pFix.size(), 3); // fixed
|
||||||
|
|
||||||
|
for (size_t i=0; i<pMov.size(); i++)
|
||||||
|
{
|
||||||
|
Eigen::Vector3d v;
|
||||||
|
pMov[i].ToEigenVector(v);
|
||||||
|
p.col(i) = v;
|
||||||
|
}
|
||||||
|
Eigen::Vector3d avgP = p.rowwise().mean();
|
||||||
|
p.colwise() -= avgP;
|
||||||
|
|
||||||
|
for (size_t i=0; i<pFix.size(); i++)
|
||||||
|
{
|
||||||
|
Eigen::Vector3d v;
|
||||||
|
pFix[i].ToEigenVector(v);
|
||||||
|
q.row(i) = v;
|
||||||
|
}
|
||||||
|
Eigen::Vector3d avgQ = q.colwise().mean();
|
||||||
|
q.rowwise() -= avgQ.transpose();
|
||||||
|
|
||||||
|
Eigen::Matrix3d cov = p * q;
|
||||||
|
Eigen::JacobiSVD<Eigen::Matrix3d> svd;
|
||||||
|
svd.compute(cov, Eigen::ComputeFullU | Eigen::ComputeFullV);
|
||||||
|
|
||||||
|
Eigen::Matrix3d d = Eigen::Matrix3d::Identity();
|
||||||
|
d(2,2) = (svd.matrixV() * svd.matrixU().transpose()).determinant() > 0 ? 1 : -1;
|
||||||
|
|
||||||
|
Eigen::Matrix3d R = (svd.matrixV() * d * svd.matrixU().transpose());
|
||||||
|
Eigen::Vector3d t = avgQ - R * avgP;
|
||||||
|
|
||||||
|
Eigen::Matrix4d res = Eigen::Matrix4d::Identity();
|
||||||
|
res.block<3,3>(0,0) = R;
|
||||||
|
res.block<3,1>(0,3) = t;
|
||||||
|
Matrix44<S> ret;
|
||||||
|
ret.FromEigenMatrix(res);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Compute a similarity matching (rigid + uniform scaling)
|
Compute a similarity matching (rigid + uniform scaling)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue