21 #include <nanoflann.hpp>
24 #include "Eigen/Dense"
32 typedef Eigen::Array<bool, Eigen::Dynamic, Eigen::Dynamic> XXb;
33 typedef Eigen::Array<bool, Eigen::Dynamic, Eigen::Dynamic> Xb;
49 void showWolman(
const Eigen::ArrayXf& d_sample,
50 const Eigen::Array3d& dq_final,
51 const Eigen::Array3d& edq);
57 bool merge(XXb& condition);
58 bool keep(Xb& condition);
93 using KDTree = nanoflann::KDTreeSingleIndexAdaptor<
94 nanoflann::L2_Simple_Adaptor<float, CloudAdaptor>,
101 void addToStack(
int index,
102 const Eigen::ArrayXi& n_donors,
103 const Eigen::ArrayXXi& donors,
104 std::vector<int>& stack);
105 int segmentLabels(
bool useParallelStrategy =
true);
106 double angleRot2VecMat(
const Eigen::Vector3d& a,
const Eigen::Vector3d& b);
107 Eigen::ArrayXXd computeMeanAngleBetweenNormalsAtBorders();
108 bool exportLocalMaximaAsCloud(
const Eigen::ArrayXi& localMaximumIndexes);
109 bool updateLocalMaximumIndexes();
110 bool updateLabelsAndColors();
111 bool checkStacks(
const std::vector<std::vector<int>>& stacks,
int count);
112 void addToStackBraunWillett(
int index,
113 const Eigen::ArrayXi& delta,
114 const Eigen::ArrayXi& Di,
115 std::vector<int>& stack,
117 int segmentLabelsBraunWillett();
118 void getNeighborsDistancesSlopes(
unsigned index,
119 std::vector<char>& duplicates);
120 void computeNodeSurfaces();
121 bool computeNormalsAndOrientThem();
122 void orientNormals(
const Eigen::Vector3d& sensorCenter);
123 bool findNearestNeighborsNanoFlann(
const unsigned int globalIndex,
126 bool computeNormWithFlann(
unsigned int index,
129 bool computeNormals();
132 bool useParallelStrategy =
true);
140 double m_radiusFactor = 0.6;
141 double m_maxAngle1 = 60;
142 double m_maxAngle2 = 10;
144 double m_minFlatness = 0.1;
150 Eigen::ArrayXXi m_neighborsIndexes;
151 Eigen::ArrayXXd m_neighborsDistances;
152 Eigen::ArrayXXd m_neighborsSlopes;
153 Eigen::ArrayXXd m_normals;
155 Eigen::ArrayXi m_initial_labels;
156 Eigen::ArrayXi m_initial_labelsnpoint;
157 Eigen::ArrayXi m_initial_localMaximumIndexes;
158 Eigen::ArrayXi m_labels;
159 Eigen::ArrayXi m_labelsnpoint;
160 Eigen::ArrayXi m_localMaximumIndexes;
161 Eigen::ArrayXi m_ndon;
162 Eigen::ArrayXd m_area;
164 QSharedPointer<RGBAColorsTableType> m_grainColors;
166 std::vector<std::vector<int>> m_initialStacks;
167 std::vector<std::vector<int>> m_stacks;
170 unsigned char m_bestOctreeLevel = 0;
173 static std::shared_ptr<G3PointAction> s_g3PointAction;
175 static QPointer<G3PointPlots> s_g3PointPlots;
179 int m_currentNumberOfSteps;
nanoflann::KDTreeSingleIndexAdaptor< nanoflann::L2_Simple_Adaptor< float, CloudAdaptor >, CloudAdaptor, 3 > KDTree
static bool EigenArrayToFile(QString name, T array)
bool buildStacksFromG3PointLabelSF(cloudViewer::ScalarField *g3PointLabel)
void showWolman(const Eigen::ArrayXf &d_sample, const Eigen::Array3d &dq_final, const Eigen::Array3d &edq)
bool merge(XXb &condition)
G3PointAction(ccPointCloud *cloud, ecvMainAppInterface *app=nullptr)
static void GetG3PointAction(ccPointCloud *cloud, ecvMainAppInterface *app=nullptr)
bool processNewStacks(std::vector< std::vector< int >> &newStacks, int pointCount)
static void createAction(ecvMainAppInterface *appInterface)
Array of (uncompressed) 3D normals (Nx,Ny,Nz)
std::vector< ccHObject * > Container
Standard instances container (for children, etc.)
QSharedPointer< ccOctree > Shared
Shared pointer.
A 3D cloud and its associated features (color, normals, scalar fields, etc.)
unsigned size() const override
const CCVector3 * getPoint(unsigned index) const override
A very simple point cloud (no point duplication)
A simple scalar field (to be associated to a point cloud)
Main application interface (for plugins)
size_t kdtree_get_point_count() const
CloudAdaptor(const ccPointCloud *c)
float kdtree_get_pt(const size_t idx, int dim) const
bool kdtree_get_bbox(BBOX &) const
const ccPointCloud * cloud