[Insight-users] R: Fwd: Re: Problem ITK and GDCM in the same script

Lars Friedrich Lars lars-friedrich at gmx.net
Mon Mar 22 04:26:00 EDT 2010


Eduardo,

I just had a look at a small project where I use ITK3.16 and GDCM2.0 together. It is compilable, linkable and runnable on both Linux (GCC) and Windows (MinGW). I will try to explain what I did:

I built ITK3.16 with ITK_USE_SYSTEM_GDCM=ON and GDCM_DIR=<dir-of-externally-built-gdcm2.0>.
In the project's CMakeLists.txt I solely added:
FIND_PACKAGE(ITK)
IF(NOT ITK_DIR)
  MESSAGE(FATAL_ERROR "Please set ITK_DIR.")
ENDIF(NOT ITK_DIR) 
INCLUDE(${ITK_USE_FILE})

For my project this is obviously enough.

In the main source code I use some gdcm-headers:
#include <gdcmReader.h>
#include <gdcmWriter.h>
#include <gdcmFile.h>
#include <gdcmDataSet.h>
#include <gdcmByteValue.h>
GDCM-path is not in the system's PATH-variable.

Maybe you could try to put the pure GDCM-capabilities (the source that needs GDCM) into a sub-library that explicitly links against GDCM2.0. And then link against this sub-library in your main code that also uses ITK.

regards,

lars







-------- Original-Nachricht --------
> Datum: Sun, 21 Mar 2010 19:20:38 +0100
> Von: edoardo.belletti at alice.it
> An: "Lars Friedrich Lars" <lars-friedrich at gmx.net>
> Betreff: R: [Insight-users] Fwd: Re:  Problem ITK and GDCM in the same script

> Hi 
> thank you for the interest!
> I think that my variable ITK_USE_SYSTEM_GDCM is set to ON because I have
> rebuild ccmake from the directory of itk (ITK bin directory) and there is
> set to ON instead if I run ccmake from the directory of my project I can't
> access this variable. And if I depriving my CMakeList of the
> FIND_PACKAGE(GDCM)...bla bla.. when I run the command make it doesn't find the gdcm library
> the I included in my project.  And so what can I do for use GDCM and ITK 
> together?
> 
> 
> Thank you
> Edoardo
> 
> 
> -----Messaggio originale-----
> Da: insight-users-bounces at itk.org per conto di Lars Friedrich Lars
> Inviato: dom 21/03/2010 15.49
> A: insight-users at itk.org
> Oggetto: [Insight-users] Fwd: Re:  Problem ITK and GDCM in the same script
>  
> -------- Original-Nachricht --------
> Datum: Sun, 21 Mar 2010 15:46:53 +0100
> Von: "Lars Friedrich Lars" <lars-friedrich at gmx.net>
> An: edoardo.belletti at alice.it
> Betreff: Re: [Insight-users] Problem ITK and GDCM in the same script
> 
> Hello Eduardo,
> 
> without exactly knowing what you expect your DICOM application to do ...
> 
> Did you compile the ITK with ITK_USE_SYSTEM_GDCM (CMake-option of ITK)? If
> you did not, you should. This causes the ITK to take the system-installed
> GDCM (usually 2.++) instead of the one shipped with the ITK. If you did
> that you do no longer have to enter the GDCM-specific CMakeLists-entries
> (FIND_PACKAGE(GDCM) and so on), it should normally be sufficient to do the
> FIND_PACKAGE(ITK) stuff.
> 
> I had similar problems with a mixed-up ITK/VTK/GDCM2.0 application at the
> very beginning (the error messages were partially funny and not really
> trackable).
> 
> HTH,
> 
> lars
> 
> 
> -------- Original-Nachricht --------
> > Datum: Sun, 21 Mar 2010 12:21:26 +0100
> > Von: edoardo.belletti at alice.it
> > An: "ITK_forum  " <insight-users at itk.org>
> > Betreff: [Insight-users] Problem ITK and GDCM in the same script
> 
> > Hi 
> > I have a problem with configuring ITK with GDCM 2.0
> > I have wrote this script which use the gdcm library for extract some tag
> > from the header dicom and it works, but when in the same script I try to
> use
> > also the itk's library the output is: Segmentation Fault (wherever I
> call
> > Update() or I create a new smartpointer with New)
> > I don't know if it is a problem of CMakeLists and so I have put in this
> > email also my CMakeLists.txt.
> > 
> > Thank you very much
> > 
> > Edoardo Belletti
> > 
> > CMakeLists.txt:
> > 
> > CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
> > 
> > PROJECT(ImageIO)
> > 
> > # Find ITK.
> > FIND_PACKAGE(ITK REQUIRED)
> > IF(ITK_FOUND)
> >   INCLUDE(${ITK_USE_FILE})
> > ENDIF(ITK_FOUND)
> > 
> > # 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(ReadAndDumpDICOMDIR ReadAndDumpDICOMDIR.cxx )
> > TARGET_LINK_LIBRARIES(ReadAndDumpDICOMDIR ITKCommon ITKIO gdcmMSFF)
> > 
> > 
> > //==========================================================
> > 
> > 
> > // Librerie ITK
> > #include "itkImage.h"
> > #include "itkImageFileReader.h"
> > #include "itkImageFileWriter.h"
> > #include "itkSobelEdgeDetectionImageFilter.h"
> > #include "itkCastImageFilter.h"
> > #include "itkRescaleIntensityImageFilter.h"
> > #include "itkGDCMImageIO.h"
> > #include "itkRegionOfInterestImageFilter.h"
> > // Librerie GDCM
> > #include "gdcmReader.h"
> > #include "gdcmMediaStorage.h"
> > #include "gdcmAttribute.h"
> > #include "gdcmApplicationEntity.h"
> > #include "gdcmElement.h"
> > #include "gdcmSequenceOfItems.h"
> > 
> > bool Region ( char* nomefile, unsigned int X_min, unsigned int Y_min,
> > unsigned int X_max, unsigned int Y_max );
> > 
> > 
> > int main(int argc, char* argv[] )
> > {
> > 	// Controllo del numero di argomenti introdotti da riga di comando
> > 	if( argc < 3 )
> > 	{
> > 		std::cerr << "Usage: " << std::endl;
> > 		std::cerr << argv[0] << " inputImageFile  outputImageFile " <<
> > std::endl;
> > 		return EXIT_FAILURE;
> > 	}
> > 	// Settaggio delle variabili in input
> > 	const char * InputImageFilename  = argv[1];
> > 	const char * OutputImageFilename = argv[2];
> > 
> > 	// Dichiarazione dei tipi
> > 	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;
> > 	ImageIOType::Pointer dicomIO = ImageIOType::New();
> > 	
> > 	ReaderType::Pointer reader = ReaderType::New();
> >         reader->SetFileName( InputImageFilename );
> > 	reader->SetImageIO( dicomIO );
> >        
> > 	WriterType::Pointer writer = WriterType::New();
> >         writer->SetFileName( OutputImageFilename );
> >         writer->SetInput( reader->GetOutput() );
> >         writer->Update();
> > 
> > 	unsigned int x_min = 1;
> > 	unsigned int y_min = 1;
> > 	unsigned int x_max = 1;
> > 	unsigned int y_max = 1;
> > 
> > 	if( Region ( argv[1], x_min, y_min, x_max, y_max ) )
> > 			std::cout << "ok\n";
> > 
> > 	else
> > 	{
> > 		std::cout << "no\n";
> > 
> > 	}
> > 
> > 
> > }
> > 
> > bool Region ( char* nomefile, unsigned int X_min, unsigned int Y_min,
> > unsigned int X_max, unsigned int Y_max )
> > {
> > 	gdcm::Reader reader;
> >         reader.SetFileName( nomefile );
> >         if( !reader.Read() )
> >         {
> >                 std::cerr << "Could not read: " << nomefile <<
> std::endl;
> >                 return false;
> >         }
> > 
> > 	gdcm::File &file = reader.GetFile();
> >         gdcm::DataSet &ds = file.GetDataSet();
> > 
> > 	gdcm::Tag tsqur(0x0018,0x6011);
> > 	if( !ds.FindDataElement( tsqur ) )
> > 	{
> > 		return false;
> > 	}
> > 
> > 	const gdcm::DataElement &squr= ds.GetDataElement( tsqur );
> > 	//std::cout << squr << std::endl;
> > 	const gdcm::SequenceOfItems *sqi = squr.GetSequenceOfItems();
> > 	if( !sqi || !sqi->GetNumberOfItems() )
> > 	{
> > 		return false;
> > 	}
> > 	//std::cout << sqi << std::endl;
> > 
> > 	const gdcm::Item & item = sqi->GetItem(1);
> > 	//std::cout << item << std::endl;
> > 	const gdcm::DataSet& nestedds = item.GetNestedDataSet();
> > 	//std::cout << nestedds << std::endl;	
> > 
> > 	gdcm::Tag tX0(0x0018,0x6018);
> > 	gdcm::Tag tY0(0x0018,0x601a);
> > 	gdcm::Tag tX1(0x0018,0x601c);
> > 	gdcm::Tag tY1(0x0018,0x601e);
> > 
> > 	if( (!nestedds.FindDataElement( tX0 ))||(!nestedds.FindDataElement( tY0
> > ))||(!nestedds.FindDataElement( tX1 ))||(!nestedds.FindDataElement( tY1
> )) )
> > 	{
> > 		return false;
> > 	}
> > 
> > 	const gdcm::DataElement& deX0 = nestedds.GetDataElement( tX0 );
> > 	const gdcm::DataElement& deY0 = nestedds.GetDataElement( tY0 );
> > 	const gdcm::DataElement& deX1 = nestedds.GetDataElement( tX1 );
> > 	const gdcm::DataElement& deY1 = nestedds.GetDataElement( tY1 );
> > 	//std::cout << deX0 << std::endl << deY0 << std::endl << << deX1 <<
> > std::endl << deY1 << std::endl;
> > 
> > 	//const gdcm::ByteValue *bvX0 = deX0.GetByteValue();
> > 	//const gdcm::ByteValue *bvY0 = deY0.GetByteValue();
> > 	//const gdcm::ByteValue *bvX1 = deX1.GetByteValue();
> > 	//const gdcm::ByteValue *bvY1 = deY1.GetByteValue();
> >     	//std::cout << bvX0 << std::endl << bvY0 << std::endl << bvX1 <<
> > std::endl << bvY1 << std::endl;    
> > 
> > 	gdcm::Attribute<0x0018,0x6018> atX0;
> > 	gdcm::Attribute<0x0018,0x601a> atY0;
> > 	gdcm::Attribute<0x0018,0x601c> atX1;
> > 	gdcm::Attribute<0x0018,0x601e> atY1;
> >     	atX0.SetFromDataElement( deX0 );
> > 	atY0.SetFromDataElement( deY0 );
> > 	atX1.SetFromDataElement( deX1 );
> > 	atY1.SetFromDataElement( deY1 );
> > 	const uint32_t* X0 = atX0.GetValues();
> > 	const uint32_t* Y0 = atY0.GetValues();
> > 	const uint32_t* X1 = atX1.GetValues();
> > 	const uint32_t* Y1 = atY1.GetValues();
> > 	//std::cout << X0 << std::endl << Y0 << std::endl << X1 << std::endl <<
> > Y1 << std::endl;
> > 
> > 	X_min = static_cast<unsigned int>(X0[0]);
> > 	Y_min = static_cast<unsigned int>(Y0[0]);
> > 	X_max = static_cast<unsigned int>(X1[0]);
> > 	Y_max = static_cast<unsigned int>(Y1[0]);
> > 
> > 	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;
> > 
> >         return true;
> > }
> > 
> > 
> > 
> 
> -- 
> GMX.at - Österreichs FreeMail-Dienst mit über 2 Mio Mitgliedern
> E-Mail, SMS & mehr! Kostenlos: http://portal.gmx.net/de/go/atfreemail
> 
> -- 
> GMX.at - Österreichs FreeMail-Dienst mit über 2 Mio Mitgliedern
> E-Mail, SMS & mehr! Kostenlos: http://portal.gmx.net/de/go/atfreemail
> _____________________________________
> Powered by www.kitware.com
> 
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
> 
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.html
> 
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
> 
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-users
> 

-- 
Sicherer, schneller und einfacher. Die aktuellen Internet-Browser -
jetzt kostenlos herunterladen! http://portal.gmx.net/de/go/chbrowser


More information about the Insight-users mailing list