MCPcopy Create free account
hub / github.com/RozDavid/UnScene3D / segment_mesh_wrapper

Function segment_mesh_wrapper

utils/cpp_utils/segmentator.cpp:159–251  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

157// Wrapper function to first process input data
158namespace py = pybind11;
159py::tuple segment_mesh_wrapper(py::array np_vertices, py::array np_faces, py::array np_colors, const float kthr=0.005, const int segMinVerts=20){
160
161 // get sizes of objects
162 auto castedVertices = np_vertices.request();
163 auto castedFaces = np_faces.request();
164 auto castedColors = np_colors.request();
165 uint32_t nVertices = castedVertices.shape[0];
166 uint32_t nFaces = castedFaces.shape[0];
167
168 // Request buffers
169 float* request_vertices = (float*) castedVertices.ptr;
170 int* request_faces = (int*) castedFaces.ptr;
171 float* request_colors = (float*) castedColors.ptr;
172
173 // allocate and parse vectors
174 vector<vec3f> vertices(nVertices, vec3f(0., 0., 0.));
175 vector<vec3f> normals(nVertices, vec3f(0., 0., 0.));
176 vector<vec3f> colors(nVertices, vec3f(0., 0., 0.));
177 vector<vec3i> faces(nFaces, vec3f(0., 0., 0.));
178
179 for (int i = 0; i < nVertices; ++i) {
180 vertices[i] = vec3f(request_vertices[i * 3], request_vertices[i * 3 + 1], request_vertices[i * 3 + 2]);
181 colors[i] = vec3f(request_colors[i * 3], request_colors[i * 3 + 1], request_colors[i * 3 + 2]);
182 }
183 for (int i = 0; i < nFaces; ++i) {
184 faces[i] = vec3i(request_faces[i * 3], request_faces[i * 3 + 1], request_faces[i * 3 + 2]);
185 }
186
187 // Parse to MeshDataf object
188 // std::cout << "Segmenting: " << meshFile << ", threshold: " << kthr << ", min verts: " << segMinVerts << std::endl;
189 MeshDataf mesh;
190 mesh.m_Vertices = vertices;
191 mesh.m_Normals = normals;
192 mesh.m_Colors = colors;
193 mesh.m_FaceIndicesVertices = faces;
194
195 // Do the actual processing
196 // std::cout << "Starting segmentation with " << nVertices << " vertices and " << nFaces << " faces." << std::endl;
197 std::map<std::pair<int, int>, int> connectivity;
198 const vector<int> comps = segment_mesh(mesh, kthr, segMinVerts, connectivity);
199
200 // Map comps and connectivity to a [0-N] range instead of vertex indices
201 std::map<int, int> comp_mapping;
202 vector<int> comps_new;
203 comps_new = comps; // copy by value
204
205 // Get sorted unique components
206 sort(comps_new.begin(), comps_new.end());
207 auto last = unique(comps_new.begin(), comps_new.end());
208 comps_new.erase(last, comps_new.end());
209
210 // Add components to mapping
211 for (int unique_index = 0; unique_index < comps_new.size(); unique_index++) {
212 comp_mapping.insert(std::pair<int, int>(comps_new[unique_index], unique_index));
213 }
214
215 // Map components
216 comps_new = comps; // copy by value

Callers

nothing calls this directly

Calls 2

segment_meshFunction · 0.85
sizeMethod · 0.80

Tested by

no test coverage detected