00001 #include "itkImageFileReader.h"
00002 #include "itkImageFileWriter.h"
00003 #include "itkMeanImageFilter.h"
00004 #include "itkBinaryThresholdImageFilter.h"
00005 #include "itkCovariantVector.h"
00006
00007
00008 #include <iostream>
00009 #include "itkOrganism.h"
00010 #include "Phys_Euler.h"
00011 #include "Ctrl_ScheduleDriven.h"
00012 #include "Beh_TranslateAll.h"
00013 #include "Def_Translation.h"
00014 #include "Beh_UniformScale.h"
00015 #include "Def_UniformScale.h"
00016 #include "Sense_Gradient.h"
00017 #include "Geom_MeshSpatialObject.h"
00018
00019 using namespace mial;
00020 int main(int argc, char ** argv)
00021 {
00022 if( argc < 4 )
00023 {
00024 std::cerr << "Usage: " << std::endl;
00025 std::cerr << argv[0] << " inputImageFile outputImageFile inputEulerScheduleFile inputMesh" << std::endl;
00026 return EXIT_FAILURE;
00027 }
00028 std::string inputImageFileName = argv[1];
00029 std::string outputImageFileName = argv[2];
00030 std::string topologyInputFileName = argv[4];
00031 std::string scheduleFileName = argv[3];
00032
00033 typedef unsigned char PixelType;
00034 const unsigned int Dimension = 3;
00035 typedef itk::Image< PixelType, Dimension > ImageType;
00036
00037
00038 typedef itk::CovariantVector< float, 3 > GradientPixelType;
00039 typedef itk::Image< GradientPixelType, 3 > GradientImageType;
00040
00041
00042 typedef itk::ImageFileReader< ImageType > ReaderType;
00043 typedef itk::ImageFileWriter< ImageType > WriterType;
00044 ReaderType::Pointer reader = ReaderType::New();
00045 WriterType::Pointer writer = WriterType::New();
00046
00047 reader->SetFileName(inputImageFileName.c_str());
00048 writer->SetFileName(outputImageFileName.c_str());
00049
00050
00051
00052
00053 typedef itk::ItkOrganism <ImageType, ImageType, GradientImageType, float, 3> organismType;
00054 organismType::Pointer testOrg = organismType::New();
00055 std::cout << "Organism created..." << std::endl;
00056
00057
00058 typedef Sense_Gradient<float,ImageType,GradientImageType,3> gradientSensorType;
00059 gradientSensorType::sensorIn::Pointer input = gradientSensorType::sensorIn::New();
00060 gradientSensorType::Pointer gradientSensor = gradientSensorType::New();
00061 input->sigma = 1.0;
00062 reader->Update();
00063 input->imageIn = reader->GetOutput();
00064 gradientSensor->run(input);
00065 gradientSensorType::sensorOut::Pointer output = (gradientSensorType::sensorOut *) (gradientSensor->getOutput()).GetPointer();
00066
00067
00068
00069 typedef Phys_Euler<float,GradientImageType,3> PhysLayerType;
00070 typedef Geom_MeshSpatialObject<float,3> GeometricType;
00071
00072 PhysLayerType::Pointer physLayer = PhysLayerType::New();
00073 GeometricType::Pointer geomLayer = GeometricType::New();
00074
00075 physLayer->setExternalForces((void *) &(output->imageOut));
00076 physLayer->setGeometry(geomLayer);
00077
00078 testOrg->setPhysicsLayer(physLayer);
00079 testOrg->setGeometricLayer(geomLayer);
00080 std::cout << "Physics layer added..." << std::endl;
00081
00082
00083 geomLayer->readTopologyFromFile(topologyInputFileName);
00084 std::cout << "Topology read from '" << topologyInputFileName << "'..." << std::endl;
00085
00086
00087 Ctrl_ScheduleDriven<float, 3>::Pointer cgL = Ctrl_ScheduleDriven<float, 3>::New();
00088 cgL->setSchedule(scheduleFileName);
00089 Beh_TranslateAll<float, 3>::Pointer beh1 = Beh_TranslateAll<float,3>::New();
00090 Beh_UniformScale<float, 3>::Pointer beh2 = Beh_UniformScale<float,3>::New();
00091 Def_Translation<float, 3>::Pointer def1 = Def_Translation<float,3>::New();
00092 Def_UniformScale<float, 3>::Pointer def2 = Def_UniformScale<float,3>::New();
00093 testOrg->setCognitiveLayer(cgL);
00094 testOrg->addBehaviour(beh1);
00095 testOrg->addBehaviour(beh2);
00096 testOrg->addDeformation(def1);
00097 testOrg->addDeformation(def2);
00098
00099
00100 testOrg->SetInput(reader->GetOutput());
00101
00102 writer->SetInput(testOrg->GetOutput());
00103 try
00104 {
00105 std::cout << "Running organism..." << std::endl;
00106 for(int i=0; i<25;i++)
00107 {
00108 testOrg->run();
00109 std::cout << "one run" << std::endl;
00110 }
00111 writer->Update();
00112 std::cout << "Output written to '" << outputImageFileName << "'." << std::endl;
00113 }
00114 catch(itk::ExceptionObject & err)
00115 {
00116 std::cout << "ExceptionObject caught!" << std::endl;
00117 std::cout << err << std::endl;
00118 return -1;
00119 }
00120 return 0;
00121 }