3 #include <SimoxUtility/math/periodic/periodic_diff.h>
4 #include <SimoxUtility/math/periodic/periodic_mean.h>
8 const pcl::PointIndices&
indices)
10 std::vector<float> xs, ys, zs;
11 xs.reserve(cloud.size());
12 ys.reserve(cloud.size());
13 zs.reserve(cloud.size());
15 auto processPoint = [&](
const auto& p)
24 for (
const auto& p : cloud)
33 processPoint(cloud.at(
size_t(i)));
37 std::sort(xs.begin(), xs.end());
38 std::sort(ys.begin(), ys.end());
39 std::sort(zs.begin(), zs.end());
41 size_t index = cloud.size() / 2;
53 const pcl::PointIndices&
indices,
72 A = MatT(3, cloud.size());
73 for (
size_t i = 0; i < cloud.size(); ++i)
75 A.col(
int(i)) = Eigen::Vector3f(cloud[i].
data) -
center;
84 A.col(i++) = Eigen::Vector3f(cloud.at(
size_t(
index)).data) -
center;
89 Eigen::JacobiSVD<MatT> svd(
A, Eigen::ComputeFullU);
92 Eigen::Vector3f normal = svd.matrixU().col(2);
102 pcl::PointIndicesPtr inliers(
new pcl::PointIndices);
103 for (
size_t i = 0; i < cloud.size(); ++i)
105 if (plane.absDistance(Eigen::Vector3f(cloud[i].data)) <= maxDistance)
107 inliers->indices.push_back(
int(i));
115 const pcl::PointXYZHSV& rhs,
116 const Eigen::Vector3f& hsvWeights)
119 Eigen::Vector3f(lhs.h, lhs.s, lhs.v), Eigen::Vector3f(rhs.h, rhs.s, rhs.v), hsvWeights);
124 const Eigen::Vector3f& rhs,
125 const Eigen::Vector3f& hsvWeights)
127 Eigen::Array3f dists(simox::math::periodic_diff(lhs.x(), rhs.x(), 0.f, 360.f) / 180.f,
130 Eigen::Array3f weighted = hsvWeights.normalized().array() * dists.abs();
131 return weighted.sum();
138 std::vector<float> hues;
143 const auto& p = hsvCloud.at(
size_t(i));
148 float h = simox::math::periodic_mean(hues, 0.f, 360.f);
156 return plane.normal().dot(normal) >= 0 ? plane