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
13namespace Eigen
14{
15 using Hyperplane3f = Hyperplane<float, 3>;
16}
17
18namespace 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,
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>);
84 copyPointCloudWithoutIndices(input, indices, *output);
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
Hyperplane< float, 3 > Hyperplane3f
Definition Elements.h:34
ArmarX headers.
bool comparePointClustersDescending(const pcl::PointIndices &lhs, const pcl::PointIndices &rhs)
Definition tools.h:107
pcl::PointIndicesPtr getPlaneInliers(const pcl::PointCloud< pcl::PointXYZRGBA > &cloud, Eigen::Hyperplane3f plane, float maxDistance)
Definition tools.cpp:98
void copyPointCloudWithoutIndices(const pcl::PointCloud< PointT > &input, const std::vector< int > &indices, pcl::PointCloud< PointT > &output)
Definition tools.h:62
void sortPointClustersDescending(std::vector< pcl::PointIndices > &clusterIndices)
Definition tools.h:113
Eigen::Hyperplane3f fitPlaneSVD(const pcl::PointCloud< pcl::PointXYZRGBA > &cloud, const pcl::PointIndices &indices, Eigen::Vector3f center=Eigen::Vector3f::Zero())
Definition tools.cpp:52
pcl::PointCloud< PointT >::Ptr getPointCloudWithIndices(const pcl::PointCloud< PointT > &input, const std::vector< int > &indices)
Definition tools.h:90
void filterNaNs(pcl::PointCloud< PointT > &pc)
Definition tools.h:120
float hsvDistance(const pcl::PointXYZHSV &lhs, const pcl::PointXYZHSV &rhs, const Eigen::Vector3f &hsvWeights=Eigen::Vector3f::Ones())
Definition tools.cpp:114
pcl::PointCloud< PointT >::Ptr getPointCloudWithoutIndices(const pcl::PointCloud< PointT > &input, const std::vector< int > &indices)
Definition tools.h:80
Eigen::Hyperplane3f alignPlaneNormal(Eigen::Hyperplane3f plane, Eigen::Vector3f normal)
Flip plane if its normal does not point towards normal.
Definition tools.cpp:154
Eigen::Vector3f pointCloudMedian(const pcl::PointCloud< pcl::PointXYZRGBA > &cloud, const pcl::PointIndices &indices={})
Definition tools.cpp:7
Eigen::Vector3f hsvMean(const pcl::PointCloud< pcl::PointXYZHSV > &hsvCloud, const std::vector< int > &indices)
Definition tools.cpp:135