C:/cmcintos/defOrgs/examples/advanced/defOrg.cxx

00001 #include "itkImageFileReader.h"
00002 #include "itkImageFileWriter.h"
00003 #include "itkMeanImageFilter.h"
00004 #include "itkBinaryThresholdImageFilter.h"
00005 #include "itkCovariantVector.h"
00006 
00007 //#include "itkImage.h"
00008 #include <iostream>
00009 #include "Org_EulerSchedule.h"
00010 #include "Org_LevelSetSchedule.h"
00011 #include "Geometric.h"
00012 
00013 using namespace mial;
00014 int main(int argc, char * argv[] )
00015 {
00016         if( argc < 5 )
00017         {
00018                 std::cerr << "Usage: " << std::endl;
00019                 std::cerr << argv[0] << "  inputImageFile   outputImageFile  inputEulerScheduleFile inputLeveSetScheduleFile inputMesh" << std::endl;
00020                 return EXIT_FAILURE;
00021         }
00022         std::string inputImageFileName = argv[1];
00023         std::string outputImageFileName = argv[2];
00024         std::string eulerScheduleFileName = argv[3];
00025         std::string levelSetScheduleFileName = argv[4];
00026         std::string topologyInputFileName = argv[5];
00027 
00028         typedef unsigned char PixelType;
00029         const unsigned int Dimension = 3;
00030         typedef itk::Image< PixelType, Dimension > ImageType; 
00031 
00032 
00033         typedef itk::CovariantVector< float, 3 >  GradientPixelType;
00034         typedef itk::Image< GradientPixelType, 3 > GradientImageType;
00035 
00036         //Instantiate the reader/writer:
00037         typedef itk::ImageFileReader< ImageType >  ReaderType;
00038         typedef itk::ImageFileWriter< ImageType >  WriterType;
00039         ReaderType::Pointer reader = ReaderType::New();
00040         WriterType::Pointer writer = WriterType::New();
00041 
00042         reader->SetFileName(inputImageFileName.c_str());
00043         //TODO Make sensors pipelinable to avoid forcing update of reader
00044         reader->Update();
00045         writer->SetFileName(outputImageFileName.c_str());
00046 
00047 
00048         // Instantiate the organism:
00049         typedef itk::Org_EulerSchedule<ImageType, Geometric<float,3>::BinaryImageType, GradientImageType, float, 3> eulerOrganismType;
00050         eulerOrganismType::Pointer eulerOrg = eulerOrganismType::New();
00051         std::cout << "Euler organism created..." << std::endl;
00052 
00053         //Add Springs:
00054         eulerOrg->setTopology(topologyInputFileName);
00055         std::cout << "Topology read from '" << topologyInputFileName << "'..." << std::endl;
00056         //eulerOrg->writeNodesToFile(nodeOutputFileName);
00057 
00058         //TEST BEHAVIOR
00059         eulerOrg->setSchedule(eulerScheduleFileName);
00060         
00061         //Pass the output of the reader to the filter, then to the writer.
00062         eulerOrg->SetInput(reader->GetOutput());
00063         
00064 
00065         
00066         eulerOrg->setUp();
00067 
00068         //Deform the euler organism
00069         std::cout << "Running Euler organism..." << std::endl;
00070         for(int i=0; i<25;i++)
00071         {
00072                 eulerOrg->run();
00073                 std::cout << "one run" << std::endl;
00074         }
00075         //Prepare the euler organisms output
00076         eulerOrg->Update();
00077 
00078 
00079         //Use a level set organism to smooth the euler's final shape
00080         typedef itk::Org_LevelSetSchedule<ImageType, ImageType, GradientImageType, float, 3> levelSetOrganismType;
00081         levelSetOrganismType::Pointer levelSetOrg = levelSetOrganismType::New();
00082         levelSetOrg->SetInput(reader->GetOutput());
00083         levelSetOrg->setSchedule(levelSetScheduleFileName);
00084         levelSetOrg->setUp();
00085         //Use the eulerOrg's output to create the shape for the levelSetOrg (creates the mesh and the distance image).
00086         levelSetOrg->setTopologyFromBinaryImage(eulerOrg->GetOutput());
00087         
00088         std::cout << "Running levelSet organism..." << std::endl;
00089         for(int i=0; i<25;i++)
00090         {
00091                 levelSetOrg->run();
00092                 std::cout << "one run" << std::endl;
00093         }
00094 
00095         writer->SetInput(levelSetOrg->GetOutput());
00096         try
00097         {
00098                 writer->Update(); //Will cause an update on the reader, because it depends on it
00099                 std::cout << "Output written to '" << outputImageFileName << "'." << std::endl;
00100         }
00101         catch(itk::ExceptionObject & err)
00102         {
00103                 std::cout << "ExceptionObject caught!" << std::endl;
00104                 std::cout << err << std::endl;
00105                 return -1;
00106         }
00107         return 0;
00108 }

Generated on Wed Jul 19 13:05:14 2006 for IDO by  doxygen 1.4.7