38 #ifndef PCL_COMMON_IMPL_CENTROID_H_
39 #define PCL_COMMON_IMPL_CENTROID_H_
42 #include <boost/mpl/size.hpp>
45 template <
typename Po
intT>
inline unsigned int
57 for (
size_t i = 0; i < cloud.
points.size (); ++i)
58 centroid += cloud.
points[i].getVector4fMap ();
60 centroid /=
static_cast<float> (cloud.
points.size ());
62 return (static_cast<unsigned int> (cloud.
points.size ()));
68 for (
size_t i = 0; i < cloud.
points.size (); ++i)
74 centroid += cloud[i].getVector4fMap ();
78 centroid /=
static_cast<float> (cp);
85 template <
typename Po
intT>
inline unsigned int
87 Eigen::Vector4f ¢roid)
97 for (
size_t i = 0; i < indices.size (); ++i)
98 centroid += cloud.
points[indices[i]].getVector4fMap ();
100 centroid /=
static_cast<float> (indices.size ());
101 return (static_cast<unsigned int> (indices.size ()));
107 for (
size_t i = 0; i < indices.size (); ++i)
113 centroid += cloud[indices[i]].getVector4fMap ();
117 centroid /=
static_cast<float> (cp);
123 template <
typename Po
intT>
inline unsigned int
127 return (pcl::compute3DCentroid<PointT> (cloud, indices.
indices, centroid));
131 template <
typename Po
intT>
inline unsigned
133 const Eigen::Vector4f ¢roid,
134 Eigen::Matrix3f &covariance_matrix)
136 if (cloud.
points.empty ())
140 covariance_matrix.setZero ();
142 unsigned point_count;
146 point_count =
static_cast<unsigned> (cloud.
size ());
148 for (
size_t i = 0; i < point_count; ++i)
150 Eigen::Vector4f pt = cloud [i].getVector4fMap () - centroid;
152 covariance_matrix (1, 1) += pt.y () * pt.y ();
153 covariance_matrix (1, 2) += pt.y () * pt.z ();
155 covariance_matrix (2, 2) += pt.z () * pt.z ();
158 covariance_matrix (0, 0) += pt.x ();
159 covariance_matrix (0, 1) += pt.y ();
160 covariance_matrix (0, 2) += pt.z ();
168 for (
size_t i = 0; i < cloud.
size (); ++i)
174 Eigen::Vector4f pt = cloud [i].getVector4fMap () - centroid;
176 covariance_matrix (1, 1) += pt.y () * pt.y ();
177 covariance_matrix (1, 2) += pt.y () * pt.z ();
179 covariance_matrix (2, 2) += pt.z () * pt.z ();
182 covariance_matrix (0, 0) += pt.x ();
183 covariance_matrix (0, 1) += pt.y ();
184 covariance_matrix (0, 2) += pt.z ();
188 covariance_matrix (1, 0) = covariance_matrix (0, 1);
189 covariance_matrix (2, 0) = covariance_matrix (0, 2);
190 covariance_matrix (2, 1) = covariance_matrix (1, 2);
192 return (point_count);
196 template <
typename Po
intT>
inline unsigned int
198 const Eigen::Vector4f ¢roid,
199 Eigen::Matrix3f &covariance_matrix)
202 if (point_count != 0)
203 covariance_matrix /=
static_cast<float> (point_count);
204 return (point_count);
208 template <
typename Po
intT>
inline unsigned int
210 const std::vector<int> &indices,
211 const Eigen::Vector4f ¢roid,
212 Eigen::Matrix3f &covariance_matrix)
214 if (indices.empty ())
218 covariance_matrix.setZero ();
224 point_count = indices.size ();
226 for (
size_t i = 0; i < point_count; ++i)
228 Eigen::Vector4f pt = cloud.
points[indices[i]].getVector4fMap () - centroid;
230 covariance_matrix (1, 1) += pt.y () * pt.y ();
231 covariance_matrix (1, 2) += pt.y () * pt.z ();
233 covariance_matrix (2, 2) += pt.z () * pt.z ();
236 covariance_matrix (0, 0) += pt.x ();
237 covariance_matrix (0, 1) += pt.y ();
238 covariance_matrix (0, 2) += pt.z ();
246 for (
size_t i = 0; i < indices.size (); ++i)
252 Eigen::Vector4f pt = cloud[indices[i]].getVector4fMap () - centroid;
254 covariance_matrix (1, 1) += pt.y () * pt.y ();
255 covariance_matrix (1, 2) += pt.y () * pt.z ();
257 covariance_matrix (2, 2) += pt.z () * pt.z ();
260 covariance_matrix (0, 0) += pt.x ();
261 covariance_matrix (0, 1) += pt.y ();
262 covariance_matrix (0, 2) += pt.z ();
266 covariance_matrix (1, 0) = covariance_matrix (0, 1);
267 covariance_matrix (2, 0) = covariance_matrix (0, 2);
268 covariance_matrix (2, 1) = covariance_matrix (1, 2);
269 return (static_cast<unsigned int> (point_count));
273 template <
typename Po
intT>
inline unsigned int
276 const Eigen::Vector4f ¢roid,
277 Eigen::Matrix3f &covariance_matrix)
279 return (pcl::computeCovarianceMatrix<PointT> (cloud, indices.
indices, centroid, covariance_matrix));
283 template <
typename Po
intT>
inline unsigned int
285 const std::vector<int> &indices,
286 const Eigen::Vector4f ¢roid,
287 Eigen::Matrix3f &covariance_matrix)
290 if (point_count != 0)
291 covariance_matrix /=
static_cast<float> (point_count);
293 return (point_count);
297 template <
typename Po
intT>
inline unsigned int
300 const Eigen::Vector4f ¢roid,
301 Eigen::Matrix3f &covariance_matrix)
304 if (point_count != 0)
305 covariance_matrix /=
static_cast<int>(point_count);
311 template <
typename Po
intT>
inline unsigned int
313 Eigen::Matrix3f &covariance_matrix)
316 Eigen::Matrix<float, 1, 6, Eigen::RowMajor> accu = Eigen::Matrix<float, 1, 6, Eigen::RowMajor>::Zero ();
318 unsigned int point_count;
321 point_count =
static_cast<unsigned int> (cloud.
size ());
323 for (
size_t i = 0; i < point_count; ++i)
325 accu [0] += cloud[i].x * cloud[i].x;
326 accu [1] += cloud[i].x * cloud[i].y;
327 accu [2] += cloud[i].x * cloud[i].z;
328 accu [3] += cloud[i].y * cloud[i].y;
329 accu [4] += cloud[i].y * cloud[i].z;
330 accu [5] += cloud[i].z * cloud[i].z;
336 for (
size_t i = 0; i < cloud.
points.size (); ++i)
341 accu [0] += cloud[i].x * cloud[i].x;
342 accu [1] += cloud[i].x * cloud[i].y;
343 accu [2] += cloud[i].x * cloud[i].z;
344 accu [3] += cloud[i].y * cloud[i].y;
345 accu [4] += cloud[i].y * cloud[i].z;
346 accu [5] += cloud[i].z * cloud[i].z;
351 if (point_count != 0)
353 accu /=
static_cast<float> (point_count);
354 covariance_matrix.coeffRef (0) = accu [0];
355 covariance_matrix.coeffRef (1) = covariance_matrix.coeffRef (3) = accu [1];
356 covariance_matrix.coeffRef (2) = covariance_matrix.coeffRef (6) = accu [2];
357 covariance_matrix.coeffRef (4) = accu [3];
358 covariance_matrix.coeffRef (5) = covariance_matrix.coeffRef (7) = accu [4];
359 covariance_matrix.coeffRef (8) = accu [5];
361 return (point_count);
365 template <
typename Po
intT>
inline unsigned int
367 const std::vector<int> &indices,
368 Eigen::Matrix3f &covariance_matrix)
370 Eigen::Matrix<float, 1, 6, Eigen::RowMajor> accu = Eigen::Matrix<float, 1, 6, Eigen::RowMajor>::Zero ();
372 unsigned int point_count;
375 point_count =
static_cast<unsigned int> (indices.size ());
376 for (std::vector<int>::const_iterator iIt = indices.begin (); iIt != indices.end (); ++iIt)
379 accu [0] += cloud[*iIt].x * cloud[*iIt].x;
380 accu [1] += cloud[*iIt].x * cloud[*iIt].y;
381 accu [2] += cloud[*iIt].x * cloud[*iIt].z;
382 accu [3] += cloud[*iIt].y * cloud[*iIt].y;
383 accu [4] += cloud[*iIt].y * cloud[*iIt].z;
384 accu [5] += cloud[*iIt].z * cloud[*iIt].z;
390 for (std::vector<int>::const_iterator iIt = indices.begin (); iIt != indices.end (); ++iIt)
396 accu [0] += cloud[*iIt].x * cloud[*iIt].x;
397 accu [1] += cloud[*iIt].x * cloud[*iIt].y;
398 accu [2] += cloud[*iIt].x * cloud[*iIt].z;
399 accu [3] += cloud[*iIt].y * cloud[*iIt].y;
400 accu [4] += cloud[*iIt].y * cloud[*iIt].z;
401 accu [5] += cloud[*iIt].z * cloud[*iIt].z;
404 if (point_count != 0)
406 accu /=
static_cast<float> (point_count);
407 covariance_matrix.coeffRef (0) = accu [0];
408 covariance_matrix.coeffRef (1) = covariance_matrix.coeffRef (3) = accu [1];
409 covariance_matrix.coeffRef (2) = covariance_matrix.coeffRef (6) = accu [2];
410 covariance_matrix.coeffRef (4) = accu [3];
411 covariance_matrix.coeffRef (5) = covariance_matrix.coeffRef (7) = accu [4];
412 covariance_matrix.coeffRef (8) = accu [5];
414 return (point_count);
417 template <
typename Po
intT>
inline unsigned int
420 Eigen::Matrix3f &covariance_matrix)
426 template <
typename Po
intT>
inline unsigned int
428 Eigen::Matrix3d &covariance_matrix)
431 Eigen::Matrix<double, 1, 6, Eigen::RowMajor> accu = Eigen::Matrix<double, 1, 6, Eigen::RowMajor>::Zero ();
433 unsigned int point_count;
436 point_count = cloud.
size ();
438 for (
size_t i = 0; i < point_count; ++i)
440 accu [0] += cloud[i].x * cloud[i].x;
441 accu [1] += cloud[i].x * cloud[i].y;
442 accu [2] += cloud[i].x * cloud[i].z;
443 accu [3] += cloud[i].y * cloud[i].y;
444 accu [4] += cloud[i].y * cloud[i].z;
445 accu [5] += cloud[i].z * cloud[i].z;
451 for (
size_t i = 0; i < cloud.
points.size (); ++i)
456 accu [0] += cloud[i].x * cloud[i].x;
457 accu [1] += cloud[i].x * cloud[i].y;
458 accu [2] += cloud[i].x * cloud[i].z;
459 accu [3] += cloud[i].y * cloud[i].y;
460 accu [4] += cloud[i].y * cloud[i].z;
461 accu [5] += cloud[i].z * cloud[i].z;
466 if (point_count != 0)
468 accu /=
static_cast<double> (point_count);
469 covariance_matrix.coeffRef (0) = accu [0];
470 covariance_matrix.coeffRef (1) = covariance_matrix.coeffRef (3) = accu [1];
471 covariance_matrix.coeffRef (2) = covariance_matrix.coeffRef (6) = accu [2];
472 covariance_matrix.coeffRef (4) = accu [3];
473 covariance_matrix.coeffRef (5) = covariance_matrix.coeffRef (7) = accu [4];
474 covariance_matrix.coeffRef (8) = accu [5];
476 return (point_count);
480 template <
typename Po
intT>
inline unsigned int
482 const std::vector<int> &indices,
483 Eigen::Matrix3d &covariance_matrix)
486 Eigen::Matrix<double, 1, 6, Eigen::RowMajor> accu = Eigen::Matrix<double, 1, 6, Eigen::RowMajor>::Zero ();
488 unsigned int point_count;
491 point_count = indices.size ();
492 for (std::vector<int>::const_iterator iIt = indices.begin (); iIt != indices.end (); ++iIt)
495 accu [0] += cloud[*iIt].x * cloud[*iIt].x;
496 accu [1] += cloud[*iIt].x * cloud[*iIt].y;
497 accu [2] += cloud[*iIt].x * cloud[*iIt].z;
498 accu [3] += cloud[*iIt].y * cloud[*iIt].y;
499 accu [4] += cloud[*iIt].y * cloud[*iIt].z;
500 accu [5] += cloud[*iIt].z * cloud[*iIt].z;
506 for (std::vector<int>::const_iterator iIt = indices.begin (); iIt != indices.end (); ++iIt)
512 accu [0] += cloud[*iIt].x * cloud[*iIt].x;
513 accu [1] += cloud[*iIt].x * cloud[*iIt].y;
514 accu [2] += cloud[*iIt].x * cloud[*iIt].z;
515 accu [3] += cloud[*iIt].y * cloud[*iIt].y;
516 accu [4] += cloud[*iIt].y * cloud[*iIt].z;
517 accu [5] += cloud[*iIt].z * cloud[*iIt].z;
520 if (point_count != 0)
522 accu /=
static_cast<double> (point_count);
523 covariance_matrix.coeffRef (0) = accu [0];
524 covariance_matrix.coeffRef (1) = covariance_matrix.coeffRef (3) = accu [1];
525 covariance_matrix.coeffRef (2) = covariance_matrix.coeffRef (6) = accu [2];
526 covariance_matrix.coeffRef (4) = accu [3];
527 covariance_matrix.coeffRef (5) = covariance_matrix.coeffRef (7) = accu [4];
528 covariance_matrix.coeffRef (8) = accu [5];
530 return (point_count);
533 template <
typename Po
intT>
inline unsigned int
536 Eigen::Matrix3d &covariance_matrix)
542 template <
typename Po
intT>
inline unsigned int
544 Eigen::Matrix3f &covariance_matrix,
545 Eigen::Vector4f ¢roid)
548 Eigen::Matrix<float, 1, 9, Eigen::RowMajor> accu = Eigen::Matrix<float, 1, 9, Eigen::RowMajor>::Zero ();
552 point_count = cloud.
size ();
554 for (
size_t i = 0; i < point_count; ++i)
556 accu [0] += cloud[i].x * cloud[i].x;
557 accu [1] += cloud[i].x * cloud[i].y;
558 accu [2] += cloud[i].x * cloud[i].z;
559 accu [3] += cloud[i].y * cloud[i].y;
560 accu [4] += cloud[i].y * cloud[i].z;
561 accu [5] += cloud[i].z * cloud[i].z;
562 accu [6] += cloud[i].x;
563 accu [7] += cloud[i].y;
564 accu [8] += cloud[i].z;
570 for (
size_t i = 0; i < cloud.
points.size (); ++i)
575 accu [0] += cloud[i].x * cloud[i].x;
576 accu [1] += cloud[i].x * cloud[i].y;
577 accu [2] += cloud[i].x * cloud[i].z;
578 accu [3] += cloud[i].y * cloud[i].y;
579 accu [4] += cloud[i].y * cloud[i].z;
580 accu [5] += cloud[i].z * cloud[i].z;
581 accu [6] += cloud[i].x;
582 accu [7] += cloud[i].y;
583 accu [8] += cloud[i].z;
587 accu /=
static_cast<float> (point_count);
588 if (point_count != 0)
591 centroid[0] = accu[6]; centroid[1] = accu[7]; centroid[2] = accu[8];
593 covariance_matrix.coeffRef (0) = accu [0] - accu [6] * accu [6];
594 covariance_matrix.coeffRef (1) = accu [1] - accu [6] * accu [7];
595 covariance_matrix.coeffRef (2) = accu [2] - accu [6] * accu [8];
596 covariance_matrix.coeffRef (4) = accu [3] - accu [7] * accu [7];
597 covariance_matrix.coeffRef (5) = accu [4] - accu [7] * accu [8];
598 covariance_matrix.coeffRef (8) = accu [5] - accu [8] * accu [8];
599 covariance_matrix.coeffRef (3) = covariance_matrix.coeff (1);
600 covariance_matrix.coeffRef (6) = covariance_matrix.coeff (2);
601 covariance_matrix.coeffRef (7) = covariance_matrix.coeff (5);
603 return (static_cast<unsigned int> (point_count));
607 template <
typename Po
intT>
inline unsigned int
609 const std::vector<int> &indices,
610 Eigen::Matrix3f &covariance_matrix,
611 Eigen::Vector4f ¢roid)
614 Eigen::Matrix<float, 1, 9, Eigen::RowMajor> accu = Eigen::Matrix<float, 1, 9, Eigen::RowMajor>::Zero ();
618 point_count = indices.size ();
619 for (std::vector<int>::const_iterator iIt = indices.begin (); iIt != indices.end (); ++iIt)
622 accu [0] += cloud[*iIt].x * cloud[*iIt].x;
623 accu [1] += cloud[*iIt].x * cloud[*iIt].y;
624 accu [2] += cloud[*iIt].x * cloud[*iIt].z;
625 accu [3] += cloud[*iIt].y * cloud[*iIt].y;
626 accu [4] += cloud[*iIt].y * cloud[*iIt].z;
627 accu [5] += cloud[*iIt].z * cloud[*iIt].z;
628 accu [6] += cloud[*iIt].x;
629 accu [7] += cloud[*iIt].y;
630 accu [8] += cloud[*iIt].z;
636 for (std::vector<int>::const_iterator iIt = indices.begin (); iIt != indices.end (); ++iIt)
642 accu [0] += cloud[*iIt].x * cloud[*iIt].x;
643 accu [1] += cloud[*iIt].x * cloud[*iIt].y;
644 accu [2] += cloud[*iIt].x * cloud[*iIt].z;
645 accu [3] += cloud[*iIt].y * cloud[*iIt].y;
646 accu [4] += cloud[*iIt].y * cloud[*iIt].z;
647 accu [5] += cloud[*iIt].z * cloud[*iIt].z;
648 accu [6] += cloud[*iIt].x;
649 accu [7] += cloud[*iIt].y;
650 accu [8] += cloud[*iIt].z;
654 accu /=
static_cast<float> (point_count);
658 centroid[0] = accu[6]; centroid[1] = accu[7]; centroid[2] = accu[8];
660 covariance_matrix.coeffRef (0) = accu [0] - accu [6] * accu [6];
661 covariance_matrix.coeffRef (1) = accu [1] - accu [6] * accu [7];
662 covariance_matrix.coeffRef (2) = accu [2] - accu [6] * accu [8];
663 covariance_matrix.coeffRef (4) = accu [3] - accu [7] * accu [7];
664 covariance_matrix.coeffRef (5) = accu [4] - accu [7] * accu [8];
665 covariance_matrix.coeffRef (8) = accu [5] - accu [8] * accu [8];
666 covariance_matrix.coeffRef (3) = covariance_matrix.coeff (1);
667 covariance_matrix.coeffRef (6) = covariance_matrix.coeff (2);
668 covariance_matrix.coeffRef (7) = covariance_matrix.coeff (5);
670 return (static_cast<unsigned int> (point_count));
674 template <
typename Po
intT>
inline unsigned int
677 Eigen::Matrix3f &covariance_matrix,
678 Eigen::Vector4f ¢roid)
684 template <
typename Po
intT>
inline unsigned int
686 Eigen::Matrix3d &covariance_matrix,
687 Eigen::Vector4d ¢roid)
690 Eigen::Matrix<double, 1, 9, Eigen::RowMajor> accu = Eigen::Matrix<double, 1, 9, Eigen::RowMajor>::Zero ();
691 unsigned int point_count;
694 point_count = cloud.
size ();
696 for (
size_t i = 0; i < point_count; ++i)
698 accu [0] += cloud[i].x * cloud[i].x;
699 accu [1] += cloud[i].x * cloud[i].y;
700 accu [2] += cloud[i].x * cloud[i].z;
701 accu [3] += cloud[i].y * cloud[i].y;
702 accu [4] += cloud[i].y * cloud[i].z;
703 accu [5] += cloud[i].z * cloud[i].z;
704 accu [6] += cloud[i].x;
705 accu [7] += cloud[i].y;
706 accu [8] += cloud[i].z;
712 for (
size_t i = 0; i < cloud.
points.size (); ++i)
717 accu [0] += cloud[i].x * cloud[i].x;
718 accu [1] += cloud[i].x * cloud[i].y;
719 accu [2] += cloud[i].x * cloud[i].z;
720 accu [3] += cloud[i].y * cloud[i].y;
721 accu [4] += cloud[i].y * cloud[i].z;
722 accu [5] += cloud[i].z * cloud[i].z;
723 accu [6] += cloud[i].x;
724 accu [7] += cloud[i].y;
725 accu [8] += cloud[i].z;
730 if (point_count != 0)
732 accu /=
static_cast<double> (point_count);
733 centroid.head<3> () = accu.tail<3> ();
735 covariance_matrix.coeffRef (0) = accu [0] - accu [6] * accu [6];
736 covariance_matrix.coeffRef (1) = accu [1] - accu [6] * accu [7];
737 covariance_matrix.coeffRef (2) = accu [2] - accu [6] * accu [8];
738 covariance_matrix.coeffRef (4) = accu [3] - accu [7] * accu [7];
739 covariance_matrix.coeffRef (5) = accu [4] - accu [7] * accu [8];
740 covariance_matrix.coeffRef (8) = accu [5] - accu [8] * accu [8];
741 covariance_matrix.coeffRef (3) = covariance_matrix.coeff (1);
742 covariance_matrix.coeffRef (6) = covariance_matrix.coeff (2);
743 covariance_matrix.coeffRef (7) = covariance_matrix.coeff (5);
745 return (point_count);
749 template <
typename Po
intT>
inline unsigned int
751 const std::vector<int> &indices,
752 Eigen::Matrix3d &covariance_matrix,
753 Eigen::Vector4d ¢roid)
756 Eigen::Matrix<double, 1, 9, Eigen::RowMajor> accu = Eigen::Matrix<double, 1, 9, Eigen::RowMajor>::Zero ();
757 unsigned point_count;
760 point_count = indices.size ();
761 for (std::vector<int>::const_iterator iIt = indices.begin (); iIt != indices.end (); ++iIt)
764 accu [0] += cloud[*iIt].x * cloud[*iIt].x;
765 accu [1] += cloud[*iIt].x * cloud[*iIt].y;
766 accu [2] += cloud[*iIt].x * cloud[*iIt].z;
767 accu [3] += cloud[*iIt].y * cloud[*iIt].y;
768 accu [4] += cloud[*iIt].y * cloud[*iIt].z;
769 accu [5] += cloud[*iIt].z * cloud[*iIt].z;
770 accu [6] += cloud[*iIt].x;
771 accu [7] += cloud[*iIt].y;
772 accu [8] += cloud[*iIt].z;
778 for (std::vector<int>::const_iterator iIt = indices.begin (); iIt != indices.end (); ++iIt)
784 accu [0] += cloud[*iIt].x * cloud[*iIt].x;
785 accu [1] += cloud[*iIt].x * cloud[*iIt].y;
786 accu [2] += cloud[*iIt].x * cloud[*iIt].z;
787 accu [3] += cloud[*iIt].y * cloud[*iIt].y;
788 accu [4] += cloud[*iIt].y * cloud[*iIt].z;
789 accu [5] += cloud[*iIt].z * cloud[*iIt].z;
790 accu [6] += cloud[*iIt].x;
791 accu [7] += cloud[*iIt].y;
792 accu [8] += cloud[*iIt].z;
796 if (point_count != 0)
798 accu /=
static_cast<double> (point_count);
799 Eigen::Vector3f vec = accu.tail<3> ();
800 centroid.head<3> () = vec;
802 covariance_matrix.coeffRef (0) = accu [0] - accu [6] * accu [6];
803 covariance_matrix.coeffRef (1) = accu [1] - accu [6] * accu [7];
804 covariance_matrix.coeffRef (2) = accu [2] - accu [6] * accu [8];
805 covariance_matrix.coeffRef (4) = accu [3] - accu [7] * accu [7];
806 covariance_matrix.coeffRef (5) = accu [4] - accu [7] * accu [8];
807 covariance_matrix.coeffRef (8) = accu [5] - accu [8] * accu [8];
808 covariance_matrix.coeffRef (3) = covariance_matrix.coeff (1);
809 covariance_matrix.coeffRef (6) = covariance_matrix.coeff (2);
810 covariance_matrix.coeffRef (7) = covariance_matrix.coeff (5);
812 return (point_count);
816 template <
typename Po
intT>
inline unsigned int
819 Eigen::Matrix3d &covariance_matrix,
820 Eigen::Vector4d ¢roid)
825 template <
typename Po
intT>
void
827 const Eigen::Vector4f ¢roid,
830 cloud_out = cloud_in;
833 for (
size_t i = 0; i < cloud_in.
points.size (); ++i)
834 cloud_out.
points[i].getVector4fMap () -= centroid;
838 template <
typename Po
intT>
void
840 const std::vector<int> &indices,
841 const Eigen::Vector4f ¢roid,
846 if (indices.size () == cloud_in.
points.size ())
853 cloud_out.
width =
static_cast<uint32_t
> (indices.size ());
856 cloud_out.
points.resize (indices.size ());
859 for (
size_t i = 0; i < indices.size (); ++i)
860 cloud_out.
points[i].getVector4fMap () = cloud_in.
points[indices[i]].getVector4fMap () -
865 template <
typename Po
intT>
void
867 const Eigen::Vector4f ¢roid,
868 Eigen::MatrixXf &cloud_out)
870 size_t npts = cloud_in.
points.size ();
872 cloud_out = Eigen::MatrixXf::Zero (4, npts);
874 for (
size_t i = 0; i < npts; ++i)
876 cloud_out.block<4, 1> (0, i) = cloud_in.
points[i].getVector4fMap () - centroid;
879 cloud_out.block (3, 0, 1, npts).setZero ();
883 template <
typename Po
intT>
void
885 const std::vector<int> &indices,
886 const Eigen::Vector4f ¢roid,
887 Eigen::MatrixXf &cloud_out)
889 size_t npts = indices.size ();
891 cloud_out = Eigen::MatrixXf::Zero (4, npts);
893 for (
size_t i = 0; i < npts; ++i)
895 cloud_out.block<4, 1> (0, i) = cloud_in.
points[indices[i]].getVector4fMap () - centroid;
898 cloud_out.block (3, 0, 1, npts).setZero ();
902 template <
typename Po
intT>
void
905 const Eigen::Vector4f ¢roid,
906 Eigen::MatrixXf &cloud_out)
912 template <
typename Po
intT>
inline void
918 centroid.setZero (boost::mpl::size<FieldList>::value);
920 if (cloud.
points.empty ())
923 int size =
static_cast<int> (cloud.
points.size ());
924 for (
int i = 0; i < size; ++i)
929 centroid /=
static_cast<float> (size);
933 template <
typename Po
intT>
inline void
935 Eigen::VectorXf ¢roid)
940 centroid.setZero (boost::mpl::size<FieldList>::value);
942 if (indices.empty ())
945 int nr_points =
static_cast<int> (indices.size ());
946 for (
int i = 0; i < nr_points; ++i)
951 centroid /=
static_cast<float> (nr_points);
955 template <
typename Po
intT>
inline void
959 return (pcl::computeNDCentroid<PointT> (cloud, indices.
indices, centroid));
962 #endif //#ifndef PCL_COMMON_IMPL_CENTROID_H_