[Insight-users] Problem with ITK and GDCM in the same program

edoardo.belletti at alice.it edoardo.belletti at alice.it
Wed May 12 15:42:23 EDT 2010


Hi everyone, I have a problem: I have created this programthat use both ITK and GDCM libraries:
// GDCM Libraries
#include "gdcmReader.h"
(...)
// ITK Libraries
#include "itkImage.h"
(...)
// Standard Libraries
#include <string>
(...)
// Type definitions
const unsigned int Dimension = 2;
typedef unsigned char PixelType;
typedef itk::Image< PixelType, Dimension > ImageType;
typedef itk::ImageFileReader< ImageType > ReaderType;
typedef itk::ImageFileWriter< ImageType > WriterType;
typedef itk::GDCMImageIO ImageIOType;
typedef itk::Image< float, Dimension > OutputImageType;
typedef itk::SobelEdgeDetectionImageFilter< OutputImageType, OutputImageType > SobelFilterType;
typedef itk::RegionOfInterestImageFilter< ImageType, ImageType > RegionFilterType;
typedef itk::CastImageFilter< ImageType, OutputImageType> CastToRealFilterType;
typedef itk::RescaleIntensityImageFilter< OutputImageType, ImageType > RescaleFilter;   
// Functions
template <typename TPrinter> bool Region(const std::string & filename, unsigned int* X_min, unsigned int* Y_min, unsigned int* X_max, unsigned int* Y_max );
int main (int argc, char *argv[])
{
	if( argc < 2 )
	{
		std::cerr << "Usage: " << std::endl;
		std::cerr << argv[0] << " inputImageFile  outputImageFile " << std::endl;
		return EXIT_FAILURE;
	}
  	std::string filename = argv[1];

//	ImageIOType::Pointer dicomIO = ImageIOType::New();
//	ReaderType::Pointer reader = ReaderType::New();
//	reader->SetFileName( argv[1] );
//	reader->SetImageIO( dicomIO );
//	reader->Update();

  	unsigned int x_min = 1;
	unsigned int y_min = 1;
	unsigned int x_max = 1;
	unsigned int y_max = 1;
  	if( Region<gdcm::Printer>( filename, &x_min, &y_min, &x_max, &y_max ) )
  	{
		std::cout << "x_min = " << x_min << std::endl;	
		std::cout << "y_min = " << y_min << std::endl;
		std::cout << "x_max = " << x_max << std::endl;
		std::cout << "y_max = " << y_max << std::endl;
  	}
  	else
  	{
		std::cout << "no\n";
  	}

  	//Return
  	return EXIT_SUCCESS;
}

template <typename TPrinter> bool Region(const std::string & filename, unsigned int* X_min, unsigned int* Y_min, unsigned int* X_max, unsigned int* Y_max )
{
  	gdcm::Reader reader;
  	reader.SetFileName( filename.c_str() );
  	bool success = reader.Read();
  	if( !success )
    {
    	std::cerr << "Failed to read: " << filename << std::endl;
    	return false;
    }

// Replace the stream buffer used by 'std::cout' with a suitable other 
// stream buffer.
// Direct 'std::cout' to not print to the screen but also write to a file.
  	std::streambuf* cout_sbuf = std::cout.rdbuf(); // save original sbuf
  	std::ofstream   fout( "header_dicom.txt" );
  	std::cout.rdbuf( fout.rdbuf() ); // redirect 'cout' to a 'fout'   

  	TPrinter printer;
  	printer.SetFile ( reader.GetFile() );
  	printer.Print( std::cout );

// Restoring the original stream buffer is necessary because the stream
// buffer to which 'std::cout' was redirected is destroyed at the end of
// 'main()'.
  	std::cout.rdbuf( cout_sbuf ); // restore the original stream buffer

  	std::string str, str_prec;
  	std::fstream f_input;
  	bool findX0 = false; 
  	bool findX1 = false; 
  	bool findY0 = false;
  	bool findY1 = false;
  	f_input.open ( "header_dicom.txt", std::ios::in );
  	if ( f_input.fail() )
  	{
		std::cerr << "ERROR: can not open file!\n";
		remove ( "header_dicom.txt" );
		return false;
  	}

  	while ( f_input >> str )
  	{
		if ( str.compare("(0018,6018)") == 0 )
		{
			do {
				str_prec = str;
				f_input >> str;
			} while ( str.compare("#") != 0 );
			*X_min = atoi(str_prec.c_str());
			findX0 = true;
			//std::cout << *X_min << std::endl;
		}
		if ( str.compare("(0018,601a)") == 0 )
		{ 
			do {
				str_prec = str;
				f_input >> str;
			} while ( str.compare("#") != 0 );
			*Y_min = atoi(str_prec.c_str());
			findY0 = true;
			//std::cout << *Y_min << std::endl;
		}
		if ( str.compare("(0018,601c)") == 0 )
		{
			do {
				str_prec = str;
				f_input >> str;
			} while ( str.compare("#") != 0 );
			*X_max = atoi(str_prec.c_str());
			findX1 = true;
			//std::cout << *X_max << std::endl;
		}
		if ( str.compare("(0018,601e)") == 0 )
		{
			do {
				str_prec = str;
				f_input >> str;
			} while ( str.compare("#") != 0 );
			*Y_max = atoi(str_prec.c_str());
			findY1 = true;
			//std::cout << *Y_max << std::endl;
		}

		//std::cout << str << std::endl;
	}

	if ( ( !findX0 ) || ( !findY0 ) || ( !findX1 ) || ( !findY1 ) )
	{
		remove ( "header_dicom.txt" );
		return false;
	}
	f_input.close();
	  
	remove ( "header_dicom.txt" );
	return true;
}

when i run it without the comments on this lines (49-53):
	ImageIOType::Pointer dicomIO = ImageIOType::New();
	ReaderType::Pointer reader = ReaderType::New();
	reader->SetFileName( argv[1] );
	reader->SetImageIO( dicomIO );
	reader->Update();

the output is:

edoardo at edoardo-laptop:~/ITK/Tesi/01_Autocrop/crop/bin$ make
Scanning dependencies of target cropping
[100%] Building CXX object CMakeFiles/cropping.dir/cropping.cxx.o
Linking CXX executable cropping
/usr/local/lib/InsightToolkit/libitkgdcm.a(gdcmGlobal.o): In function `gdcm::Global::Global()':
gdcmGlobal.cxx:(.text+0x0): multiple definition of `gdcm::Global::Global()'
/usr/local/lib/libgdcmDICT.a(gdcmGlobal.cxx.o):gdcmGlobal.cxx:(.text+0x0): first defined here
/usr/local/lib/InsightToolkit/libitkgdcm.a(gdcmGlobal.o): In function `gdcm::Global::Global()':
gdcmGlobal.cxx:(.text+0x300): multiple definition of `gdcm::Global::Global()'
/usr/local/lib/libgdcmDICT.a(gdcmGlobal.cxx.o):gdcmGlobal.cxx:(.text+0x80): first defined here
/usr/local/lib/InsightToolkit/libitkgdcm.a(gdcmGlobal.o): In function `gdcm::Global::~Global()':
gdcmGlobal.cxx:(.text+0x600): multiple definition of `gdcm::Global::~Global()'
/usr/local/lib/libgdcmDICT.a(gdcmGlobal.cxx.o):gdcmGlobal.cxx:(.text+0x100): first defined here
/usr/local/lib/InsightToolkit/libitkgdcm.a(gdcmGlobal.o): In function `gdcm::Global::~Global()':
gdcmGlobal.cxx:(.text+0x694): multiple definition of `gdcm::Global::~Global()'
/usr/local/lib/libgdcmDICT.a(gdcmGlobal.cxx.o):gdcmGlobal.cxx:(.text+0x14c): first defined here
collect2: ld returned 1 exit status
make[2]: *** [cropping] Errore 1
make[1]: *** [CMakeFiles/cropping.dir/all] Errore 2
make: *** [all] Errore 2

instead of if these lines are commented I don't have any error; but my problem is that I want to use also ITK libraries into my project.

my CMakeList.txt:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

PROJECT(ImageIO)

# Find ITK.
FIND_PACKAGE(ITK)
IF(NOT ITK_DIR)
  MESSAGE(FATAL_ERROR "Please set ITK_DIR.")
ENDIF(NOT ITK_DIR) 
INCLUDE(${ITK_USE_FILE})

# Find GDCM
FIND_PACKAGE(GDCM)
  IF(GDCM_FOUND)
    INCLUDE(${GDCM_USE_FILE})
    IF( "${GDCM_MAJOR_VERSION}" LESS 2.0 )
      SET(MITK_GDCM_LIBRARIES gdcm)
    ELSE( "${GDCM_MAJOR_VERSION}" LESS 2.0 )
      SET(MITK_GDCM_LIBRARIES gdcmMSFF)
    ENDIF( "${GDCM_MAJOR_VERSION}" LESS 2.0 )
  ELSE(GDCM_FOUND)
    MESSAGE(FATAL_ERROR "Must set GDCM_DIR for MITK_USE_SYSTEM_GDCM.")
  ENDIF(GDCM_FOUND)

ADD_EXECUTABLE(cropping cropping.cxx )
TARGET_LINK_LIBRARIES(cropping gdcmMSFF ITKCommon ITKIO)

and my ITK_USE_SYSTEM_GDCM is ON 
and my GDCM_USE_ITK is OFF

Please I need help, I very don't know which is the problem.

Thank you very much for your interest
Best regards 
Edoardo







-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20100512/cd753a5a/attachment.htm>


More information about the Insight-users mailing list