5#include <Eigen/Geometry>
7#include <pcl/PointIndices.h>
8#include <pcl/common/io.h>
9#include <pcl/point_cloud.h>
10#include <pcl/point_types.h>
11#include <pcl/point_types_conversion.h>
21 Eigen::Vector3f
pointCloudMedian(
const pcl::PointCloud<pcl::PointXYZRGBA>& cloud,
22 const pcl::PointIndices& indices = {});
26 const pcl::PointIndices& indices,
27 Eigen::Vector3f center = Eigen::Vector3f::Zero());
29 Eigen::Vector3f center = Eigen::Vector3f::Zero());
35 pcl::PointIndicesPtr
getPlaneInliers(
const pcl::PointCloud<pcl::PointXYZRGBA>& cloud,
41 const pcl::PointXYZHSV& rhs,
42 const Eigen::Vector3f& hsvWeights = Eigen::Vector3f::Ones());
44 const Eigen::Vector3f& rhs,
45 const Eigen::Vector3f& hsvWeights = Eigen::Vector3f::Ones());
48 Eigen::Vector3f
hsvMean(
const pcl::PointCloud<pcl::PointXYZHSV>& hsvCloud,
49 const std::vector<int>& indices);
51 template <
class Po
intRGB>
53 hsvMean(
const pcl::PointCloud<PointRGB>& rgbCloud,
const std::vector<int>& indices)
55 pcl::PointCloud<pcl::PointXYZHSV> hsvCloud;
56 pcl::PointCloudXYZRGBAtoXYZHSV(rgbCloud, hsvCloud);
57 return hsvMean(hsvCloud, indices);
60 template <
class Po
intT>
63 const std::vector<int>& indices,
64 pcl::PointCloud<PointT>& output)
66 const std::set<int> indexSet(indices.begin(), indices.end());
68 output.reserve(input.size() - indexSet.size());
69 for (
size_t i = 0; i < input.size(); ++i)
71 if (indexSet.count(
int(i)) == 0)
73 output.push_back(input[i]);
78 template <
class Po
intT>
79 typename pcl::PointCloud<PointT>::Ptr
81 const std::vector<int>& indices)
83 typename pcl::PointCloud<PointT>::Ptr output(
new pcl::PointCloud<PointT>);
88 template <
class Po
intT>
89 typename pcl::PointCloud<PointT>::Ptr
92 typename pcl::PointCloud<PointT>::Ptr output(
new pcl::PointCloud<PointT>);
93 pcl::copyPointCloud(input, indices, *output);
97 template <
class Po
intT>
98 typename pcl::PointCloud<PointT>::Ptr
101 typename pcl::PointCloud<PointT>::Ptr output(
new pcl::PointCloud<PointT>);
102 pcl::copyPointCloud(input, indices.indices, *output);
109 return lhs.indices.size() > rhs.indices.size();
118 template <
class Po
intT>
122 const auto isNan = [](
const PointT& p) ->
bool {
return std::isnan(p.z); };
124 pc.points.erase(std::remove_if(pc.points.begin(), pc.points.end(), isNan), pc.points.end());
127 pc.width = pc.points.size();
Hyperplane< float, 3 > Hyperplane3f
bool comparePointClustersDescending(const pcl::PointIndices &lhs, const pcl::PointIndices &rhs)
pcl::PointIndicesPtr getPlaneInliers(const pcl::PointCloud< pcl::PointXYZRGBA > &cloud, Eigen::Hyperplane3f plane, float maxDistance)
void copyPointCloudWithoutIndices(const pcl::PointCloud< PointT > &input, const std::vector< int > &indices, pcl::PointCloud< PointT > &output)
void sortPointClustersDescending(std::vector< pcl::PointIndices > &clusterIndices)
Eigen::Hyperplane3f fitPlaneSVD(const pcl::PointCloud< pcl::PointXYZRGBA > &cloud, const pcl::PointIndices &indices, Eigen::Vector3f center=Eigen::Vector3f::Zero())
pcl::PointCloud< PointT >::Ptr getPointCloudWithIndices(const pcl::PointCloud< PointT > &input, const std::vector< int > &indices)
void filterNaNs(pcl::PointCloud< PointT > &pc)
float hsvDistance(const pcl::PointXYZHSV &lhs, const pcl::PointXYZHSV &rhs, const Eigen::Vector3f &hsvWeights=Eigen::Vector3f::Ones())
pcl::PointCloud< PointT >::Ptr getPointCloudWithoutIndices(const pcl::PointCloud< PointT > &input, const std::vector< int > &indices)
Eigen::Hyperplane3f alignPlaneNormal(Eigen::Hyperplane3f plane, Eigen::Vector3f normal)
Flip plane if its normal does not point towards normal.
Eigen::Vector3f pointCloudMedian(const pcl::PointCloud< pcl::PointXYZRGBA > &cloud, const pcl::PointIndices &indices={})
Eigen::Vector3f hsvMean(const pcl::PointCloud< pcl::PointXYZHSV > &hsvCloud, const std::vector< int > &indices)