Skip to content
Snippets Groups Projects
Commit 86b14ab7 authored by Kasper Marstal's avatar Kasper Marstal
Browse files

Merge branch 'ELASTIX-1-setup-development-infrastructure' into develop

parents 6426e134 e5185eae
No related branches found
No related tags found
Loading
Showing with 198 additions and 86 deletions
# Visual Studio complains if paths are too long
string( LENGTH "${CMAKE_CURRENT_SOURCE_DIR}" n )
if( n GREATER 50 )
message(
FATAL_ERROR
"ITK source code directory path length is too long (${n} > 50)."
"Please move the ITK source code directory to a directory with a shorter path."
)
endif()
if( MSVC )
string( LENGTH "${CMAKE_CURRENT_SOURCE_DIR}" n )
if( n GREATER 50 )
message(
FATAL_ERROR
"ITK source code directory path length is too long for MSVC (${n} > 50)."
)
endif()
string( LENGTH "${CMAKE_CURRENT_BINARY_DIR}" n )
if( n GREATER 50 )
message(
FATAL_ERROR
"ITK build directory path length is too long for MSVC (${n} > 50)."
)
endif()
string( LENGTH "${CMAKE_CURRENT_BINARY_DIR}" n )
if( n GREATER 50 )
message(
FATAL_ERROR
"ITK build directory path length is too long (${n} > 50)."
"Please set the ITK build directory to a directory with a shorter path."
)
set( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /bigobj" )
set( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /bigobj" )
set( CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /bigobj" )
endif()
cmake_minimum_required( VERSION 2.8 )
# Explicitly add INCREMENTAL linking option to command lines.
# http://www.cmake.org/pipermail/cmake/2010-February/035174.html
set( MSVC_INCREMENTAL_DEFAULT ON )
# ---------------------------------------------------------------------
project( Elastix )
# Include SuperElastix CMake scripts
list( APPEND CMAKE_MODULE_PATH
"${CMAKE_CURRENT_SOURCE_DIR}/CMake"
list( APPEND CMAKE_MODULE_PATH
"${CMAKE_CURRENT_SOURCE_DIR}/CMake"
)
if( CMAKE_HOST_WIN32 )
if( ${CMAKE_CXX_COMPILER_ID} STREQUAL "MSVC" )
include( elxWinConfig.cmake )
endif()
#---------------------------------------------------------------------
project( Elastix )
#---------------------------------------------------------------------
# ---------------------------------------------------------------------
# ITK
find_package( ITK REQUIRED )
set( ITK_NO_IO_FACTORY_REGISTER_MANAGER 1 )
include( ${ITK_USE_FILE} )
include( "${CMAKE_CURRENT_SOURCE_DIR}/CMake/elxITKRequiredModules.cmake" )
#---------------------------------------------------------------------
# ---------------------------------------------------------------------
# Build Elastix
#---------------------------------------------------------------------
# Testing
set( ELASTIX_COMMON_INCLUDE_DIRECTORIES
${CMAKE_SOURCE_DIR}/Modules/Core/Common/include
)
# Build tests by default
option( ELASTIX_BUILD_TESTING "Enable building tests." ON )
set( ELASTIX_CORE_INCLUDE_DIRECTORIES
${CMAKE_SOURCE_DIR}/Modules/Core/Blueprints/include
)
set( ELASTIX_INCLUDE_DIRECTORIES
${ELASTIX_COMMON_INCLUDE_DIRECTORIES}
${ELASTIX_CORE_INCLUDE_DIRECTORIES}
)
include_directories( ${ELASTIX_INCLUDE_DIRECTORIES} )
add_subdirectory( Modules )
# ExternalData module requires newer CMake versions
# ---------------------------------------------------------------------
# Testing
# Testing requires CMake version 2.8.11 to download test data
if( CMAKE_VERSION VERSION_LESS 2.8.11 )
set( ELASTIX_BUILD_TESTING OFF FORCE )
message( STATUS "ELASTIX_BUILD_TESTING was set to OFF because CMake version is less than 2.8.11")
set( ELASTIX_BUILD_TESTING_DEFAULT OFF )
message( STATUS "ELASTIX_BUILD_TESTING is set to OFF by default because CMake version is less than 2.8.11" )
else()
set( ELASTIX BUILD_TESTING_DEFAULT ON )
endif()
option( ELASTIX_BUILD_TESTING "Enable building tests." ${ELASTIX_BUILD_TESTING_DEFAULT} )
if( ELASTIX_BUILD_TESTING )
enable_testing()
add_subdirectory( Testing )
endif()
#---------------------------------------------------------------------
# ---------------------------------------------------------------------
# Build Documentation
mark_as_advanced( ELASTIX_BUILD_DOXYGEN )
......
add_subdirectory(
Core
)
\ No newline at end of file
add_subdirectory(
Common
Blueprints
)
\ No newline at end of file
include_directories( include )
\ No newline at end of file
#ifndef __elxMacro_h
#define __elxMacro_h
/**
* Register class with the object factory and provide
* associated RTTI (Run-Time Type Information)
*/
#define elxNewMacro( className, superClassName ) \
typedef className Self; \
typedef itk::SmartPointer< Self > Pointer; \
typedef itk::SmartPointer< const Self > ConstPointer; \
itkNewMacro( Self ); \
itkTypeMacro( Self, superClassName ); \
#endif // __elxMacro_h
\ No newline at end of file
......@@ -30,7 +30,7 @@ endforeach()
ExternalData_Add_Target( ElastixData )
# ---------------------------------------------------------------------
# Setup GoogleTest
# Add GoogleTest
find_package( Git )
if( NOT EXISTS "${CMAKE_SOURCE_DIR}/Testing/GoogleTest/.git" AND GIT_EXECUTABLE )
......@@ -70,7 +70,6 @@ add_subdirectory( Unit )
# Benchmarks
option( ELASTIX_BUILD_BENCHMARKING "Enable building benchmarks." OFF )
if( ${ELASTIX_BUILD_BENCHMARKING} )
add_subdirectory( Benchmark )
endif()
......
......@@ -8,24 +8,23 @@ mark_as_advanced( ELASTIX_DASHBOARD_BINARY_DIR )
set( ELASTIX_DASHBOARD_BINARY_DIR "${CMAKE_BINARY_DIR}/Testing/Dashboard" )
mark_as_advanced( ELASTIX_DASHBOARD_LOGSTASH_CERTIFICATE )
set( ELASTIX_DASHBOARD_LOGSTASH_CERTIFICATE "elxLogstashForwarder.crt" )
set( ELASTIX_DASHBOARD_LOGSTASH_CERTIFICATE "elxLogstash.crt" )
mark_as_advanced( ELASTIX_DASHBOARD_LOGSTASH_RSA_PRIVATE_KEY )
set( ELASTIX_DASHBOARD_LOGSTASH_RSA_PRIVATE_KEY "elxLogstashForwarder.key" )
set( ELASTIX_DASHBOARD_LOGSTASH_RSA_PRIVATE_KEY "elxLogstash.key" )
mark_as_advanced( ELASTIX_DASHBOARD_VOLUME )
set( ELASTIX_DASHBOARD_VOLUME "${ELASTIX_DASHBOARD_BINARY_DIR}/Data" )
if( NOT EXISTS "${ELASTIX_DASHBOARD_VOLUME}" )
message( STATUS
"ELASTIX_DASHBOARD_VOLUME points to the default ${CMAKE_BINARY_DIR}/Testing/Dashboard/Data path in your build directory. In production you should point this variable to a safe directory outside the build tree."
"ELASTIX_DASHBOARD_VOLUME points to the folder ${CMAKE_BINARY_DIR}/Testing/Dashboard/Data in your build directory. In production you should point this variable to a safe directory outside the build tree."
)
set( ELASTIX_DASHBOARD_VOLUME "${ELASTIX_DASHBOARD_BINARY_DIR}/Data" )
file( MAKE_DIRECTORY "${ELASTIX_DASHBOARD_VOLUME}" )
endif()
# Test/Benchmark results will be forwarded to this IP. You will probably
# have change this in order to match docker settings on your own machine.
# have change this in order to match docker settings on your own machine.
mark_as_advanced( ELASTIX_DASHBOARD_IP )
set( ELASTIX_DASHBOARD_IP "192.168.59.103" )
......
......@@ -24,19 +24,24 @@ if( NOT EXISTS ${ELASTIX_UNITTEST_OUTPUT_DATA_DIR} )
)
endif()
# ---------------------------------------------------------------------
# Build test data manager
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/elxDataDirectories.h.in
${CMAKE_CURRENT_SOURCE_DIR}/elxDataDirectories.h
${CMAKE_CURRENT_BINARY_DIR}/elxDataDirectories.h
ESCAPE_QUOTES
)
# Build tests
include_directories( ${CMAKE_CURRENT_BINARY_DIR} )
add_library( DataManager elxDataManager.cxx )
list( APPEND TEST_LIBRARIES
DataManager
)
# ---------------------------------------------------------------------
# Build tests
foreach( ElastixUnitTestFilename ${ElastixUnitTestFilenames} )
# Build tests executables
string( REPLACE ".cxx" "" ElastixUnitTest ${ElastixUnitTestFilename} )
......
#ifndef __elxTestDataDirectories_h
#define __elxTestDataDirectories_h
#define ELASTIX_UNITTEST_INPUT_DATA_DIR "/Users/kasper/Development/build/SuperElastix/Elastix-build/Testing/Unit/Data/Input"
#define ELASTIX_UNITTEST_OUTPUT_DATA_DIR "/Users/kasper/Development/build/SuperElastix/Elastix-build/Testing/Unit/Data/Output"
#define ELASTIX_UNITTEST_BASELINE_DATA_DIR "/Users/kasper/Development/build/SuperElastix/Elastix-build/Testing/Unit/Data/Baseline"
#endif // __elxTestDataDirectories_h
#ifndef __elxTestDataDirectories_h
#define __elxTestDataDirectories_h
#ifndef __elxDataDirectories_h
#define __elxDataDirectories_h
#define ELASTIX_UNITTEST_INPUT_DATA_DIR "@ELASTIX_UNITTEST_INPUT_DATA_DIR@"
#define ELASTIX_UNITTEST_OUTPUT_DATA_DIR "@ELASTIX_UNITTEST_OUTPUT_DATA_DIR@"
......
#ifndef __DataManager_cxx
#define __DataManager_cxx
#include <itkSimpleDataObjectDecorator.h>
#include "elxDataManager.h"
std::string
const std::string
DataManager
::GetInput( const std::string filename ) const
::GetInputFullPath( const std::string filename ) const
{
const std::string path = this->GetInputDirectory() + this->GetPathSeparator() + filename;
const std::string path = this->GetInputDirectory() + this->GetFolderSeparator() + filename;
return path;
}
std::string
const std::string
DataManager
::GetOutput( const std::string filename ) const
::GetOutputFullPath( const std::string filename ) const
{
const std::string path = this->GetOutputDirectory() + this->GetPathSeparator() + filename;
const std::string path = this->GetOutputDirectory() + this->GetFolderSeparator() + filename;
return path;
}
std::string
const std::string
DataManager
::GetBaseline( const std::string filename ) const
::GetBaselineFullPath( const std::string filename ) const
{
const std::string path = this->GetBaselineDirectory() + this->GetPathSeparator() + filename;
const std::string path = this->GetBaselineDirectory() + this->GetFolderSeparator() + filename;
return path;
}
......
......@@ -2,16 +2,19 @@
#define __DataManager_h
#include <string>
#include <itkSimpleDataObjectDecorator.h>
#include "itkMacro.h"
#include "itkProcessObject.h"
#include "elxMacro.h"
#include "itkObjectFactory.h"
#include "itkLightObject.h"
#include "elxDataDirectories.h"
class DataManager
class DataManager : public itk::LightObject
{
public:
elxNewMacro( DataManager, itk::LightObject );
DataManager()
{
this->m_InputDirectory = ELASTIX_UNITTEST_INPUT_DATA_DIR;
......@@ -20,16 +23,25 @@ public:
}
std::string GetInputDirectory( void ) const { return this->m_InputDirectory; };
std::string GetOutputDirectory( void ) const { return this->m_InputDirectory; };
std::string GetBaselineDirectory( void ) const { return this->m_InputDirectory; };
std::string GetOutputDirectory( void ) const { return this->m_OutputDirectory; };
std::string GetBaselineDirectory( void ) const { return this->m_BaselineDirectory; };
const std::string GetInputFullPath( const std::string filename ) const;
const std::string GetOutputFullPath( const std::string filename ) const;
const std::string GetBaselineFullPath( const std::string filename ) const;
std::string GetInput( const std::string filename ) const;
std::string GetOutput( const std::string filename ) const;
std::string GetBaseline( const std::string filename ) const;
std::string GetFolderSeparator() const
{
#ifdef _WIN32
return "\\";
#else
return "/";
#endif
}
std::string GetPathSeparator () const
{
#ifdef WIN32
#ifdef _WIN32
return ";";
#else
return ":";
......
......@@ -3,27 +3,84 @@
#include "elxDataManager.h"
#include "gtest/gtest.h"
#include "itkImageRegistrationMethod.h"
#include "itkTranslationTransform.h"
#include "itkMeanSquaresImageToImageMetric.h"
#include "itkLinearInterpolateImageFunction.h"
#include "itkRegularStepGradientDescentOptimizer.h"
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkResampleImageFilter.h"
#include "itkCastImageFilter.h"
class itkRegistration : public ::testing::Test {
public:
virtual void SetUp()
{
DataManager dataManager;
typedef itk::ImageFileReader< ImageType > ReaderType;
// TODO: Loading images here result in segfault
}
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName( dataManager.GetInput( "BrainProtonDensitySliceR10X13Y17.png" ) );
inputImage = reader->GetOutput();
typedef itk::Image< unsigned short, 2 > ImageType;
reader->SetFileName( dataManager.GetBaseline( "BrainProtonDensitySlice.png" ) );
baselineImage = reader->GetOutput();
}
typedef itk::ImageFileReader< ImageType > FixedImageReaderType;
typedef itk::ImageFileReader< ImageType > MovingImageReaderType;
FixedImageReaderType::Pointer fixedImageReader;
MovingImageReaderType::Pointer movingImageReader;
typedef itk::Image< unsigned int, 2 > ImageType;
ImageType::Pointer inputImage;
ImageType::Pointer baselineImage;
};
TEST_F( itkRegistration, Affine2D )
{
ASSERT_TRUE( true );
TEST_F( itkRegistration, ImageRegistration3 )
{
typedef itk::TranslationTransform< double, ImageType::ImageDimension > TransformType;
typedef itk::RegularStepGradientDescentOptimizer OptimizerType;
typedef itk::LinearInterpolateImageFunction< ImageType, double > InterpolatorType;
typedef itk::ImageRegistrationMethod< ImageType, ImageType > RegistrationType;
typedef itk::MeanSquaresImageToImageMetric< ImageType, ImageType > MetricType;
TransformType::Pointer transform = TransformType::New();
OptimizerType::Pointer optimizer = OptimizerType::New();
InterpolatorType::Pointer interpolator = InterpolatorType::New();
RegistrationType::Pointer registration = RegistrationType::New();
MetricType::Pointer metric = MetricType::New();
registration->SetMetric( metric );
registration->SetOptimizer( optimizer );
registration->SetTransform( transform );
registration->SetInterpolator( interpolator );
FixedImageReaderType::Pointer fixedImageReader = FixedImageReaderType::New();
MovingImageReaderType::Pointer movingImageReader = MovingImageReaderType::New();
DataManager::Pointer dataManager = DataManager::New();
fixedImageReader->SetFileName( dataManager->GetInputFullPath( "BrainProtonDensitySlice.png" ) );
movingImageReader->SetFileName( dataManager->GetInputFullPath( "BrainProtonDensitySliceR10X13Y17.png" ) );
registration->SetFixedImage( fixedImageReader->GetOutput() );
registration->SetMovingImage( movingImageReader->GetOutput() );
fixedImageReader->Update(); // This is needed to make the BufferedRegion valid.
registration->SetFixedImageRegion( fixedImageReader->GetOutput()->GetBufferedRegion() );
typedef RegistrationType::ParametersType ParametersType;
ParametersType initialParameters( transform->GetNumberOfParameters() );
initialParameters[0] = 0.0; // Initial offset in mm along X
initialParameters[1] = 0.0; // Initial offset in mm along Y
registration->SetInitialTransformParameters( initialParameters );
optimizer->SetMaximumStepLength( 4.00 );
optimizer->SetMinimumStepLength( 0.01 );
optimizer->SetNumberOfIterations( 200 );
optimizer->MaximizeOff();
EXPECT_NO_THROW( registration->Update() );
RecordProperty( "MetricValue", optimizer->GetValue() );
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment