From e04875d33d3eb70bd47888c2cc1ff546682a27de Mon Sep 17 00:00:00 2001 From: cignoni Date: Wed, 11 Sep 2013 11:08:23 +0000 Subject: [PATCH] Added sample for point cloud subsampling --- .../trimesh_pointcloud_sampling.cpp | 89 +++++++++++++++++++ .../trimesh_pointcloud_sampling.pro | 3 + 2 files changed, 92 insertions(+) create mode 100644 apps/sample/trimesh_pointcloud_sampling/trimesh_pointcloud_sampling.cpp create mode 100644 apps/sample/trimesh_pointcloud_sampling/trimesh_pointcloud_sampling.pro diff --git a/apps/sample/trimesh_pointcloud_sampling/trimesh_pointcloud_sampling.cpp b/apps/sample/trimesh_pointcloud_sampling/trimesh_pointcloud_sampling.cpp new file mode 100644 index 00000000..49c96068 --- /dev/null +++ b/apps/sample/trimesh_pointcloud_sampling/trimesh_pointcloud_sampling.cpp @@ -0,0 +1,89 @@ +/**************************************************************************** +* VCGLib o o * +* Visual and Computer Graphics Library o o * +* _ O _ * +* Copyright(C) 2004-2012 \/)\/ * +* Visual Computing Lab /\/| * +* ISTI - Italian National Research Council | * +* \ * +* All rights reserved. * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * +* for more details. * +* * +****************************************************************************/ +#include + +#include +#include + +#include +#include +#include + +using namespace vcg; +using namespace std; + +class MyEdge; +class MyFace; +class MyVertex; +struct MyUsedTypes : public UsedTypes< Use ::AsVertexType, + Use ::AsEdgeType, + Use ::AsFaceType>{}; + +class MyVertex : public Vertex{}; +class MyFace : public Face< MyUsedTypes, face::FFAdj, face::Normal3f, face::VertexRef, face::BitFlags > {}; +class MyEdge : public Edge{}; +class MyMesh : public tri::TriMesh< vector, vector , vector > {}; + +int main( int argc, char **argv ) +{ + if(argc<3) + { + printf("Usage trimesh_base radius (as perc) (\n"); + return -1; + } + + MyMesh m; + MyMesh subM; + MyMesh cluM; + MyMesh rndM; + + tri::MeshSampler mps(subM); + + if(tri::io::Importer::Open(m,argv[1])!=0) + { + printf("Error reading file %s\n",argv[1]); + exit(0); + } + tri::SurfaceSampling >::SamplingRandomGenerator().initialize(time(0)); + float perc = atof(argv[2]); + + float radius = m.bbox.Diag() * perc; + printf("Subsampling a PointCloud of %i vert with %f radius\n",m.VN(),radius); + tri::SurfaceSampling >::PoissonDiskParam pp; + tri::SurfaceSampling >::PoissonDiskParam::Stat pds; pp.pds=&pds; + pp.bestSampleChoiceFlag=false; + tri::SurfaceSampling >::PoissonDiskPruning(mps, m, radius, pp); + tri::io::ExporterPLY::Save(subM,"PoissonMesh.ply"); + printf("Sampled %i vertices in %5.2f\n",subM.VN(), float(pds.pruneTime+pds.gridTime)/float(CLOCKS_PER_SEC)); + + int t0=clock(); + tri::Clustering > ClusteringGrid; + ClusteringGrid.Init(m.bbox,100000,radius); + ClusteringGrid.AddPointSet(m); + ClusteringGrid.ExtractMesh(cluM); + int t1=clock(); + tri::io::ExporterPLY::Save(cluM,"ClusterMesh.ply"); + printf("Sampled %i vertices in %5.2f\n",cluM.VN(), float(t1-t0)/float(CLOCKS_PER_SEC)); + + return 0; +} diff --git a/apps/sample/trimesh_pointcloud_sampling/trimesh_pointcloud_sampling.pro b/apps/sample/trimesh_pointcloud_sampling/trimesh_pointcloud_sampling.pro new file mode 100644 index 00000000..25fbc5fe --- /dev/null +++ b/apps/sample/trimesh_pointcloud_sampling/trimesh_pointcloud_sampling.pro @@ -0,0 +1,3 @@ +include(../common.pri) +TARGET = trimesh_pointcloud_sampling +SOURCES += trimesh_pointcloud_sampling.cpp ../../../wrap/ply/plylib.cpp