Skip to content

Commit 8bff20f

Browse files
WIP: creation of the aggregatino function that associates point cloud segments to mesh faces
1 parent e320d64 commit 8bff20f

File tree

2 files changed

+117
-9
lines changed

2 files changed

+117
-9
lines changed

src/diffCheck/segmentation/DFSegmentation.cc

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,90 @@ namespace diffCheck::segmentation
9797

9898
return segments;
9999
}
100+
101+
std::tuple<std::shared_ptr<geometry::DFPointCloud>, std::vector<std::shared_ptr<geometry::DFPointCloud>>> DFSegmentation::AssociateSegments(
102+
std::vector<std::shared_ptr<geometry::DFMesh>> meshFaces,
103+
std::vector<std::shared_ptr<geometry::DFPointCloud>> segments,
104+
double associationThreshold)
105+
{
106+
std::shared_ptr<geometry::DFPointCloud> unifiedPointCloud = std::make_shared<geometry::DFPointCloud>();
107+
std::vector<std::shared_ptr<geometry::DFPointCloud>> segmentsRemainder;
108+
109+
// iterate through the mesh faces given as function argument
110+
for (auto face : meshFaces)
111+
{
112+
std::shared_ptr<geometry::DFPointCloud> correspondingSegment;
113+
114+
// Getting the center of the mesh face
115+
Eigen::Vector3d faceCenter = Eigen::Vector3d::Zero();
116+
for (auto vertex : face->Vertices){faceCenter += vertex;}
117+
faceCenter /= face->GetNumVertices();
118+
119+
if (face->NormalsFace.size() == 0)
120+
{
121+
std::cout << "face has no normals, computing normals" << std::endl;
122+
std::shared_ptr<open3d::geometry::TriangleMesh> o3dFace = face->Cvt2O3DTriangleMesh();
123+
o3dFace->ComputeTriangleNormals();
124+
face->NormalsFace.clear();
125+
for (auto normal : o3dFace->triangle_normals_)
126+
{
127+
face->NormalsFace.push_back(normal.cast<double>());
128+
}
129+
}
130+
131+
// Getting the normal of the mesh face
132+
Eigen::Vector3d faceNormal = face->NormalsFace[0];
133+
134+
// iterate through the segments to find the closest ones compared to the face center taking the normals into account
135+
Eigen::Vector3d segmentCenter = Eigen::Vector3d::Zero();
136+
Eigen::Vector3d segmentNormal = Eigen::Vector3d::Zero();
137+
double faceDistance = (segments[0]->Points[0] - faceCenter).norm() / std::pow(std::abs(segments[0]->Normals[0].dot(faceNormal)), 2);
138+
int segmentIndex = 0;
139+
for (auto segment : segments)
140+
{
141+
for (auto point : segment->Points)
142+
{
143+
segmentCenter += point;
144+
}
145+
segmentCenter /= segment->GetNumPoints();
146+
147+
if (segment->Normals.size() == 0)
148+
{
149+
std::shared_ptr<open3d::geometry::PointCloud> o3dSegment = segment->Cvt2O3DPointCloud();
150+
o3dSegment->EstimateNormals();
151+
segment->Normals.clear();
152+
for (auto normal : o3dSegment->normals_)
153+
{
154+
segment->Normals.push_back(normal.cast<double>());
155+
}
156+
}
157+
for (auto normal : segment->Normals)
158+
{
159+
segmentNormal += normal;
160+
}
161+
segmentNormal.normalize();
162+
163+
double currentDistance = (faceCenter - segmentCenter).norm() / std::pow(std::abs(segmentNormal.dot(faceNormal)), 2);
164+
// if the distance is smaller than the previous one, update the distance and the corresponding segment
165+
if (currentDistance < faceDistance)
166+
{
167+
correspondingSegment = segment;
168+
// storing previous segment in the remainder vector
169+
faceDistance = currentDistance;
170+
}
171+
segmentIndex++;
172+
}
173+
// remove the segment fron the segments vector
174+
segments.erase(std::remove(segments.begin(), segments.end(), correspondingSegment), segments.end());
175+
176+
// Add the closest points of the corresponding segment to the unified point cloud
177+
for (auto point : correspondingSegment->Points)
178+
{
179+
unifiedPointCloud->Points.push_back(point);
180+
correspondingSegment->Points.erase(std::remove(correspondingSegment->Points.begin(), correspondingSegment->Points.end(), point), correspondingSegment->Points.end());
181+
}
182+
}
183+
return std::make_tuple(unifiedPointCloud, segments);
184+
}
185+
100186
} // namespace diffCheck::segmentation

src/diffCheckApp.cc

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,30 +7,52 @@
77
int main()
88
{
99
std::shared_ptr<diffCheck::geometry::DFPointCloud> pcdSrc = std::make_shared<diffCheck::geometry::DFPointCloud>();
10-
std::shared_ptr<diffCheck::geometry::DFMesh> meshSrc = std::make_shared<diffCheck::geometry::DFMesh>();
10+
std::vector<std::shared_ptr<diffCheck::geometry::DFMesh>> meshSrc = std::vector<std::shared_ptr<diffCheck::geometry::DFMesh>>();
1111
std::vector<std::shared_ptr<diffCheck::geometry::DFPointCloud>> segments;
12-
std::string pathMeshSrc = R"(C:\Users\localuser\Downloads\02_mesh.ply)";
12+
std::vector<std::string> meshPaths;
13+
14+
std::string meshesFolderPath = R"(C:\Users\localuser\Desktop\other_meshes_for_diffCheck\)";
15+
16+
for (int i = 1; i <= 14; i++)
17+
{
18+
std::string meshPath = meshesFolderPath + std::to_string(i) + ".ply";
19+
std::shared_ptr<diffCheck::geometry::DFMesh> mesh = std::make_shared<diffCheck::geometry::DFMesh>();
20+
mesh->LoadFromPLY(meshPath);
21+
meshSrc.push_back(mesh);
22+
}
23+
1324
std::string pathPcdSrc = R"(C:\Users\localuser\Downloads\02_points_with_errors_1e6_pts.ply)";
1425

1526
pcdSrc->LoadFromPLY(pathPcdSrc);
16-
meshSrc->LoadFromPLY(pathMeshSrc);
1727

18-
segments = diffCheck::segmentation::DFSegmentation::NormalBasedSegmentation(*pcdSrc, 0.01, 1, 30, true, 50, 30);
28+
segments = diffCheck::segmentation::DFSegmentation::NormalBasedSegmentation(*pcdSrc, 5, 1, 20, true, 50, 200);
1929
std::cout << "number of segments:" << segments.size()<< std::endl;
2030

31+
std::tuple<std::shared_ptr<diffCheck::geometry::DFPointCloud>, std::vector<std::shared_ptr<diffCheck::geometry::DFPointCloud>>> unifiedSegments =
32+
diffCheck::segmentation::DFSegmentation::AssociateSegments(meshSrc, segments, 50);
33+
34+
2135
diffCheck::visualizer::Visualizer vis;
22-
vis.AddMesh(meshSrc);
23-
for (auto segment : segments)
36+
for (int i = 0; i < 1; i++)
2437
{
2538
// colorize the segments with random colors
2639
double r = static_cast<double>(rand()) / RAND_MAX;
2740
double g = static_cast<double>(rand()) / RAND_MAX;
2841
double b = static_cast<double>(rand()) / RAND_MAX;
29-
for (int i = 0; i < segment->Points.size(); i++)
42+
for (int i = 0; i < std::get<0>(unifiedSegments)->Points.size(); i++)
43+
{
44+
std::get<0>(unifiedSegments)->Colors.push_back(Eigen::Vector3d(r, g, b));
45+
}
46+
vis.AddPointCloud(std::get<0>(unifiedSegments));
47+
48+
for (auto segemt : std::get<1>(unifiedSegments))
3049
{
31-
segment->Colors.push_back(Eigen::Vector3d(r, g, b));
50+
for (int i = 0; i < segemt->Points.size(); i++)
51+
{
52+
segemt->Colors.push_back(Eigen::Vector3d(0, 0, 1));
53+
}
54+
vis.AddPointCloud(segemt);
3255
}
33-
vis.AddPointCloud(segment);
3456

3557
}
3658
vis.Run();

0 commit comments

Comments
 (0)