int main( int argc, char** argv ) { std::string inputFilename = examplesPath + "samples/Al.100.vol"; //------------ typedef Z3i::Point Point; QApplication application(argc,argv); Viewer3D<> viewer; viewer.setWindowTitle("simpleViewer"); viewer.show(); //Default image selector = STLVector typedef ImageSelector<Z3i::Domain, unsigned char>::Type Image; Image image = VolReader<Image>::importVol( inputFilename ); Z3i::Domain domain = image.domain(); Image imageSeeds ( domain); for ( Image::Iterator it = imageSeeds.begin(), itend = imageSeeds.end();it != itend; ++it) (*it)=1; Z3i::Point p0(10,10,10); //imageSeeds.setValue(p0, 0 ); randomSeeds(imageSeeds, 70, 0); //Distance transformation computation typedef SimpleThresholdForegroundPredicate<Image> Predicate; Predicate aPredicate(imageSeeds,0); typedef DistanceTransformation<Z3i::Space,Predicate, Z3i::L2Metric> DTL2; DTL2 dtL2(&domain, &aPredicate, &Z3i::l2Metric); unsigned int min = 0; unsigned int max = 0; for(DTL2::ConstRange::ConstIterator it = dtL2.constRange().begin(), itend=dtL2.constRange().end(); it!=itend; ++it) { if( (*it) < min ) min=(*it); if( (*it) > max ) max=(*it); } GradientColorMap<long> gradient( 0,30); gradient.addColor(Color::Red); gradient.addColor(Color::Yellow); gradient.addColor(Color::Green); gradient.addColor(Color::Cyan); gradient.addColor(Color::Blue); gradient.addColor(Color::Magenta); gradient.addColor(Color::Red); viewer << SetMode3D( (*(domain.begin())).className(), "Paving" ); for(Z3i::Domain::ConstIterator it = domain.begin(), itend=domain.end(); it!=itend; ++it){ double valDist= dtL2( (*it) ); Color c= gradient(valDist); if(dtL2(*it)<=30 && image(*it)>0){ viewer << CustomColors3D(Color((float)(c.red()), (float)(c.green()), (float)(c.blue(),205)), Color((float)(c.red()), (float)(c.green()), (float)(c.blue()),205)); viewer << *it ; } } viewer<< Viewer3D<>::updateDisplay; return application.exec(); }
int main( int narg, char **argv ) { trace.beginBlock("Identifying the domain."); Z3i::Domain domain = scene_dimensions( argv[1] ) ; if ( domain.lowerBound() == domain.upperBound() ) { trace.error()<<"Invalid domain ("<<__FILE__<<")"<<std::endl; return -1 ; } trace.endBlock() ; trace.beginBlock("Reading slices."); Z3i::DigitalSet set3d( domain ) ; SetPredicate<Z3i::DigitalSet> set3dPredicate( set3d ) ; for ( uint depth = 0 ; depth < domain.upperBound().at(2) ; depth++ ) process_slice( argv[1], depth, set3d ) ; trace.endBlock() ; if ( 0) { try { Gray3DImage aImage( domain ); for ( Z3i::Domain::ConstIterator pt = domain.begin() ; pt != domain.end() ; pt++ ) aImage.setValue( (*pt), 255 ) ; boost::filesystem::path pathvolname = argv[1] ; pathvolname /= "obj.vol" ; if ( ! DGtal::VolWriter< Gray3DImage, GrayColorMap >::exportVol ( pathvolname.string(), aImage, 0, 255 ) ) { trace.error() <<"Can not export data (generated 3D object)"<<std::endl; return -4 ; } else { trace.info()<<"export data to "<<pathvolname.string()<<std::endl; } pathvolname = argv[1] ; pathvolname /= "obj.pgm3d" ; if ( ! PNMWriter<Gray3DImage, GrayColorMap >::exportPGM3D( pathvolname.string(), aImage, 0, 255 ) ) { trace.error() <<"Can not export data (generated 3D object)"<<std::endl; return -4 ; } else { trace.info()<<"export data to "<<pathvolname.string()<<std::endl; } } catch ( std::exception &e ) { trace.error() <<"Can not export data (generated 3D object) "<<e.what()<<std::endl; return -8 ; } } trace.beginBlock( "Decompose the object into connected components." ); { DGtal::Z3i::Object6_18 scene( DGtal::Z3i::dt6_18, set3d ) ; std::vector< Z3i::Object6_18 > v_obj ; back_insert_iterator< std::vector< Z3i::Object6_18 > > it( v_obj ) ; scene.writeComponents( it ) ; boost::filesystem::path scenefilename = argv[1] ; scenefilename /= "scene.pgm3d" ; IOPgm3d::write( v_obj, scenefilename.string().c_str() ) ; } trace.endBlock( ); return -64; trace.beginBlock( "Construct the Khalimsky space from the image domain." ); Z3i::KSpace ks; bool space_ok = ks.init( domain.lowerBound(), domain.upperBound(), true ); if (!space_ok) { trace.error() << "Error in the Khamisky space construction."<<std::endl; return -2; } trace.endBlock(); typedef SurfelAdjacency<Z3i::KSpace::dimension> MySurfelAdjacency; MySurfelAdjacency surfAdj( true ); // interior in all directions. trace.beginBlock( "Extracting boundary by tracking from an initial bel." ); Z3i::KSpace::SCellSet boundary; Z3i::SCell bel = Surfaces<Z3i::KSpace>::findABel( ks, set3dPredicate, 100000 ); Surfaces<Z3i::KSpace>::trackBoundary( boundary, ks, surfAdj, set3dPredicate, bel ); trace.endBlock(); trace.beginBlock( "Displaying surface in Viewer3D." ); QApplication application(narg,argv); Viewer3D viewer; viewer.show(); viewer << SetMode3D( boundary.begin()->className(), "") ; //CustomColors3D(Color(250, 0, 0 ), Color( 128, 128, 128 ) ); unsigned long nbSurfels = 0; for ( Z3i::KSpace::SCellSet::const_iterator it = boundary.begin(), it_end = boundary.end(); it != it_end; ++it, ++nbSurfels ) viewer << ks.uCell( Z3i::Point( (*it).myCoordinates.at(0), (*it).myCoordinates.at(1), (*it).myCoordinates.at(2) ) ) ; /** for ( Z3i::KSpace::SCellSet::const_iterator it = boundary.begin(), it_end = boundary.end(); it != it_end; ++it, ++nbSurfels ) viewer << (*it) ; */ trace.info() << *boundary.begin()<<std::endl; viewer << Viewer3D::updateDisplay; trace.info() << "nb surfels = " << nbSurfels << std::endl; trace.endBlock(); return application.exec(); }