38 #ifndef PCL_SAMPLE_CONSENSUS_IMPL_SAC_MODEL_PLANE_H_
39 #define PCL_SAMPLE_CONSENSUS_IMPL_SAC_MODEL_PLANE_H_
47 template <
typename Po
intT>
bool
58 Eigen::Array4f dy1dy2 = (p1-p0) / (p2-p0);
60 return ( (dy1dy2[0] != dy1dy2[1]) || (dy1dy2[2] != dy1dy2[1]) );
64 template <
typename Po
intT>
bool
66 const std::vector<int> &samples, Eigen::VectorXf &model_coefficients)
69 if (samples.size () != 3)
71 PCL_ERROR (
"[pcl::SampleConsensusModelPlane::computeModelCoefficients] Invalid set of samples given (%zu)!\n", samples.size ());
80 Eigen::Array4f p1p0 = p1 - p0;
82 Eigen::Array4f p2p0 = p2 - p0;
85 Eigen::Array4f dy1dy2 = p1p0 / p2p0;
86 if ( (dy1dy2[0] == dy1dy2[1]) && (dy1dy2[2] == dy1dy2[1]) )
91 model_coefficients.resize (4);
92 model_coefficients[0] = p1p0[1] * p2p0[2] - p1p0[2] * p2p0[1];
93 model_coefficients[1] = p1p0[2] * p2p0[0] - p1p0[0] * p2p0[2];
94 model_coefficients[2] = p1p0[0] * p2p0[1] - p1p0[1] * p2p0[0];
95 model_coefficients[3] = 0;
98 model_coefficients.normalize ();
101 model_coefficients[3] = -1 * (model_coefficients.template head<4>().dot (p0.matrix ()));
107 template <
typename Po
intT>
void
109 const Eigen::VectorXf &model_coefficients, std::vector<double> &distances)
112 if (model_coefficients.size () != 4)
114 PCL_ERROR (
"[pcl::SampleConsensusModelPlane::getDistancesToModel] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
118 distances.resize (indices_->size ());
121 for (
size_t i = 0; i < indices_->size (); ++i)
129 Eigen::Vector4f pt (input_->points[(*indices_)[i]].x,
130 input_->points[(*indices_)[i]].y,
131 input_->points[(*indices_)[i]].z,
133 distances[i] = fabs (model_coefficients.dot (pt));
138 template <
typename Po
intT>
void
140 const Eigen::VectorXf &model_coefficients,
const double threshold, std::vector<int> &inliers)
143 if (model_coefficients.size () != 4)
145 PCL_ERROR (
"[pcl::SampleConsensusModelPlane::selectWithinDistance] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
150 inliers.resize (indices_->size ());
153 for (
size_t i = 0; i < indices_->size (); ++i)
157 Eigen::Vector4f pt (input_->points[(*indices_)[i]].x,
158 input_->points[(*indices_)[i]].y,
159 input_->points[(*indices_)[i]].z,
161 if (fabs (model_coefficients.dot (pt)) < threshold)
164 inliers[nr_p] = (*indices_)[i];
168 inliers.resize (nr_p);
172 template <
typename Po
intT>
int
174 const Eigen::VectorXf &model_coefficients,
const double threshold)
177 if (model_coefficients.size () != 4)
179 PCL_ERROR (
"[pcl::SampleConsensusModelPlane::countWithinDistance] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
186 for (
size_t i = 0; i < indices_->size (); ++i)
190 Eigen::Vector4f pt (input_->points[(*indices_)[i]].x,
191 input_->points[(*indices_)[i]].y,
192 input_->points[(*indices_)[i]].z,
194 if (fabs (model_coefficients.dot (pt)) < threshold)
201 template <
typename Po
intT>
void
203 const std::vector<int> &inliers,
const Eigen::VectorXf &model_coefficients, Eigen::VectorXf &optimized_coefficients)
206 if (model_coefficients.size () != 4)
208 PCL_ERROR (
"[pcl::SampleConsensusModelPlane::optimizeModelCoefficients] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
209 optimized_coefficients = model_coefficients;
214 if (inliers.size () < 4)
216 PCL_ERROR (
"[pcl::SampleConsensusModelPlane::optimizeModelCoefficients] Not enough inliers found to support a model (%zu)! Returning the same coefficients.\n", inliers.size ());
217 optimized_coefficients = model_coefficients;
221 Eigen::Vector4f plane_parameters;
225 Eigen::Vector4f xyz_centroid;
232 pcl::eigen33 (covariance_matrix, eigen_value, eigen_vector);
235 optimized_coefficients.resize (4);
236 optimized_coefficients[0] = eigen_vector [0];
237 optimized_coefficients[1] = eigen_vector [1];
238 optimized_coefficients[2] = eigen_vector [2];
239 optimized_coefficients[3] = 0;
240 optimized_coefficients[3] = -1 * optimized_coefficients.dot (xyz_centroid);
244 template <
typename Po
intT>
void
246 const std::vector<int> &inliers,
const Eigen::VectorXf &model_coefficients,
PointCloud &projected_points,
bool copy_data_fields)
249 if (model_coefficients.size () != 4)
251 PCL_ERROR (
"[pcl::SampleConsensusModelPlane::projectPoints] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
255 projected_points.
header = input_->header;
256 projected_points.
is_dense = input_->is_dense;
258 Eigen::Vector4f mc (model_coefficients[0], model_coefficients[1], model_coefficients[2], 0);
263 Eigen::Vector4f tmp_mc = model_coefficients;
269 if (copy_data_fields)
272 projected_points.
points.resize (input_->points.size ());
273 projected_points.
width = input_->width;
274 projected_points.
height = input_->height;
278 for (
size_t i = 0; i < input_->points.size (); ++i)
283 for (
size_t i = 0; i < inliers.size (); ++i)
286 Eigen::Vector4f p (input_->points[inliers[i]].x,
287 input_->points[inliers[i]].y,
288 input_->points[inliers[i]].z,
291 float distance_to_plane = tmp_mc.dot (p);
294 pp = p - mc * distance_to_plane;
300 projected_points.
points.resize (inliers.size ());
301 projected_points.
width =
static_cast<uint32_t
> (inliers.size ());
302 projected_points.
height = 1;
306 for (
size_t i = 0; i < inliers.size (); ++i)
311 for (
size_t i = 0; i < inliers.size (); ++i)
314 Eigen::Vector4f p (input_->points[inliers[i]].x,
315 input_->points[inliers[i]].y,
316 input_->points[inliers[i]].z,
319 float distance_to_plane = tmp_mc.dot (p);
322 pp = p - mc * distance_to_plane;
328 template <
typename Po
intT>
bool
330 const std::set<int> &indices,
const Eigen::VectorXf &model_coefficients,
const double threshold)
333 if (model_coefficients.size () != 4)
335 PCL_ERROR (
"[pcl::SampleConsensusModelPlane::doSamplesVerifyModel] Invalid number of model coefficients given (%zu)!\n", model_coefficients.size ());
339 for (std::set<int>::const_iterator it = indices.begin (); it != indices.end (); ++it)
341 Eigen::Vector4f pt (input_->points[*it].x,
342 input_->points[*it].y,
343 input_->points[*it].z,
345 if (fabs (model_coefficients.dot (pt)) > threshold)
352 #define PCL_INSTANTIATE_SampleConsensusModelPlane(T) template class PCL_EXPORTS pcl::SampleConsensusModelPlane<T>;
354 #endif // PCL_SAMPLE_CONSENSUS_IMPL_SAC_MODEL_PLANE_H_