38 #ifndef PCL_REGISTRATION_TRANSFORMATION_ESTIMATION_SVD_HPP_
39 #define PCL_REGISTRATION_TRANSFORMATION_ESTIMATION_SVD_HPP_
42 template <
typename Po
intSource,
typename Po
intTarget>
inline void
46 Eigen::Matrix4f &transformation_matrix)
49 transformation_matrix.setIdentity ();
51 Eigen::Vector4f centroid_src, centroid_tgt;
57 Eigen::MatrixXf cloud_src_demean;
60 Eigen::MatrixXf cloud_tgt_demean;
63 getTransformationFromCorrelation (cloud_src_demean, centroid_src, cloud_tgt_demean, centroid_tgt, transformation_matrix);
67 template <
typename Po
intSource,
typename Po
intTarget>
void
70 const std::vector<int> &indices_src,
72 Eigen::Matrix4f &transformation_matrix)
74 if (indices_src.size () != cloud_tgt.
points.size ())
76 PCL_ERROR (
"[pcl::TransformationSVD::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), cloud_tgt.
points.size ());
81 transformation_matrix.setIdentity ();
83 Eigen::Vector4f centroid_src, centroid_tgt;
89 Eigen::MatrixXf cloud_src_demean;
92 Eigen::MatrixXf cloud_tgt_demean;
95 getTransformationFromCorrelation (cloud_src_demean, centroid_src, cloud_tgt_demean, centroid_tgt, transformation_matrix);
100 template <
typename Po
intSource,
typename Po
intTarget>
inline void
103 const std::vector<int> &indices_src,
105 const std::vector<int> &indices_tgt,
106 Eigen::Matrix4f &transformation_matrix)
108 if (indices_src.size () != indices_tgt.size ())
110 PCL_ERROR (
"[pcl::TransformationEstimationSVD::estimateRigidTransformation] Number or points in source (%zu) differs than target (%zu)!\n", indices_src.size (), indices_tgt.size ());
115 transformation_matrix.setIdentity ();
117 Eigen::Vector4f centroid_src, centroid_tgt;
123 Eigen::MatrixXf cloud_src_demean;
126 Eigen::MatrixXf cloud_tgt_demean;
129 getTransformationFromCorrelation (cloud_src_demean, centroid_src, cloud_tgt_demean, centroid_tgt, transformation_matrix);
133 template <
typename Po
intSource,
typename Po
intTarget>
void
138 Eigen::Matrix4f &transformation_matrix)
140 std::vector<int> indices_src, indices_tgt;
145 Eigen::Vector4f centroid_src, centroid_tgt;
151 Eigen::MatrixXf cloud_src_demean;
154 Eigen::MatrixXf cloud_tgt_demean;
157 getTransformationFromCorrelation (cloud_src_demean, centroid_src, cloud_tgt_demean, centroid_tgt, transformation_matrix);
161 template <
typename Po
intSource,
typename Po
intTarget>
void
163 const Eigen::MatrixXf &cloud_src_demean,
164 const Eigen::Vector4f ¢roid_src,
165 const Eigen::MatrixXf &cloud_tgt_demean,
166 const Eigen::Vector4f ¢roid_tgt,
167 Eigen::Matrix4f &transformation_matrix)
169 transformation_matrix.setIdentity ();
172 Eigen::Matrix3f H = (cloud_src_demean * cloud_tgt_demean.transpose ()).topLeftCorner<3, 3>();
175 Eigen::JacobiSVD<Eigen::Matrix3f> svd (H, Eigen::ComputeFullU | Eigen::ComputeFullV);
176 Eigen::Matrix3f u = svd.matrixU ();
177 Eigen::Matrix3f v = svd.matrixV ();
180 if (u.determinant () * v.determinant () < 0)
182 for (
int x = 0; x < 3; ++x)
186 Eigen::Matrix3f R = v * u.transpose ();
189 transformation_matrix.topLeftCorner<3, 3> () = R;
190 const Eigen::Vector3f Rc (R * centroid_src.head<3> ());
191 transformation_matrix.block <3, 1> (0, 3) = centroid_tgt.head<3> () - Rc;