begin cluster_labels function
This commit is contained in:
+5
-1
@@ -26,6 +26,7 @@ private:
|
|||||||
bool sfConvertToRandomRGB(const ccHObject::Container &selectedEntities, QWidget* parent);
|
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);
|
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 segment_labels(bool useParallelStrategy=true);
|
||||||
|
int cluster_labels();
|
||||||
int segment_labels_steepest_slope(bool useParallelStrategy=true);
|
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);
|
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);
|
int segment_labels_braun_willett(bool useParallelStrategy=true);
|
||||||
@@ -43,7 +44,10 @@ private:
|
|||||||
unsigned char m_bestOctreeLevel = 0;
|
unsigned char m_bestOctreeLevel = 0;
|
||||||
CCCoreLib::DgmOctree::NearestNeighboursSearchStruct m_nNSS;
|
CCCoreLib::DgmOctree::NearestNeighboursSearchStruct m_nNSS;
|
||||||
ccMainAppInterface *m_app;
|
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;
|
qG3PointDialog* m_dlg;
|
||||||
|
|
||||||
static G3PointAction* s_g3PointAction;
|
static G3PointAction* s_g3PointAction;
|
||||||
|
|||||||
+35
-23
@@ -214,7 +214,6 @@ int G3PointAction::segment_labels(bool useParallelStrategy)
|
|||||||
// build the stacks
|
// build the stacks
|
||||||
std::cout << "[segment_labels] build the stacks" << std::endl;
|
std::cout << "[segment_labels] build the stacks" << std::endl;
|
||||||
Eigen::ArrayXi labels = Eigen::ArrayXi::Zero(m_cloud->size());
|
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());
|
Eigen::ArrayXi labelsnpoint = Eigen::ArrayXi::Zero(m_cloud->size());
|
||||||
std::vector<std::vector<int>> stacks;
|
std::vector<std::vector<int>> stacks;
|
||||||
|
|
||||||
@@ -246,7 +245,7 @@ int G3PointAction::segment_labels(bool useParallelStrategy)
|
|||||||
for (auto i : stack)
|
for (auto i : stack)
|
||||||
{
|
{
|
||||||
labels(i) = k;
|
labels(i) = k;
|
||||||
labelsnpoint(i) = m_stack.size();
|
labelsnpoint(i) = stack.size();
|
||||||
if (g3point_label)
|
if (g3point_label)
|
||||||
{
|
{
|
||||||
g3point_label->setValue(i, k);
|
g3point_label->setValue(i, k);
|
||||||
@@ -287,6 +286,25 @@ int G3PointAction::segment_labels(bool useParallelStrategy)
|
|||||||
return nLabels;
|
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)
|
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);
|
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
|
// if the minimum slope is positive, the receiver is a local maximum
|
||||||
int nb_maxima = (min_slopes > 0).count();
|
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;
|
int l = 0;
|
||||||
for (unsigned int k = 0; k < m_cloud->size(); k++)
|
for (unsigned int k = 0; k < m_cloud->size(); k++)
|
||||||
{
|
{
|
||||||
if (min_slopes(k) > 0)
|
if (min_slopes(k) > 0)
|
||||||
{
|
{
|
||||||
localMaximumIndexes(l) = k;
|
m_localMaximumIndexes(l) = k;
|
||||||
receivers(k) = k;
|
receivers(k) = k;
|
||||||
l++;
|
l++;
|
||||||
}
|
}
|
||||||
@@ -346,13 +364,11 @@ int G3PointAction::segment_labels_braun_willett(bool useParallelStrategy)
|
|||||||
Dij.push_back(list_of_donors);
|
Dij.push_back(list_of_donors);
|
||||||
}
|
}
|
||||||
std::cout << "[segment_labels_braun_willett] create di and Dij" << std::endl;
|
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++)
|
for (unsigned int k = 0; k < m_cloud->size(); k++)
|
||||||
{
|
{
|
||||||
int receiver = receivers(k);
|
int receiver = receivers(k);
|
||||||
di[receiver] = di[receiver] + 1;
|
di[receiver] = di[receiver] + 1; // increment the number of donors of the receiver
|
||||||
di_vec[receiver] = di[receiver];
|
Dij[receiver].push_back(k); // add the donor the the list of donors of the receiver
|
||||||
Dij[receiver].push_back(k);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// build Di, the list of donors
|
// build Di, the list of donors
|
||||||
@@ -380,10 +396,6 @@ int G3PointAction::segment_labels_braun_willett(bool useParallelStrategy)
|
|||||||
|
|
||||||
// build the stacks
|
// build the stacks
|
||||||
std::cout << "[segment_labels_braun_willett] build the stacks" << std::endl;
|
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");
|
int sfIdx = m_cloud->getScalarFieldIndexByName("g3point_label");
|
||||||
if (sfIdx == -1)
|
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");
|
ccLog::Error("[G3Point::segment_labels] impossible to create scalar field g3point_label");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CCCoreLib::ScalarField* g3point_label = m_cloud->getScalarField(sfIdx);
|
CCCoreLib::ScalarField* g3point_label = m_cloud->getScalarField(sfIdx);
|
||||||
RGBAColorsTableType randomColors = getRandomColors(localMaximumIndexes.size());
|
|
||||||
|
RGBAColorsTableType randomColors = getRandomColors(m_localMaximumIndexes.size());
|
||||||
|
|
||||||
if (!m_cloud->resizeTheRGBTable(false))
|
if (!m_cloud->resizeTheRGBTable(false))
|
||||||
{
|
{
|
||||||
@@ -404,23 +416,23 @@ int G3PointAction::segment_labels_braun_willett(bool useParallelStrategy)
|
|||||||
return -1;
|
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;
|
std::vector<int> stack;
|
||||||
add_to_stack_braun_willett(localMaximumIndex, delta, Di, stack, localMaximumIndex);
|
add_to_stack_braun_willett(localMaximumIndex, delta, Di, stack, localMaximumIndex);
|
||||||
// labels
|
// labels
|
||||||
for (auto i : stack)
|
for (auto i : stack)
|
||||||
{
|
{
|
||||||
labels(i) = k;
|
m_labels(i) = k;
|
||||||
labelsnpoint(i) = m_stack.size();
|
(i) = stack.size();
|
||||||
if (g3point_label)
|
if (g3point_label)
|
||||||
{
|
{
|
||||||
g3point_label->setValue(i, k);
|
g3point_label->setValue(i, k);
|
||||||
m_cloud->setPointColor(i, randomColors.getValue(k));
|
m_cloud->setPointColor(i, randomColors.getValue(k));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stacks.push_back(stack);
|
m_stacks.push_back(stack);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g3point_label)
|
if (g3point_label)
|
||||||
@@ -449,7 +461,7 @@ int G3PointAction::segment_labels_braun_willett(bool useParallelStrategy)
|
|||||||
m_app->updateUI();
|
m_app->updateUI();
|
||||||
}
|
}
|
||||||
|
|
||||||
int nLabels = localMaximumIndexes.size();
|
int nLabels = m_localMaximumIndexes.size();
|
||||||
|
|
||||||
return nLabels;
|
return nLabels;
|
||||||
}
|
}
|
||||||
@@ -519,7 +531,6 @@ int G3PointAction::segment_labels_steepest_slope(bool useParallelStrategy)
|
|||||||
// build the stacks
|
// build the stacks
|
||||||
std::cout << "[segment_labels] build the stacks" << std::endl;
|
std::cout << "[segment_labels] build the stacks" << std::endl;
|
||||||
Eigen::ArrayXi labels = Eigen::ArrayXi::Zero(m_cloud->size());
|
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());
|
Eigen::ArrayXi labelsnpoint = Eigen::ArrayXi::Zero(m_cloud->size());
|
||||||
std::vector<std::vector<int>> stacks;
|
std::vector<std::vector<int>> stacks;
|
||||||
|
|
||||||
@@ -551,7 +562,7 @@ int G3PointAction::segment_labels_steepest_slope(bool useParallelStrategy)
|
|||||||
for (auto i : stack)
|
for (auto i : stack)
|
||||||
{
|
{
|
||||||
labels(i) = k;
|
labels(i) = k;
|
||||||
labelsnpoint(i) = m_stack.size();
|
labelsnpoint(i) = stack.size();
|
||||||
if (g3point_label)
|
if (g3point_label)
|
||||||
{
|
{
|
||||||
g3point_label->setValue(i, k);
|
g3point_label->setValue(i, k);
|
||||||
@@ -682,7 +693,8 @@ void G3PointAction::run()
|
|||||||
m_neighbors_indexes.resize(m_cloud->size(), m_kNN);
|
m_neighbors_indexes.resize(m_cloud->size(), m_kNN);
|
||||||
m_neighbors_distances.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_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
|
// Find neighbors of each point of the cloud
|
||||||
query_neighbors(m_cloud, m_app, true);
|
query_neighbors(m_cloud, m_app, true);
|
||||||
|
|||||||
Reference in New Issue
Block a user