Skip to content

Commit

Permalink
Change CovarianceFeaturesFilter mode from string to enum
Browse files Browse the repository at this point in the history
  • Loading branch information
chambbj committed Jul 15, 2020
1 parent 85d6821 commit bf53757
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 11 deletions.
45 changes: 35 additions & 10 deletions filters/CovarianceFeaturesFilter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,37 @@ std::string CovarianceFeaturesFilter::getName() const
return s_info.name;
}

std::istream& operator>>(std::istream& in, CovarianceFeaturesFilter::Mode& mode)
{
std::string s;
in >> s;

s = Utils::tolower(s);
if (s == "raw")
mode = CovarianceFeaturesFilter::Mode::Raw;
else if (s == "sqrt")
mode = CovarianceFeaturesFilter::Mode::SQRT;
else if (s == "normalized")
mode = CovarianceFeaturesFilter::Mode::Normalized;
else
in.setstate(std::ios_base::failbit);
return in;
}

std::ostream& operator<<(std::ostream& out, const CovarianceFeaturesFilter::Mode& mode)
{
switch (mode)
{
case CovarianceFeaturesFilter::Mode::Raw:
out << "raw";
case CovarianceFeaturesFilter::Mode::SQRT:
out << "sqrt";
case CovarianceFeaturesFilter::Mode::Normalized:
out << "normalized";
}
return out;
}

void CovarianceFeaturesFilter::addArgs(ProgramArgs& args)
{
args.add("knn", "k-Nearest neighbors", m_knn, 10);
Expand All @@ -75,7 +106,7 @@ void CovarianceFeaturesFilter::addArgs(ProgramArgs& args)
args.add("radius", "Radius for nearest neighbor search", m_radius, 0.0);
args.add("min_k", "Minimum number of neighbors in radius", m_minK, 3);
m_featuresArg = &args.add("features", "List of featurs to be computed", m_features);
args.add("mode", "Raw, normalized, or sqrt of eigenvalues", m_mode, "");
args.add("mode", "Raw, normalized, or sqrt of eigenvalues", m_mode, Mode::Raw);
args.add("optimized", "Use OptimalKNN or OptimalRadius?", m_optimal, false);
}

Expand All @@ -98,7 +129,7 @@ void CovarianceFeaturesFilter::addDimensions(PointLayoutPtr layout)
{
if (m_featureSet == "Dimensionality")
{
m_mode = "SQRT";
m_mode = Mode::SQRT;
for (auto dim :
{"Linearity", "Planarity", "Scattering", "Verticality"})
m_extraDims[dim] =
Expand Down Expand Up @@ -165,10 +196,6 @@ void CovarianceFeaturesFilter::setDimensionality(PointView &view, const PointId
else if (m_radiusArg->set())
{
ids = kdi.radius(p, m_radius);

// if insufficient number of neighbors, eigen solver will fail anyway,
// it may be okay to silently return without setting any of the computed
// features?
if (ids.size() < (size_t)m_minK)
return;
}
Expand All @@ -195,9 +222,7 @@ void CovarianceFeaturesFilter::setDimensionality(PointView &view, const PointId
if (lambda[0] == 0)
throwError("Eigenvalues are all 0. Can't compute local features.");

// TODO(chambbj): currently no error checking on mode, should probably be an enum anyway

if (m_mode == "SQRT")
if (m_mode == Mode::SQRT)
{
// Gressin, Adrien, Clément Mallet, and N. David. "Improving 3d lidar
// point cloud registration using optimal neighborhood knowledge."
Expand All @@ -207,7 +232,7 @@ void CovarianceFeaturesFilter::setDimensionality(PointView &view, const PointId
std::transform(lambda.begin(), lambda.end(), lambda.begin(),
[](double v) -> double { return std::sqrt(v); });
}
else if (m_mode == "NORM")
else if (m_mode == Mode::Normalized)
{
std::transform(lambda.begin(), lambda.end(), lambda.begin(),
[&sum](double v) -> double { return v / sum; });
Expand Down
13 changes: 12 additions & 1 deletion filters/CovarianceFeaturesFilter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,12 @@ class PDAL_DLL CovarianceFeaturesFilter: public Filter
std::string getName() const;

private:
enum class Mode
{
Raw,
SQRT,
Normalized
};

int m_knn;
int m_threads;
Expand All @@ -60,7 +66,7 @@ class PDAL_DLL CovarianceFeaturesFilter: public Filter
int m_minK;
Arg* m_featuresArg;
StringList m_features;
std::string m_mode;
Mode m_mode;
Dimension::Id m_kopt, m_ropt;
Arg* m_radiusArg;
bool m_optimal;
Expand All @@ -71,6 +77,11 @@ class PDAL_DLL CovarianceFeaturesFilter: public Filter
virtual void prepared(PointTableRef table);

void setDimensionality(PointView &view, const PointId &id, const KD3Index &kid);

friend std::istream& operator>>(std::istream& in,
CovarianceFeaturesFilter::Mode& mode);
friend std::ostream& operator<<(std::ostream& in,
const CovarianceFeaturesFilter::Mode& mode);
};
}

0 comments on commit bf53757

Please sign in to comment.