void displayProj2d( Viewer3D<space, kspace> & viewer, const KSpace & ks, const StandardDSS6Computer & dss3d, const DGtal::Color & color2d ) { typedef typename StandardDSS6Computer::ArithmeticalDSSComputer2d ArithmeticalDSSComputer2d; typedef typename ArithmeticalDSSComputer2d::ConstIterator ConstIterator2d; typedef typename ArithmeticalDSSComputer2d::Point Point2d; typedef typename KSpace::Cell Cell; typedef typename KSpace::Point Point3d; Point3d b = ks.lowerBound(); for ( DGtal::Dimension i = 0; i < 3; ++i ) { const ArithmeticalDSSComputer2d & dss2d = dss3d.arithmeticalDSS2d( i ); for ( ConstIterator2d itP = dss2d.begin(), itPEnd = dss2d.end(); itP != itPEnd; ++itP ) { Point2d p = *itP; Point3d q; switch (i) { case 0: q = Point3d( 2*b[ i ] , 2*p[ 0 ]+1, 2*p[ 1 ]+1 ); break; case 1: q = Point3d( 2*p[ 0 ]+1, 2*b[ i ] , 2*p[ 1 ]+1 ); break; case 2: q = Point3d( 2*p[ 0 ]+1, 2*p[ 1 ]+1, 2*b[ i ] ); break; } Cell c = ks.uCell( q ); viewer << CustomColors3D( color2d, color2d ) << c; } } }
void displayDSS2d( Viewer3D<space, kspace> & viewer, const KSpace & ks, const StandardDSS6Computer & dss3d, const DGtal::Color & color2d ) { typedef typename StandardDSS6Computer::ConstIterator ConstIterator3d; typedef typename StandardDSS6Computer::ArithmeticalDSSComputer2d ArithmeticalDSSComputer2d; typedef typename ArithmeticalDSSComputer2d::ConstIterator ConstIterator2d; typedef typename ArithmeticalDSSComputer2d::Point Point2d; typedef typename KSpace::Cell Cell; typedef typename KSpace::Point Point3d; typedef DGtal::PointVector<2,double> PointD2d; typedef typename Display3D<>::BallD3D PointD3D; Point3d b = ks.lowerBound(); for ( DGtal::Dimension i = 0; i < 3; ++i ) { const typename ArithmeticalDSSComputer2d::Primitive & dss2d = dss3d.arithmeticalDSS2d( i ).primitive(); // draw 2D bounding boxes for each arithmetical dss 2D. std::vector<PointD2d> pts2d; pts2d.push_back( dss2d.project(dss2d.back(), dss2d.Uf()) ); pts2d.push_back( dss2d.project(dss2d.back(), dss2d.Lf()) ); pts2d.push_back( dss2d.project(dss2d.front(), dss2d.Lf()) ); pts2d.push_back( dss2d.project(dss2d.front(), dss2d.Uf()) ); std::vector<PointD3D> bb; PointD3D p3; for ( unsigned int j = 0; j < pts2d.size(); ++j ) { switch (i) { case 0: p3.center[0] = (double) b[ i ]-0.5; p3.center[1] = pts2d[ j ][ 0 ]; p3.center[2] = pts2d[ j ][ 1 ]; break; case 1: p3.center[0] = pts2d[ j ][ 0 ]; p3.center[1] = (double) b[ i ]-0.5; p3.center[2] = pts2d[ j ][ 1 ]; break; case 2: p3.center[0] = pts2d[ j ][ 0 ]; p3.center[1] = pts2d[ j ][ 1 ]; p3.center[2] = (double) b[ i ]-0.5; break; } bb.push_back( p3 ); } for ( unsigned int j = 0; j < pts2d.size(); ++j ){ viewer.setLineColor(color2d); viewer.addLine( DGtal::Z3i::RealPoint(bb[ j ].center[0], bb[ j ].center[1], bb[ j ].center[2]), DGtal::Z3i::RealPoint(bb[ (j+1)%4 ].center[0], bb[ (j+1)%4 ].center[1], bb[ (j+1)%4 ].center[2]), MS3D_LINESIZE ); } } // for ( DGtal::Dimension i = 0; i < 3; ++i ) }
void chooseEstimator ( const po::variables_map& vm, //< command-line parameters const KSpace& K, //< cellular grid space const ImplicitShape& shape, //< implicit shape "ground truth" const Surface& surface, //< digital surface approximating shape const KernelFunction& chi, //< the kernel function const PointPredicate& ptPred ) //< analysed implicit digital shape as a PointPredicate { using namespace DGtal::functors; string nameEstimator = vm[ "estimator" ].as<string>(); double h = vm["gridstep"].as<double>(); typedef ShapeGeometricFunctors::ShapeNormalVectorFunctor<ImplicitShape> NormalFunctor; typedef TrueDigitalSurfaceLocalEstimator<KSpace, ImplicitShape, NormalFunctor> TrueEstimator; TrueEstimator true_estimator; true_estimator.attach( shape ); true_estimator.setParams( K, NormalFunctor(), 20, 0.1, 0.01 ); true_estimator.init( h, surface.begin(), surface.end() ); if ( nameEstimator == "True" ) { trace.beginBlock( "Chosen estimator is: True." ); typedef TrueDigitalSurfaceLocalEstimator<KSpace, ImplicitShape, NormalFunctor> Estimator; int maxIter = vm["maxiter"].as<int>(); double accuracy = vm["accuracy"].as<double>(); double gamma = vm["gamma"].as<double>(); Estimator estimator; estimator.attach( shape ); estimator.setParams( K, NormalFunctor(), maxIter, accuracy, gamma ); estimator.init( h, surface.begin(), surface.end() ); trace.endBlock(); computeEstimation( vm, K, shape, surface, estimator ); } else if ( nameEstimator == "VCM" ) { trace.beginBlock( "Chosen estimator is: VCM." ); typedef typename KSpace::Space Space; typedef typename Surface::DigitalSurfaceContainer SurfaceContainer; typedef ExactPredicateLpSeparableMetric<Space,2> Metric; typedef VoronoiCovarianceMeasureOnDigitalSurface<SurfaceContainer,Metric, KernelFunction> VCMOnSurface; typedef VCMNormalVectorFunctor<VCMOnSurface> NormalFunctor; typedef VCMDigitalSurfaceLocalEstimator<SurfaceContainer,Metric, KernelFunction, NormalFunctor> VCMNormalEstimator; int embedding = vm["embedding"].as<int>(); Surfel2PointEmbedding embType = embedding == 0 ? Pointels : embedding == 1 ? InnerSpel : OuterSpel; double R = vm["R-radius"].as<double>(); double r = vm["r-radius"].as<double>(); double t = vm["trivial-radius"].as<double>(); double alpha = vm["alpha"].as<double>(); if ( alpha != 0.0 ) R *= pow( h, alpha-1.0 ); if ( alpha != 0.0 ) r *= pow( h, alpha-1.0 ); trace.info() << "- R=" << R << " r=" << r << " t=" << t << std::endl; VCMNormalEstimator estimator; estimator.attach( surface ); estimator.setParams( embType, R, r, chi, t, Metric(), true ); estimator.init( h, surface.begin(), surface.end() ); trace.endBlock(); computeEstimation( vm, K, shape, surface, estimator ); } else if ( nameEstimator == "II" ) { trace.beginBlock( "Chosen estimator is: II." ); typedef typename KSpace::Space Space; typedef HyperRectDomain<Space> Domain; typedef ImageContainerBySTLVector< Domain, bool> Image; typedef typename Domain::ConstIterator DomainConstIterator; typedef SimpleThresholdForegroundPredicate<Image> ThresholdedImage; typedef IINormalDirectionFunctor<Space> IINormalFunctor; typedef IntegralInvariantCovarianceEstimator<KSpace, ThresholdedImage, IINormalFunctor> IINormalEstimator; double r = vm["r-radius"].as<double>(); double alpha = vm["alpha"].as<double>(); if ( alpha != 0.0 ) r *= pow( h, alpha-1.0 ); trace.info() << " r=" << r << std::endl; trace.beginBlock( "Preparing characteristic set." ); Domain domain( K.lowerBound(), K.upperBound() ); Image image( domain ); for ( DomainConstIterator it = domain.begin(), itE = domain.end(); it != itE; ++it ) { image.setValue( *it, ptPred( *it ) ); } trace.endBlock(); trace.beginBlock( "Initialize II estimator." ); ThresholdedImage thresholdedImage( image, false ); IINormalEstimator ii_estimator( K, thresholdedImage ); ii_estimator.setParams( r ); ii_estimator.init( h, surface.begin(), surface.end() ); trace.endBlock(); trace.endBlock(); computeEstimation( vm, K, shape, surface, ii_estimator ); } else if ( nameEstimator == "Trivial" ) { trace.beginBlock( "Chosen estimator is: Trivial." ); typedef HatFunction<double> Functor; typedef typename KSpace::Space Space; typedef typename KSpace::Surfel Surfel; typedef typename Surface::DigitalSurfaceContainer SurfaceContainer; typedef ExactPredicateLpSeparableMetric<Space,2> Metric; typedef ElementaryConvolutionNormalVectorEstimator< Surfel, CanonicSCellEmbedder<KSpace> > SurfelFunctor; typedef LocalEstimatorFromSurfelFunctorAdapter< SurfaceContainer, Metric, SurfelFunctor, Functor> NormalEstimator; double t = vm["trivial-radius"].as<double>(); Functor fct( 1.0, t ); CanonicSCellEmbedder<KSpace> canonic_embedder( K ); SurfelFunctor surfelFct( canonic_embedder, 1.0 ); NormalEstimator estimator; estimator.attach( surface ); estimator.setParams( Metric(), surfelFct, fct, t ); estimator.init( 1.0, surface.begin(), surface.end() ); trace.endBlock(); computeEstimation( vm, K, shape, surface, estimator ); } }