Point Cloud Library (PCL)  1.6.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
centroid.h
Go to the documentation of this file.
1 /*
2  * Software License Agreement (BSD License)
3  *
4  * Copyright (c) 2010, Willow Garage, Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above
14  * copyright notice, this list of conditions and the following
15  * disclaimer in the documentation and/or other materials provided
16  * with the distribution.
17  * * Neither the name of Willow Garage, Inc. nor the names of its
18  * contributors may be used to endorse or promote products derived
19  * from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  */
35 
36 #ifndef PCL_COMMON_CENTROID_H_
37 #define PCL_COMMON_CENTROID_H_
38 
39 #include <pcl/point_cloud.h>
40 #include <pcl/point_traits.h>
41 #include <pcl/PointIndices.h>
42 
50 namespace pcl
51 {
60  template <typename PointT> inline unsigned int
61  compute3DCentroid (const pcl::PointCloud<PointT> &cloud, Eigen::Vector4f &centroid);
62 
72  template <typename PointT> inline unsigned int
74  const std::vector<int> &indices, Eigen::Vector4f &centroid);
75 
85  template <typename PointT> inline unsigned int
87  const pcl::PointIndices &indices, Eigen::Vector4f &centroid);
88 
102  template <typename PointT> inline unsigned int
104  const Eigen::Vector4f &centroid,
105  Eigen::Matrix3f &covariance_matrix);
106 
120  template <typename PointT> inline unsigned int
122  const Eigen::Vector4f &centroid,
123  Eigen::Matrix3f &covariance_matrix);
124 
138  template <typename PointT> inline unsigned int
140  const std::vector<int> &indices,
141  const Eigen::Vector4f &centroid,
142  Eigen::Matrix3f &covariance_matrix);
143 
157  template <typename PointT> inline unsigned int
159  const pcl::PointIndices &indices,
160  const Eigen::Vector4f &centroid,
161  Eigen::Matrix3f &covariance_matrix);
162 
178  template <typename PointT> inline unsigned int
180  const std::vector<int> &indices,
181  const Eigen::Vector4f &centroid,
182  Eigen::Matrix3f &covariance_matrix);
183 
198  template <typename PointT> inline unsigned int
200  const pcl::PointIndices &indices,
201  const Eigen::Vector4f &centroid,
202  Eigen::Matrix3f &covariance_matrix);
203 
216  template <typename PointT> inline unsigned int
218  Eigen::Matrix3f &covariance_matrix,
219  Eigen::Vector4f &centroid);
220 
234  template <typename PointT> inline unsigned int
236  const std::vector<int> &indices,
237  Eigen::Matrix3f &covariance_matrix,
238  Eigen::Vector4f &centroid);
239 
253  template <typename PointT> inline unsigned int
255  const pcl::PointIndices &indices,
256  Eigen::Matrix3f &covariance_matrix,
257  Eigen::Vector4f &centroid);
258 
270  template <typename PointT> inline unsigned int
272  Eigen::Matrix3d &covariance_matrix,
273  Eigen::Vector4d &centroid);
274 
287  template <typename PointT> inline unsigned int
289  const std::vector<int> &indices,
290  Eigen::Matrix3d &covariance_matrix,
291  Eigen::Vector4d &centroid);
292 
305  template <typename PointT> inline unsigned int
307  const pcl::PointIndices &indices,
308  Eigen::Matrix3d &covariance_matrix,
309  Eigen::Vector4d &centroid);
310 
322  template <typename PointT> inline unsigned int
324  Eigen::Matrix3f &covariance_matrix);
325 
338  template <typename PointT> inline unsigned int
340  const std::vector<int> &indices,
341  Eigen::Matrix3f &covariance_matrix);
342 
355  template <typename PointT> inline unsigned int
357  const pcl::PointIndices &indices,
358  Eigen::Matrix3f &covariance_matrix);
359 
370  template <typename PointT> inline unsigned int
372  Eigen::Matrix3d &covariance_matrix);
373 
385  template <typename PointT> inline unsigned int
387  const std::vector<int> &indices,
388  Eigen::Matrix3d &covariance_matrix);
389 
401  template <typename PointT> inline unsigned int
403  const pcl::PointIndices &indices,
404  Eigen::Matrix3d &covariance_matrix);
405 
412  template <typename PointT> void
413  demeanPointCloud (const pcl::PointCloud<PointT> &cloud_in,
414  const Eigen::Vector4f &centroid,
415  pcl::PointCloud<PointT> &cloud_out);
416 
424  template <typename PointT> void
425  demeanPointCloud (const pcl::PointCloud<PointT> &cloud_in,
426  const std::vector<int> &indices,
427  const Eigen::Vector4f &centroid,
428  pcl::PointCloud<PointT> &cloud_out);
429 
438  template <typename PointT> void
439  demeanPointCloud (const pcl::PointCloud<PointT> &cloud_in,
440  const Eigen::Vector4f &centroid,
441  Eigen::MatrixXf &cloud_out);
442 
452  template <typename PointT> void
453  demeanPointCloud (const pcl::PointCloud<PointT> &cloud_in,
454  const std::vector<int> &indices,
455  const Eigen::Vector4f &centroid,
456  Eigen::MatrixXf &cloud_out);
457 
467  template <typename PointT> void
468  demeanPointCloud (const pcl::PointCloud<PointT> &cloud_in,
469  const pcl::PointIndices& indices,
470  const Eigen::Vector4f &centroid,
471  Eigen::MatrixXf &cloud_out);
472 
474  template<typename PointT>
476  {
477  typedef typename traits::POD<PointT>::type Pod;
478 
479  NdCentroidFunctor (const PointT &p, Eigen::VectorXf &centroid)
480  : f_idx_ (0),
481  centroid_ (centroid),
482  p_ (reinterpret_cast<const Pod&>(p)) { }
483 
484  template<typename Key> inline void operator() ()
485  {
486  typedef typename pcl::traits::datatype<PointT, Key>::type T;
487  const uint8_t* raw_ptr = reinterpret_cast<const uint8_t*>(&p_) + pcl::traits::offset<PointT, Key>::value;
488  const T* data_ptr = reinterpret_cast<const T*>(raw_ptr);
489 
490  // Check if the value is invalid
491  if (!pcl_isfinite (*data_ptr))
492  {
493  f_idx_++;
494  return;
495  }
496 
497  centroid_[f_idx_++] += *data_ptr;
498  }
499 
500  private:
501  int f_idx_;
502  Eigen::VectorXf &centroid_;
503  const Pod &p_;
504  };
505 
512  template <typename PointT> inline void
513  computeNDCentroid (const pcl::PointCloud<PointT> &cloud, Eigen::VectorXf &centroid);
514 
522  template <typename PointT> inline void
524  const std::vector<int> &indices, Eigen::VectorXf &centroid);
525 
533  template <typename PointT> inline void
535  const pcl::PointIndices &indices, Eigen::VectorXf &centroid);
536 
537 }
540 
541 #endif //#ifndef PCL_COMMON_CENTROID_H_