tools.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <set>
4 
5 #include <Eigen/Geometry>
6 
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>
12 
13 namespace Eigen
14 {
15  using Hyperplane3f = Hyperplane<float, 3>;
16 }
17 
18 namespace visionx
19 {
20 
21  Eigen::Vector3f pointCloudMedian(const pcl::PointCloud<pcl::PointXYZRGBA>& cloud,
22  const pcl::PointIndices& indices = {});
23 
24 
25  Eigen::Hyperplane3f fitPlaneSVD(const pcl::PointCloud<pcl::PointXYZRGBA>& cloud,
26  const pcl::PointIndices& indices,
27  Eigen::Vector3f center = Eigen::Vector3f::Zero());
28  Eigen::Hyperplane3f fitPlaneSVD(const pcl::PointCloud<pcl::PointXYZRGBA>& cloud,
29  Eigen::Vector3f center = Eigen::Vector3f::Zero());
30 
31  /// Flip `plane` if its normal does not point towards `normal`.
32  Eigen::Hyperplane3f alignPlaneNormal(Eigen::Hyperplane3f plane, Eigen::Vector3f normal);
33 
34 
35  pcl::PointIndicesPtr getPlaneInliers(const pcl::PointCloud<pcl::PointXYZRGBA>& cloud,
36  Eigen::Hyperplane3f plane,
37  float maxDistance);
38 
39 
40  float hsvDistance(const pcl::PointXYZHSV& lhs,
41  const pcl::PointXYZHSV& rhs,
42  const Eigen::Vector3f& hsvWeights = Eigen::Vector3f::Ones());
43  float hsvDistance(const Eigen::Vector3f& lhs,
44  const Eigen::Vector3f& rhs,
45  const Eigen::Vector3f& hsvWeights = Eigen::Vector3f::Ones());
46 
47 
48  Eigen::Vector3f hsvMean(const pcl::PointCloud<pcl::PointXYZHSV>& hsvCloud,
49  const std::vector<int>& indices);
50 
51  template <class PointRGB>
52  Eigen::Vector3f
53  hsvMean(const pcl::PointCloud<PointRGB>& rgbCloud, const std::vector<int>& indices)
54  {
55  pcl::PointCloud<pcl::PointXYZHSV> hsvCloud;
56  pcl::PointCloudXYZRGBAtoXYZHSV(rgbCloud, hsvCloud);
57  return hsvMean(hsvCloud, indices);
58  }
59 
60  template <class PointT>
61  void
62  copyPointCloudWithoutIndices(const pcl::PointCloud<PointT>& input,
63  const std::vector<int>& indices,
64  pcl::PointCloud<PointT>& output)
65  {
66  const std::set<int> indexSet(indices.begin(), indices.end());
67  output.clear();
68  output.reserve(input.size() - indexSet.size());
69  for (size_t i = 0; i < input.size(); ++i)
70  {
71  if (indexSet.count(int(i)) == 0)
72  {
73  output.push_back(input[i]);
74  }
75  }
76  }
77 
78  template <class PointT>
79  typename pcl::PointCloud<PointT>::Ptr
80  getPointCloudWithoutIndices(const pcl::PointCloud<PointT>& input,
81  const std::vector<int>& indices)
82  {
83  typename pcl::PointCloud<PointT>::Ptr output(new pcl::PointCloud<PointT>);
85  return output;
86  }
87 
88  template <class PointT>
89  typename pcl::PointCloud<PointT>::Ptr
90  getPointCloudWithIndices(const pcl::PointCloud<PointT>& input, const std::vector<int>& indices)
91  {
92  typename pcl::PointCloud<PointT>::Ptr output(new pcl::PointCloud<PointT>);
93  pcl::copyPointCloud(input, indices, *output);
94  return output;
95  }
96 
97  template <class PointT>
98  typename pcl::PointCloud<PointT>::Ptr
99  getPointCloudWithIndices(const pcl::PointCloud<PointT>& input, const pcl::PointIndices& indices)
100  {
101  typename pcl::PointCloud<PointT>::Ptr output(new pcl::PointCloud<PointT>);
102  pcl::copyPointCloud(input, indices.indices, *output);
103  return output;
104  }
105 
106  inline bool
107  comparePointClustersDescending(const pcl::PointIndices& lhs, const pcl::PointIndices& rhs)
108  {
109  return lhs.indices.size() > rhs.indices.size();
110  }
111 
112  inline void
113  sortPointClustersDescending(std::vector<pcl::PointIndices>& clusterIndices)
114  {
115  std::sort(clusterIndices.begin(), clusterIndices.end(), comparePointClustersDescending);
116  }
117 
118  template <class PointT>
119  inline void
120  filterNaNs(pcl::PointCloud<PointT>& pc)
121  {
122  const auto isNan = [](const PointT& p) -> bool { return std::isnan(p.z); };
123 
124  pc.points.erase(std::remove_if(pc.points.begin(), pc.points.end(), isNan), pc.points.end());
125 
126  // Needed?
127  pc.width = pc.points.size();
128  pc.height = 1;
129  pc.is_dense = true;
130  }
131 
132 } // namespace visionx
visionx::fitPlaneSVD
Eigen::Hyperplane3f fitPlaneSVD(const pcl::PointCloud< pcl::PointXYZRGBA > &cloud, const pcl::PointIndices &indices, Eigen::Vector3f center=Eigen::Vector3f::Zero())
Definition: tools.cpp:52
Eigen
Definition: Elements.h:32
visionx
ArmarX headers.
Definition: OpenPoseStressTest.h:38
visionx::hsvDistance
float hsvDistance(const pcl::PointXYZHSV &lhs, const pcl::PointXYZHSV &rhs, const Eigen::Vector3f &hsvWeights=Eigen::Vector3f::Ones())
Definition: tools.cpp:114
visionx::sortPointClustersDescending
void sortPointClustersDescending(std::vector< pcl::PointIndices > &clusterIndices)
Definition: tools.h:113
visionx::pointCloudMedian
Eigen::Vector3f pointCloudMedian(const pcl::PointCloud< pcl::PointXYZRGBA > &cloud, const pcl::PointIndices &indices={})
Definition: tools.cpp:7
visionx::hsvMean
Eigen::Vector3f hsvMean(const pcl::PointCloud< pcl::PointXYZHSV > &hsvCloud, const std::vector< int > &indices)
Definition: tools.cpp:135
visionx::copyPointCloudWithoutIndices
void copyPointCloudWithoutIndices(const pcl::PointCloud< PointT > &input, const std::vector< int > &indices, pcl::PointCloud< PointT > &output)
Definition: tools.h:62
pcl::graph::indices
pcl::PointIndices::Ptr indices(const PCG &g)
Retrieve the indices of the points of the point cloud stored in a point cloud graph that actually bel...
Definition: point_cloud_graph.h:717
Eigen::Hyperplane3f
Hyperplane< float, 3 > Hyperplane3f
Definition: Elements.h:34
armarx::aron::input
ReaderT::InputType & input
Definition: rw.h:12
visionx::getPlaneInliers
pcl::PointIndicesPtr getPlaneInliers(const pcl::PointCloud< pcl::PointXYZRGBA > &cloud, Eigen::Hyperplane3f plane, float maxDistance)
Definition: tools.cpp:98
visionx::getPointCloudWithoutIndices
pcl::PointCloud< PointT >::Ptr getPointCloudWithoutIndices(const pcl::PointCloud< PointT > &input, const std::vector< int > &indices)
Definition: tools.h:80
visionx::filterNaNs
void filterNaNs(pcl::PointCloud< PointT > &pc)
Definition: tools.h:120
visionx::alignPlaneNormal
Eigen::Hyperplane3f alignPlaneNormal(Eigen::Hyperplane3f plane, Eigen::Vector3f normal)
Flip plane if its normal does not point towards normal.
Definition: tools.cpp:154
armarx::view_selection::skills::direction::state::center
state::Type center(state::Type previous)
Definition: LookDirection.cpp:233
visionx::comparePointClustersDescending
bool comparePointClustersDescending(const pcl::PointIndices &lhs, const pcl::PointIndices &rhs)
Definition: tools.h:107
pc
Introduction Thank you for taking interest in our work and downloading this software This library implements the algorithm described in the paper R R R Klein Efficient RANSAC for Point Cloud Shape in Computer Graphics Blackwell June If you use this software you should cite the aforementioned paper in any resulting publication Please send comments or bug reports to Ruwen Roland BUT NOT LIMITED THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY OR CONSEQUENTIAL WHETHER IN STRICT OR EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE Example usage This section shows how to use the library to detect the shapes in a point cloud PointCloud pc
Definition: ReadMe.txt:68
visionx::getPointCloudWithIndices
pcl::PointCloud< PointT >::Ptr getPointCloudWithIndices(const pcl::PointCloud< PointT > &input, const std::vector< int > &indices)
Definition: tools.h:90
visionx::PointT
pcl::PointXYZRGBA PointT
Definition: MaskRCNNPointCloudObjectLocalizer.h:77