begin cluster_labels function

This commit is contained in:
Paul Leroy
2024-02-06 10:36:20 +01:00
parent e79eb39b75
commit 63005fc695
2 changed files with 40 additions and 24 deletions
+5 -1
View File
@@ -26,6 +26,7 @@ private:
bool sfConvertToRandomRGB(const ccHObject::Container &selectedEntities, QWidget* parent);
void add_to_stack(int index, const Eigen::ArrayXi& n_donors, const Eigen::ArrayXXi& donors, std::vector<int>& stack);
int segment_labels(bool useParallelStrategy=true);
int cluster_labels();
int segment_labels_steepest_slope(bool useParallelStrategy=true);
void add_to_stack_braun_willett(int index, const Eigen::ArrayXi& delta, const Eigen::ArrayXi &Di, std::vector<int>& stack, int local_maximum);
int segment_labels_braun_willett(bool useParallelStrategy=true);
@@ -43,7 +44,10 @@ private:
unsigned char m_bestOctreeLevel = 0;
CCCoreLib::DgmOctree::NearestNeighboursSearchStruct m_nNSS;
ccMainAppInterface *m_app;
Eigen::ArrayXi m_stack;
std::vector<std::vector<int>> m_stacks;
Eigen::ArrayXi m_labels;
Eigen::ArrayXi m_labelsnpoint;
Eigen::ArrayXi m_localMaximumIndexes;
qG3PointDialog* m_dlg;
static G3PointAction* s_g3PointAction;
+35 -23
View File
@@ -214,7 +214,6 @@ int G3PointAction::segment_labels(bool useParallelStrategy)
// build the stacks
std::cout << "[segment_labels] build the stacks" << std::endl;
Eigen::ArrayXi labels = Eigen::ArrayXi::Zero(m_cloud->size());
Eigen::ArrayXi labelsk = Eigen::ArrayXi::Zero(m_cloud->size());
Eigen::ArrayXi labelsnpoint = Eigen::ArrayXi::Zero(m_cloud->size());
std::vector<std::vector<int>> stacks;
@@ -246,7 +245,7 @@ int G3PointAction::segment_labels(bool useParallelStrategy)
for (auto i : stack)
{
labels(i) = k;
labelsnpoint(i) = m_stack.size();
labelsnpoint(i) = stack.size();
if (g3point_label)
{
g3point_label->setValue(i, k);
@@ -287,6 +286,25 @@ int G3PointAction::segment_labels(bool useParallelStrategy)
return nLabels;
}
int G3PointAction::cluster_labels()
{
ccLog::Print("[cluster_labels]");
int nlabels = m_stacks.size();
// Compute the distances between sinks associated to each label
Eigen::ArrayXXd D1;
D1.resize(nlabels, nlabels);
for (int i = 0; i < nlabels; i++)
{
for (int j = 0; j < nlabels; j++)
{
D1(i, j) = (*m_cloud->getPoint(m_localMaximumIndexes(i)) - *m_cloud->getPoint(m_localMaximumIndexes(j))).norm();
}
}
return 0;
}
void G3PointAction::add_to_stack_braun_willett(int index, const Eigen::ArrayXi& delta, const Eigen::ArrayXi& Di, std::vector<int>& stack, int local_maximum)
{
stack.push_back(index);
@@ -324,13 +342,13 @@ int G3PointAction::segment_labels_braun_willett(bool useParallelStrategy)
// if the minimum slope is positive, the receiver is a local maximum
int nb_maxima = (min_slopes > 0).count();
Eigen::ArrayXi localMaximumIndexes = Eigen::ArrayXi::Zero(nb_maxima);
Eigen::ArrayXi m_localMaximumIndexes = Eigen::ArrayXi::Zero(nb_maxima);
int l = 0;
for (unsigned int k = 0; k < m_cloud->size(); k++)
{
if (min_slopes(k) > 0)
{
localMaximumIndexes(l) = k;
m_localMaximumIndexes(l) = k;
receivers(k) = k;
l++;
}
@@ -346,13 +364,11 @@ int G3PointAction::segment_labels_braun_willett(bool useParallelStrategy)
Dij.push_back(list_of_donors);
}
std::cout << "[segment_labels_braun_willett] create di and Dij" << std::endl;
std::vector<int> di_vec(m_cloud->size());
for (unsigned int k = 0; k < m_cloud->size(); k++)
{
int receiver = receivers(k);
di[receiver] = di[receiver] + 1;
di_vec[receiver] = di[receiver];
Dij[receiver].push_back(k);
di[receiver] = di[receiver] + 1; // increment the number of donors of the receiver
Dij[receiver].push_back(k); // add the donor the the list of donors of the receiver
}
// build Di, the list of donors
@@ -380,10 +396,6 @@ int G3PointAction::segment_labels_braun_willett(bool useParallelStrategy)
// build the stacks
std::cout << "[segment_labels_braun_willett] build the stacks" << std::endl;
Eigen::ArrayXi labels = Eigen::ArrayXi::Zero(m_cloud->size());
Eigen::ArrayXi labelsk = Eigen::ArrayXi::Zero(m_cloud->size());
Eigen::ArrayXi labelsnpoint = Eigen::ArrayXi::Zero(m_cloud->size());
std::vector<std::vector<int>> stacks;
int sfIdx = m_cloud->getScalarFieldIndexByName("g3point_label");
if (sfIdx == -1)
@@ -394,9 +406,9 @@ int G3PointAction::segment_labels_braun_willett(bool useParallelStrategy)
ccLog::Error("[G3Point::segment_labels] impossible to create scalar field g3point_label");
}
}
CCCoreLib::ScalarField* g3point_label = m_cloud->getScalarField(sfIdx);
RGBAColorsTableType randomColors = getRandomColors(localMaximumIndexes.size());
RGBAColorsTableType randomColors = getRandomColors(m_localMaximumIndexes.size());
if (!m_cloud->resizeTheRGBTable(false))
{
@@ -404,23 +416,23 @@ int G3PointAction::segment_labels_braun_willett(bool useParallelStrategy)
return -1;
}
for (int k = 0; k < localMaximumIndexes.size(); k++)
for (int k = 0; k < m_localMaximumIndexes.size(); k++)
{
int localMaximumIndex = localMaximumIndexes(k);
int localMaximumIndex = m_localMaximumIndexes(k);
std::vector<int> stack;
add_to_stack_braun_willett(localMaximumIndex, delta, Di, stack, localMaximumIndex);
// labels
for (auto i : stack)
{
labels(i) = k;
labelsnpoint(i) = m_stack.size();
m_labels(i) = k;
(i) = stack.size();
if (g3point_label)
{
g3point_label->setValue(i, k);
m_cloud->setPointColor(i, randomColors.getValue(k));
}
}
stacks.push_back(stack);
m_stacks.push_back(stack);
}
if (g3point_label)
@@ -449,7 +461,7 @@ int G3PointAction::segment_labels_braun_willett(bool useParallelStrategy)
m_app->updateUI();
}
int nLabels = localMaximumIndexes.size();
int nLabels = m_localMaximumIndexes.size();
return nLabels;
}
@@ -519,7 +531,6 @@ int G3PointAction::segment_labels_steepest_slope(bool useParallelStrategy)
// build the stacks
std::cout << "[segment_labels] build the stacks" << std::endl;
Eigen::ArrayXi labels = Eigen::ArrayXi::Zero(m_cloud->size());
Eigen::ArrayXi labelsk = Eigen::ArrayXi::Zero(m_cloud->size());
Eigen::ArrayXi labelsnpoint = Eigen::ArrayXi::Zero(m_cloud->size());
std::vector<std::vector<int>> stacks;
@@ -551,7 +562,7 @@ int G3PointAction::segment_labels_steepest_slope(bool useParallelStrategy)
for (auto i : stack)
{
labels(i) = k;
labelsnpoint(i) = m_stack.size();
labelsnpoint(i) = stack.size();
if (g3point_label)
{
g3point_label->setValue(i, k);
@@ -682,7 +693,8 @@ void G3PointAction::run()
m_neighbors_indexes.resize(m_cloud->size(), m_kNN);
m_neighbors_distances.resize(m_cloud->size(), m_kNN);
m_neighbors_slopes.resize(m_cloud->size(), m_kNN);
m_stack.resize(m_cloud->size());
m_labels = Eigen::ArrayXi::Zero(m_cloud->size());
m_labelsnpoint = Eigen::ArrayXi::Zero(m_cloud->size());
// Find neighbors of each point of the cloud
query_neighbors(m_cloud, m_app, true);