41 template <
typename Po
intSource,
typename Po
intTarget>
inline void
44 if (cloud->points.empty ())
46 PCL_ERROR (
"[pcl::%s::setInputTarget] Invalid or empty point cloud dataset given!\n", getClassName ().c_str ());
51 for (
size_t i = 0; i < target.
points.size (); ++i)
52 target.
points[i].data[3] = 1.0;
56 tree_->setInputCloud (target_);
60 template <
typename Po
intSource,
typename Po
intTarget>
inline double
62 const std::vector<float> &distances_b)
64 unsigned int nr_elem =
static_cast<unsigned int> (std::min (distances_a.size (), distances_b.size ()));
65 Eigen::VectorXf map_a = Eigen::VectorXf::Map (&distances_a[0], nr_elem);
66 Eigen::VectorXf map_b = Eigen::VectorXf::Map (&distances_b[0], nr_elem);
67 return (static_cast<double> ((map_a - map_b).sum ()) / static_cast<double> (nr_elem));
71 template <
typename Po
intSource,
typename Po
intTarget>
inline double
74 double fitness_score = 0.0;
80 std::vector<int> nn_indices (1);
81 std::vector<float> nn_dists (1);
85 for (
size_t i = 0; i < input_transformed.
points.size (); ++i)
87 Eigen::Vector4f p1 = Eigen::Vector4f (input_transformed.
points[i].x,
88 input_transformed.
points[i].y,
89 input_transformed.
points[i].z, 0);
91 tree_->nearestKSearch (input_transformed.
points[i], 1, nn_indices, nn_dists);
94 if (nn_dists[0] > max_range)
97 Eigen::Vector4f p2 = Eigen::Vector4f (target_->points[nn_indices[0]].x,
98 target_->points[nn_indices[0]].y,
99 target_->points[nn_indices[0]].z, 0);
101 fitness_score += fabs ((p1-p2).squaredNorm ());
106 return (fitness_score / nr);
108 return (std::numeric_limits<double>::max ());
112 template <
typename Po
intSource,
typename Po
intTarget>
inline void
115 align (output, Eigen::Matrix4f::Identity());
119 template <
typename Po
intSource,
typename Po
intTarget>
inline void
122 if (!initCompute ())
return;
126 PCL_WARN (
"[pcl::%s::compute] No input target dataset was given!\n", getClassName ().c_str ());
131 if (output.
points.size () != indices_->size ())
132 output.
points.resize (indices_->size ());
134 output.
header = input_->header;
136 if (indices_->size () != input_->points.size ())
138 output.
width =
static_cast<uint32_t
> (indices_->size ());
143 output.
width =
static_cast<uint32_t
> (input_->width);
144 output.
height = input_->height;
149 for (
size_t i = 0; i < indices_->size (); ++i)
150 output.
points[i] = input_->points[(*indices_)[i]];
153 if (point_representation_)
154 tree_->setPointRepresentation (point_representation_);
158 final_transformation_ = transformation_ = previous_transformation_ = Eigen::Matrix4f::Identity ();
162 for (
size_t i = 0; i < indices_->size (); ++i)
163 output.
points[i].data[3] = 1.0;
165 computeTransformation (output, guess);