commit 53a50c61af7398beccda77ceb584baaf9b2856f4 Author: ccolin Date: Sun Jan 9 15:37:29 2022 +0100 initial commit diff --git a/Build/.qglviewer.xml b/Build/.qglviewer.xml new file mode 100644 index 0000000..3228740 --- /dev/null +++ b/Build/.qglviewer.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e4dc653 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 3.15) + +project(startCode) + +set(as_subproject QGLVIEWER) +macro(find_package) + if(NOT "${ARGV0}" IN_LIST as_subproject) + _find_package(${ARGV}) + else() + set(${ARGV0}_FOUND true) + endif() +endmacro() + +add_subdirectory(external/libQGLViewer) +add_subdirectory(external/DGtal) + +# Make sure the compiler can find include files. +include_directories(${PROJECT_SOURCE_DIR}/Volumes/) +include_directories(${PROJECT_BINARY_DIR}/Volumes/) + +# ConfigExamples.h instanciation. +configure_file(${PROJECT_SOURCE_DIR}/ConfigExamples.h.in + ${PROJECT_SOURCE_DIR}/ConfigExamples.h) + +find_package(Qt5 REQUIRED COMPONENTS Widgets) +add_executable(startCode startCode.cpp) +target_link_libraries(startCode PRIVATE libQGLViewer DGtal Qt5::Widgets) +target_compile_definitions(startCode PRIVATE + WITH_QT5 true + WITH_VISU3D_QGLVIEWER true) diff --git a/ConfigExamples.h b/ConfigExamples.h new file mode 100644 index 0000000..cd64a92 --- /dev/null +++ b/ConfigExamples.h @@ -0,0 +1,13 @@ +/** +* @file ConfigExamples.h +* @author David COEURJOLLY > +* @date 29 Jul. 2010 +* @brief Configuration header for example files. +* +**/ + +#include + +///Path to the DGtal test suite. +const std::string examplesPath= "/home/papush/m2b/géo_dis/tp10/startCode_1.10/Volumes/"; + diff --git a/ConfigExamples.h.in b/ConfigExamples.h.in new file mode 100644 index 0000000..c9852eb --- /dev/null +++ b/ConfigExamples.h.in @@ -0,0 +1,13 @@ +/** +* @file ConfigExamples.h +* @author David COEURJOLLY > +* @date 29 Jul. 2010 +* @brief Configuration header for example files. +* +**/ + +#include + +///Path to the DGtal test suite. +const std::string examplesPath= "@PROJECT_SOURCE_DIR@/Volumes/"; + diff --git a/Volumes/Al.100.vol b/Volumes/Al.100.vol new file mode 100644 index 0000000..18eb2cc Binary files /dev/null and b/Volumes/Al.100.vol differ diff --git a/Volumes/cat10.vol b/Volumes/cat10.vol new file mode 100644 index 0000000..c1ac8cb --- /dev/null +++ b/Volumes/cat10.vol @@ -0,0 +1,16 @@ +Center-X: 0 +Center-Y: 0 +Center-Z: 0 +X: 40 +Y: 40 +Z: 40 +Voxel-Size: 1 +Alpha-Color: 0 +Voxel-Endian: 0 +Int-Endian: 0123 +Version: 3 +. +xQn0DQ/)S"P`{O-”BDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD,m2)(Y t) ̞{/ py;ޱ=I&6ydf02)X^(C+O^iO߱4}q4v +*v{ +{a + $ + CACHE PATH "") +# # Can't use find_library as the library isn't there at config time +# find_library(QGLVIEWER_LIBRARIES +# NAMES qglviewer-qt4 qglviewer QGLViewer QGLViewer2 QGLViewer-qt5 +# PATHS ${SOURCE_DIR} +# PATH_SUFFIXES QGLViewer QGLViewer/release) +set(QGLVIEWER_LIBRARIES + $ + $ + CACHE FILEPATH "") + +add_library(libQGLViewer INTERFACE) +target_link_libraries(libQGLViewer INTERFACE ${QGLVIEWER_LIBRARIES}) +add_dependencies(libQGLViewer libQGLViewer_ep-build) +target_include_directories(libQGLViewer INTERFACE ${QGLVIEWER_INCLUDE_DIR}) diff --git a/startCode.cpp b/startCode.cpp new file mode 100644 index 0000000..33c94f9 --- /dev/null +++ b/startCode.cpp @@ -0,0 +1,251 @@ +#include +#include +#include +#include +#include +#include "ConfigExamples.h" + +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +/////////////////////////////////////////////////////////////////////////////// + +using namespace std; +using namespace DGtal; + + + +struct hueFct{ + inline + unsigned int operator() (unsigned int aVal) const + { + HueShadeColorMap hueShade(0,255); + Color col = hueShade((unsigned int)aVal); + return (((unsigned int) col.red()) << 16)| (((unsigned int) col.green()) << 8)|((unsigned int) col.blue()); + } +}; + +// Définition du type de viewer à utiliser. +typedef Viewer3D<> ViewerType ; +// Définition du type de conteneur à utiliser pour l'image du premier exercice. +typedef ImageContainerBySTLVector Image3D; +// Définition du type de conteneur à utiliser pour l'image de la transformée en distance. +typedef ImageSelector::Type Image; + +// Parcours et traitement d'un volume. +void imageSandbox(ViewerType& viewer, std::string filename); +// Tranformée en distance. +void transformeeEnDistance(ViewerType& viewer, std::string filename); + +// Méthode pour générer des voxels de manière aléatoire. +template +void randomSeeds(Image &image, const unsigned int nb, const int value); + +/////////////////////////////////////////////////////////////////////////////// + +int main( int argc, char** argv ) +{ + QApplication application(argc,argv); + ViewerType viewer; + + // Appel aux méthodes des exercices. + if (argc > 2) + { + std::stringstream ssAlgo; + ssAlgo << std::string(argv[1]); + + std::stringstream ssFile; + ssFile << std::string(argv[2]); + if (ssAlgo.str() == "Sandbox") + imageSandbox(viewer, ssFile.str()); + else if (ssAlgo.str() == "DT") + transformeeEnDistance(viewer, ssFile.str()); + } + else + { + std::cout << "Les paramètres n'a pas été fourni." << std::endl; + std::cout << "startCode " << std::endl; + return 0; + } + + return application.exec(); +} + + +/** + * Cette fonction vous permettra de commencer à pratiquer avec le chargement d'objets + * volumiques. Les parcourir, retrouver les valeurs affectées à chaque voxel et les + * les modifier. + * \param Visualisateur à utiliser. + * \param Nom du fichier. + * + */ +void imageSandbox(ViewerType& viewer, std::string filename) +{ + // Lance le visusalisateur. + viewer.show(); + + //Chargement d'une image dans une structure de données ImageContainerBySTLVector. + std::string inputFilename = examplesPath + "/" + filename; + Image3D image = GenericReader::import(inputFilename); + + // Obtention du domaine (taille) de l'image chargée. + Z3i::Domain initialDomain = image.domain(); + + // Définition du gradient des couleurs. + GradientColorMap 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); + + float min = 0.0; + float max = 0.0; + + for(Z3i::Domain::ConstIterator it= image.domain().begin(), + itend = image.domain().end(); it != itend; ++it) + { + if (image(*it) > 0) + viewer << *it; + } + + viewer << SetMode3D(image.className(), "BoundingBox"); + viewer << ViewerType::updateDisplay; + +} + +/** + * Fonction de la transformée en distance à partir de quelques points germes. + * La distance est calculée à partir de chaque point. Donc, la distance dans un + * voxel est la distance minimale à tous les points germes. + * \param le visualisateur à utiliser. + * \param Nom du fichier. + * + */ +void transformeeEnDistance(ViewerType& viewer, std::string filename) +{ + // Affichage de la visualisation. + viewer.show(); + // Nombre du fichier à charger. + std::string inputFilename = examplesPath + "/" + filename; + + // Création du type d'image. + //Default image selector = STLVector + typedef ImageSelector::Type Image; + + //Chargement du fichier image dans la structure. + Image image = VolReader::importVol( inputFilename ); + // Obtention du domaine (taille) de l'image. + Z3i::Domain domain = image.domain(); + + Image imageSeeds ( domain); + for ( Image::Iterator it = imageSeeds.begin(), itend = imageSeeds.end();it != itend; ++it) + (*it)=1; + //imageSeeds.setValue(p0, 0 ); + randomSeeds(imageSeeds, 70, 0); + + + typedef functors::SimpleThresholdForegroundPredicate Predicate; + Predicate aPredicate(imageSeeds,0); + + // Création de type et de l'objet pour appliquer la transformée. + typedef DistanceTransformation DTL2; + DTL2 dtL2(&domain, &aPredicate, &Z3i::l2Metric); + + // Detection des distances minimales et maximales. + 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); + } + + //Spécification des gradients de couleur pour la visualisation. + GradientColorMap 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); + + // Affectation du mode de visualisation 3D. + viewer << SetMode3D( (*(domain.begin())).className(), "Paving" ); + + // Parcours de tous les voxels de l'image avec un iterateur sur le domaine. + for(Z3i::Domain::ConstIterator it = domain.begin(), itend=domain.end(); + it!=itend; + ++it) + { + + // Calcul de la transformée en distance pour le voxel courant. + double valDist= dtL2( (*it) ); + + // Calcul du gradient de couleur pour cette distance. + Color c= gradient(valDist); + viewer << CustomColors3D(Color((float)(c.red()), + (float)(c.green()), + (float)(c.blue(),205)), + Color((float)(c.red()), + (float)(c.green()), + (float)(c.blue()),205)); + // Le viewer reçoit le prochain voxel pour visualisation. + if (image(*it) > 0) + viewer << *it ; + } + + //viewer << ClippingPlane(0,1,0, -40) << Viewer3D<>::updateDisplay; + // Mise à jour du visualisateur après le parcours de tous le voxels. + viewer<< Viewer3D<>::updateDisplay; +} + + +/** + * Cette fonction genère un ensemble de points afin de les placer + * dans le volume comme les germes de la transformée en distance. + * \param image. + * \param nombre de germes. + * \param value à affecter comme seuil. + * + */ +template + void randomSeeds(Image &image, const unsigned int nb, const int value) + { + typename Image::Point p, low = image.domain().lowerBound(); + typename Image::Vector ext; + srand ( time(NULL) ); + + ext = image.extent(); + + for (unsigned int k = 0 ; k < nb; k++) + { + for (unsigned int dim = 0; dim < Image::dimension; dim++) + p[dim] = rand() % (ext[dim]) + low[dim]; + + image.setValue(p, value); + } + } +// // +///////////////////////////////////////////////////////////////////////////////