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

edoardo.belletti at alice.it edoardo.belletti at alice.it
Sun Mar 21 07:21:26 EDT 2010


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;
}



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


More information about the Insight-users mailing list