DGtal  1.0.0
Typedefs | Functions
greedy-plane-segmentation-ex3.cpp File Reference
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include "DGtal/base/Common.h"
#include "DGtal/io/readers/VolReader.h"
#include "DGtal/io/Display3D.h"
#include "DGtal/io/viewers/Viewer3D.h"
#include "DGtal/io/DrawWithDisplay3DModifier.h"
#include "DGtal/images/ImageSelector.h"
#include "DGtal/images/imagesSetsUtils/SetFromImage.h"
#include "DGtal/topology/DigitalSurface.h"
#include "DGtal/topology/DigitalSetBoundary.h"
#include "DGtal/graph/BreadthFirstVisitor.h"
#include "DGtal/geometry/surfaces/COBANaivePlaneComputer.h"
#include "DGtal/helpers/StdDefs.h"
#include "ConfigExamples.h"
Include dependency graph for greedy-plane-segmentation-ex3.cpp:

Go to the source code of this file.

Typedefs

typedef DGtal::int64_t InternalInteger
 
typedef COBANaivePlaneComputer< Z3, InternalIntegerNaivePlaneComputer
 
typedef DigitalSetBoundary< KSpace, DigitalSetMyDigitalSurfaceContainer
 
typedef DigitalSurface< MyDigitalSurfaceContainerMyDigitalSurface
 
typedef MyDigitalSurface::ConstIterator ConstIterator
 
typedef MyDigitalSurface::Vertex Vertex
 
typedef MyDigitalSurface::SurfelSet SurfelSet
 
typedef SurfelSet::iterator SurfelSetIterator
 
typedef BreadthFirstVisitor< MyDigitalSurfaceVisitor
 

Functions

bool operator< (const VertexSize &vs1, const VertexSize &vs2)
 
int main (int argc, char **argv)
 [greedy-plane-segmentation-ex3-typedefs] More...
 

Detailed Description

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 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 for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Author
Jacques-Olivier Lachaud (jacqu.nosp@m.es-o.nosp@m.livie.nosp@m.r.la.nosp@m.chaud.nosp@m.@uni.nosp@m.v-sav.nosp@m.oie..nosp@m.fr ) Laboratory of Mathematics (CNRS, UMR 5127), University of Savoie, France
Date
2012/10/01

An example file named greedy-plane-segmentation-ex3.

This file is part of the DGtal library.

Definition in file greedy-plane-segmentation-ex3.cpp.

Typedef Documentation

◆ ConstIterator

Definition at line 65 of file greedy-plane-segmentation-ex3.cpp.

◆ InternalInteger

Definition at line 59 of file greedy-plane-segmentation-ex3.cpp.

◆ MyDigitalSurface

Definition at line 64 of file greedy-plane-segmentation-ex3.cpp.

◆ MyDigitalSurfaceContainer

Definition at line 63 of file greedy-plane-segmentation-ex3.cpp.

◆ NaivePlaneComputer

Definition at line 60 of file greedy-plane-segmentation-ex3.cpp.

◆ SurfelSet

Definition at line 67 of file greedy-plane-segmentation-ex3.cpp.

◆ SurfelSetIterator

typedef SurfelSet::iterator SurfelSetIterator

Definition at line 68 of file greedy-plane-segmentation-ex3.cpp.

◆ Vertex

Definition at line 66 of file greedy-plane-segmentation-ex3.cpp.

◆ Visitor

Definition at line 69 of file greedy-plane-segmentation-ex3.cpp.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

[greedy-plane-segmentation-ex3-typedefs]

[greedy-plane-segmentation-ex3-parseCommandLine]

[greedy-plane-segmentation-ex3-parseCommandLine]

[greedy-plane-segmentation-ex3-loadVolume]

[greedy-plane-segmentation-ex3-loadVolume]

[greedy-plane-segmentation-ex3-makeSurface]

[greedy-plane-segmentation-ex3-makeSurface]

[greedy-plane-segmentation-ex3-segment]

[greedy-plane-segmentation-ex3-segment]

[greedy-plane-segmentation-ex3-visualization]

[greedy-plane-segmentation-ex3-visualization]

[greedy-plane-segmentation-ex3-freeMemory]

[greedy-plane-segmentation-ex3-freeMemory]

Definition at line 95 of file greedy-plane-segmentation-ex3.cpp.

96 {
98  trace.info() << "Segments the surface at given threshold within given volume into digital planes of rational width num/den." << std::endl;
99  // Setting default options: ----------------------------------------------
100  // input file used:
101  string inputFilename = examplesPath + "samples/Al.100.vol" ;
102  trace.info() << "input file used " << inputFilename << std::endl;
103  // parameter threshold
104  unsigned int threshold = 0;
105  trace.info() << "the value that defines the isosurface in the image (an integer between 0 and 255)= " << threshold<< std::endl;
106  // parameter widthNum
107  unsigned int widthNum = 1;
108  trace.info() << "the numerator of the rational width (a non-null integer) =" << widthNum<< std::endl;
109  // parameter widthDen
110  unsigned int widthDen = 1;
111  trace.info() << "the denominator of the rational width (a non-null integer)= " << widthDen<< std::endl;
113 
115  QApplication application(argc,argv);
117  Image image = VolReader<Image>::importVol(inputFilename);
118  DigitalSet set3d (image.domain());
119  SetFromImage<DigitalSet>::append<Image>(set3d, image, threshold,255);
121 
123  trace.beginBlock( "Set up digital surface." );
124  // We initializes the cellular grid space used for defining the
125  // digital surface.
126  KSpace ks;
127  bool ok = ks.init( set3d.domain().lowerBound(),
128  set3d.domain().upperBound(), true );
129  if ( ! ok ) std::cerr << "[KSpace.init] Failed." << std::endl;
130  SurfelAdjacency<KSpace::dimension> surfAdj( true ); // interior in all directions.
131  MyDigitalSurfaceContainer* ptrSurfContainer =
132  new MyDigitalSurfaceContainer( ks, set3d, surfAdj );
133  MyDigitalSurface digSurf( ptrSurfContainer ); // acquired
134  trace.endBlock();
136 
138  Point p;
139  Dimension axis;
140  unsigned int j = 0;
141  unsigned int nb = digSurf.size();
142 
143  // First pass to find biggest planes.
144  trace.beginBlock( "1) Segmentation first pass. Computes all planes so as to sort vertices by the plane size." );
145  std::map<Vertex,unsigned int> v2size;
146  NaivePlaneComputer planeComputer;
147  std::priority_queue<VertexSize> Q;
148  std::vector<Point> layer;
149  for ( ConstIterator it = digSurf.begin(), itE= digSurf.end(); it != itE; ++it )
150  {
151  if ( ( (++j) % 50 == 0 ) || ( j == nb ) ) trace.progressBar( j, nb );
152  Vertex v = *it;
153  axis = ks.sOrthDir( v );
154  planeComputer.init( axis, 500, widthNum, widthDen );
155  // The visitor takes care of all the breadth-first traversal.
156  Visitor visitor( digSurf, v );
157  layer.clear();
158  Visitor::Size currentSize = visitor.current().second;
159  while ( ! visitor.finished() )
160  {
161  Visitor::Node node = visitor.current();
162  v = node.first;
163  axis = ks.sOrthDir( v );
164  p = ks.sCoords( ks.sDirectIncident( v, axis ) );
165  if ( node.second != currentSize )
166  {
167  // std::cerr << "Layer " << currentSize << ", size=" << layer.size() << std::endl;
168  bool isExtended = planeComputer.extend( layer.begin(), layer.end() );
169  if ( ! isExtended )
170  break;
171  layer.clear();
172  currentSize = node.second;
173  }
174  layer.push_back( p );
175  visitor.expand();
176  }
177  // std::cerr << v << " -> " << planeComputer.size() << std::endl;
178  Q.push( VertexSize( v, planeComputer.size() ) );
179  }
180  trace.endBlock();
181 
182  trace.beginBlock( "2) Segmentation second pass. Visits vertices from the one with biggest plane to the one with smallest plane." );
183  std::set<Vertex> processedVertices;
184  std::map<Vertex,SegmentedPlane*> v2plane;
185  std::vector<SegmentedPlane*> segmentedPlanes;
186  j = 0;
187  while ( ! Q.empty() )
188  {
189  if ( ( (++j) % 50 == 0 ) || ( j == nb ) ) trace.progressBar( j, nb );
190  Vertex v = Q.top().v;
191  Q.pop();
192  if ( processedVertices.find( v ) != processedVertices.end() ) // already in set
193  continue; // process to next vertex
194 
195  SegmentedPlane* ptrSegment = new SegmentedPlane;
196  segmentedPlanes.push_back( ptrSegment ); // to delete them afterwards.
197  axis = ks.sOrthDir( v );
198  ptrSegment->plane.init( axis, 500, widthNum, widthDen );
199  // The visitor takes care of all the breadth-first traversal.
200  Visitor visitor( digSurf, v );
201  while ( ! visitor.finished() )
202  {
203  Visitor::Node node = visitor.current();
204  v = node.first;
205  if ( processedVertices.find( v ) == processedVertices.end() )
206  { // Vertex is not in processedVertices
207  axis = ks.sOrthDir( v );
208  p = ks.sCoords( ks.sDirectIncident( v, axis ) );
209  bool isExtended = ptrSegment->plane.extend( p );
210  if ( isExtended )
211  { // surfel is in plane.
212  processedVertices.insert( v );
213  v2plane[ v ] = ptrSegment;
214  visitor.expand();
215  }
216  else // surfel is not in plane and should not be used in the visit.
217  visitor.ignore();
218  }
219  else // surfel is already in some plane.
220  visitor.ignore();
221  }
222  // Assign random color for each plane.
223  ptrSegment->color = Color( rand() % 256, rand() % 256, rand() % 256, 255 );
224  }
225  trace.endBlock();
227 
229  Viewer3D<> viewer( ks );
230  viewer.show();
231  Color col( 255, 255, 120 );
232  for ( std::map<Vertex,SegmentedPlane*>::const_iterator
233  it = v2plane.begin(), itE = v2plane.end();
234  it != itE; ++it )
235  {
236  viewer << CustomColors3D( it->second->color, it->second->color );
237  viewer << ks.unsigns( it->first );
238  }
239  viewer << Viewer3D<>::updateDisplay;
241 
243  for ( std::vector<SegmentedPlane*>::iterator
244  it = segmentedPlanes.begin(), itE = segmentedPlanes.end();
245  it != itE; ++it )
246  delete *it;
247  segmentedPlanes.clear();
248  v2plane.clear();
250 
251  return application.exec();
252 }
void beginBlock(const std::string &keyword="")
void init(Dimension axis, InternalInteger diameter, InternalInteger widthNumerator=NumberTraits< InternalInteger >::ONE, InternalInteger widthDenominator=NumberTraits< InternalInteger >::ONE)
void progressBar(const double currentValue, const double maximalValue)
Aim: implements association bewteen points lying in a digital domain and values.
Definition: Image.h:69
MyDigitalSurface::ConstIterator ConstIterator
Trace trace
Definition: Common.h:144
DGtal::uint32_t Dimension
Definition: Common.h:127
double endBlock()
Aim: Represents a set of n-1-cells in a nD space, together with adjacency relation between these cell...
Aim: A model of CDigitalSurfaceContainer which defines the digital surface as the boundary of a given...
Cell unsigns(const SCell &p) const
Creates an unsigned cell from a signed one.
Dimension sOrthDir(const SCell &s) const
Given a signed surfel [s], returns its orthogonal direction (ie, the coordinate where the surfel is c...
bool init(const Point &lower, const Point &upper, bool isClosed)
Specifies the upper and lower bounds for the maximal cells in this space.
bool extend(const Point &p)
Aim: implements methods to read a "Vol" file format.
Definition: VolReader.h:89
TriMesh::Vertex Vertex
Point sCoords(const SCell &c) const
Return its digital coordinates.
DigitalSetBoundary< KSpace, DigitalSet > MyDigitalSurfaceContainer
Aim: A wrapper class around a STL associative container for storing sets of digital points within som...
Aim: Define utilities to convert a digital set into an image.
Definition: SetFromImage.h:63
static Dimension size()
SCell sDirectIncident(const SCell &p, Dimension k) const
Return the direct incident cell of [p] along [k] (the incident cell along [k])
std::pair< Vertex, Data > Node
FIXME.
std::ostream & info()
ImageContainerBySTLVector< Domain, Value > Image
Aim: This class is useful to perform a breadth-first exploration of a graph given a starting point or...
Structure representing an RGB triple with alpha component.
Definition: Color.h:66
Aim: This class is a model of CCellularGridSpaceND. It represents the cubical grid as a cell complex,...

References DGtal::DigitalSurface< TDigitalSurfaceContainer >::begin(), DGtal::Trace::beginBlock(), DGtal::BreadthFirstVisitor< TGraph, TMarkSet >::current(), DGtal::DigitalSurface< TDigitalSurfaceContainer >::end(), DGtal::Trace::endBlock(), DGtal::BreadthFirstVisitor< TGraph, TMarkSet >::expand(), DGtal::COBANaivePlaneComputer< TSpace, TInternalInteger >::extend(), DGtal::BreadthFirstVisitor< TGraph, TMarkSet >::finished(), DGtal::BreadthFirstVisitor< TGraph, TMarkSet >::ignore(), DGtal::Trace::info(), DGtal::COBANaivePlaneComputer< TSpace, TInternalInteger >::init(), DGtal::KhalimskySpaceND< dim, TInteger >::init(), DGtal::Trace::progressBar(), DGtal::KhalimskySpaceND< dim, TInteger >::sCoords(), DGtal::KhalimskySpaceND< dim, TInteger >::sDirectIncident(), DGtal::Viewer3D< TSpace, TKSpace >::show(), DGtal::COBANaivePlaneComputer< TSpace, TInternalInteger >::size(), DGtal::DigitalSurface< TDigitalSurfaceContainer >::size(), DGtal::KhalimskySpaceND< dim, TInteger >::sOrthDir(), DGtal::trace, and DGtal::KhalimskySpaceND< dim, TInteger >::unsigns().

◆ operator<()

bool operator< ( const VertexSize &  vs1,
const VertexSize &  vs2 
)
inline

Definition at line 87 of file greedy-plane-segmentation-ex3.cpp.

88 {
89  return vs1.size < vs2.size;
90 }