This example shows a greedy segmentation into naive planes of the surface at threshold 0 within volume Al.100.vol.
Colors for each plane are chosen randomly. Surfels in the same plane have the same color.
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <iostream>
#include <boost/program_options/options_description.hpp>
#include <boost/program_options/parsers.hpp>
#include <boost/program_options/variables_map.hpp>
#include <QtGui/qapplication.h>
#include "DGtal/base/Common.h"
#include "DGtal/io/readers/VolReader.h"
#include "DGtal/io/viewers/Viewer3D.h"
#include "DGtal/io/Display3D.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/topology/BreadthFirstVisitor.h"
#include "DGtal/geometry/surfaces/COBANaivePlane.h"
#include "DGtal/helpers/StdDefs.h"
#include "ConfigExamples.h"
using namespace std;
using namespace DGtal;
namespace po = boost::program_options;
using namespace Z3i;
typedef SurfelSet::iterator SurfelSetIterator;
};
int main( int argc, char** argv )
{
po::options_description general_opt("Allowed options are: ");
general_opt.add_options()
("help,h", "display this message")
("input-file,i", po::value<std::string>()->default_value( examplesPath + "samples/Al.100.vol" ), "the volume file (.vol)" )
("threshold,t", po::value<unsigned int>()->default_value(1), "the value that defines the isosurface in the image (an integer between 0 and 255)." )
("width-num,w", po::value<unsigned int>()->default_value(1), "the numerator of the rational width (a non-null integer)." )
("width-den,d", po::value<unsigned int>()->default_value(1), "the denominator of the rational width (a non-null integer)." );
bool parseOK = true;
po::variables_map vm;
try {
po::store(po::parse_command_line(argc, argv, general_opt), vm);
} catch ( const std::exception & ex ) {
parseOK = false;
trace.
info() <<
"Error checking program options: "<< ex.what()<< endl;
}
po::notify(vm);
if ( ! parseOK || vm.count("help") || ( argc <= 1 ) )
{
std::cout << "Usage: " << argv[0]
<< " [-i <fileName.vol>] [-t <threshold>] [-w <num>] [-d <den>]" << std::endl
<< "Segments the surface at given threshold within given volume into digital planes of rational width num/den." << std::endl
<< general_opt << std::endl;
return 0;
}
string inputFilename = vm["input-file"].as<std::string>();
unsigned int threshold = vm["threshold"].as<unsigned int>();
unsigned int widthNum = vm["width-num"].as<unsigned int>();
unsigned int widthDen = vm["width-den"].as<unsigned int>();
QApplication application(argc,argv);
bool ok = ks.init( set3d.domain().lowerBound(),
set3d.domain().upperBound(), true );
if ( ! ok ) std::cerr << "[KSpace.init] Failed." << std::endl;
std::set<Vertex> processedVertices;
std::vector<SegmentedPlane*> segmentedPlanes;
std::map<Vertex,SegmentedPlane*> v2plane;
unsigned int j = 0;
unsigned int nb = digSurf.size();
for ( ConstIterator it = digSurf.begin(), itE= digSurf.end(); it != itE; ++it )
{
Vertex v = *it;
if ( processedVertices.find( v ) != processedVertices.end() )
continue;
segmentedPlanes.push_back( ptrSegment );
axis = ks.sOrthDir( v );
ptrSegment->
plane.
init( axis, 500, widthNum, widthDen );
while ( ! visitor.finished() )
{
v = node.first;
if ( processedVertices.find( v ) == processedVertices.end() )
{
axis = ks.sOrthDir( v );
p = ks.sCoords( ks.sDirectIncident( v, axis ) );
if ( isExtended )
{
processedVertices.insert( v );
v2plane[ v ] = ptrSegment;
visitor.expand();
}
else
visitor.ignore();
}
else
visitor.ignore();
}
ptrSegment->
color =
Color( random() % 256, random() % 256, random() % 256, 255 );
}
viewer.show();
for ( std::map<Vertex,SegmentedPlane*>::const_iterator
it = v2plane.begin(), itE = v2plane.end();
it != itE; ++it )
{
viewer << ks.unsigns( it->first );
}
viewer << Display3D::updateDisplay;
for ( std::vector<SegmentedPlane*>::iterator
it = segmentedPlanes.begin(), itE = segmentedPlanes.end();
it != itE; ++it )
delete *it;
segmentedPlanes.clear();
v2plane.clear();
return application.exec();
}