31 a_current.resize(
a.size());
37 const size_t n =
a.size();
39 for (
size_t i = 0; i < n; i++) {
61 for (
size_t i = 0; i <
matches.size(); i++) {
77 for (
size_t i = 0; i < n; i++) {
78 N += (a_current[i] - a_current_cm) * (
b[
matches[i].pair] - corr_cm).transpose();
80 auto svd = N.jacobiSvd(Eigen::ComputeFullU | Eigen::ComputeFullV);
81 const Matrix U = svd.matrixU();
83 Matrix R = V * U.transpose();
100 if (R.determinant() < 0) {
101 V = V * Eigen::DiagonalMatrix<double, 2>(1, -1);
102 R = V * U.transpose();
123void icp::Vanilla::compute_matches() {
124 const size_t n =
a.size();
125 const size_t m =
b.size();
127 for (
size_t i = 0; i < n; i++) {
128 matches[i].cost = std::numeric_limits<double>::infinity();
129 for (
size_t j = 0; j < m; j++) {
131 double dist_ij = (
b[j] - a_current[i]).squaredNorm();
133 if (dist_ij <
matches[i].cost) {
Configuration for ICP instances.
Interface for iterative closest points.
RBTransform transform
The current point cloud transformation that is being optimized.
std::vector< Vector > a
The source point cloud.
std::vector< Vector > b
The destination point cloud.
std::vector< Match > matches
The pairing of each point in a to its closest in b.
void iterate() override
Perform one iteration of ICP for the point clouds a and b provided with ICP::begin.
void setup() override
Per-method setup code.
Vector get_centroid(const std::vector< Vector > &points)