Skip to content

Commit

Permalink
Make extra dimensions flexible
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolas-chaulet committed Apr 16, 2019
1 parent 16e8002 commit e3d380a
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 14 deletions.
2 changes: 1 addition & 1 deletion doc/stages/filters.covariancefeatures.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ filters.covariancefeatures
===============================================================================

This filter implements various local feature descriptors introduced that are based on the covariance matrix of a
point's neighborhood. The suer can pick a set of feature descriptors by
point's neighborhood. The user can pick a set of feature descriptors by
setting the ``feature_set`` option. Currently, the only supported feature is the dimensionality_
set of feature descriptors introduced below.

Expand Down
17 changes: 9 additions & 8 deletions filters/CovarianceFeaturesFilter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,11 @@ void CovarianceFeaturesFilter::addArgs(ProgramArgs& args)

void CovarianceFeaturesFilter::addDimensions(PointLayoutPtr layout)
{
m_linearity = layout->registerOrAssignDim("Linearity", Dimension::Type::Float);
m_planarity = layout->registerOrAssignDim("Planarity", Dimension::Type::Float);
m_scattering = layout->registerOrAssignDim("Scattering", Dimension::Type::Float);
m_verticality = layout->registerOrAssignDim("Verticality", Dimension::Type::Float);
if (m_featureSet == "Dimensionality")
{
for (auto dim: {"Linearity", "Planarity", "Scattering", "Verticality"})
m_extraDims[dim] = layout->registerOrAssignDim(dim, Dimension::Type::Float);
}
}

void CovarianceFeaturesFilter::filter(PointView& view)
Expand Down Expand Up @@ -137,9 +138,9 @@ void CovarianceFeaturesFilter::setDimensionality(PointView &view, const PointId
float linearity = (sqrtf(lambda[0]) - sqrtf(lambda[1])) / sqrtf(lambda[0]);
float planarity = (sqrtf(lambda[1]) - sqrtf(lambda[2])) / sqrtf(lambda[0]);
float scattering = sqrtf(lambda[2]) / sqrtf(lambda[0]);
view.setField(m_linearity, id, linearity);
view.setField(m_planarity, id, planarity);
view.setField(m_scattering, id, scattering);
view.setField(m_extraDims["Linearity"], id, linearity);
view.setField(m_extraDims["Planarity"], id, planarity);
view.setField(m_extraDims["Scattering"], id, scattering);

std::vector<float> unary_vector(3);
float norm = 0;
Expand All @@ -149,6 +150,6 @@ void CovarianceFeaturesFilter::setDimensionality(PointView &view, const PointId
norm += unary_vector[i] * unary_vector[i];
}
norm = sqrtf(norm);
view.setField(m_verticality, id, unary_vector[2] / norm);
view.setField(m_extraDims["Verticality"], id, unary_vector[2] / norm);
}
}
6 changes: 1 addition & 5 deletions filters/CovarianceFeaturesFilter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,17 +54,13 @@ class PDAL_DLL CovarianceFeaturesFilter: public Filter
int m_knn;
int m_threads;
std::string m_featureSet;
std::map<std::string,Dimension::Id> m_extraDims;

virtual void addDimensions(PointLayoutPtr layout);
virtual void addArgs(ProgramArgs &args);
virtual void filter(PointView &view);

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

Dimension::Id m_linearity;
Dimension::Id m_planarity;
Dimension::Id m_scattering;
Dimension::Id m_verticality;
};
}

0 comments on commit e3d380a

Please sign in to comment.