<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7655.8">
<TITLE>Problem ITK and GDCM in the same script</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->

<P><FONT SIZE=2>Hi<BR>
I have a problem with configuring ITK with GDCM 2.0<BR>
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)<BR>
I don't know if it is a problem of CMakeLists and so I have put in this email also my CMakeLists.txt.<BR>
<BR>
Thank you very much<BR>
<BR>
Edoardo Belletti<BR>
<BR>
CMakeLists.txt:<BR>
<BR>
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)<BR>
<BR>
PROJECT(ImageIO)<BR>
<BR>
# Find ITK.<BR>
FIND_PACKAGE(ITK REQUIRED)<BR>
IF(ITK_FOUND)<BR>
&nbsp; INCLUDE(${ITK_USE_FILE})<BR>
ENDIF(ITK_FOUND)<BR>
<BR>
# Find GDCM<BR>
FIND_PACKAGE(GDCM)<BR>
&nbsp; IF(GDCM_FOUND)<BR>
&nbsp;&nbsp;&nbsp; INCLUDE(${GDCM_USE_FILE})<BR>
&nbsp;&nbsp;&nbsp; IF( &quot;${GDCM_MAJOR_VERSION}&quot; LESS 2.0 )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET(MITK_GDCM_LIBRARIES gdcm)<BR>
&nbsp;&nbsp;&nbsp; ELSE( &quot;${GDCM_MAJOR_VERSION}&quot; LESS 2.0 )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SET(MITK_GDCM_LIBRARIES gdcmMSFF)<BR>
&nbsp;&nbsp;&nbsp; ENDIF( &quot;${GDCM_MAJOR_VERSION}&quot; LESS 2.0 )<BR>
&nbsp; ELSE(GDCM_FOUND)<BR>
&nbsp;&nbsp;&nbsp; MESSAGE(FATAL_ERROR &quot;Must set GDCM_DIR for MITK_USE_SYSTEM_GDCM.&quot;)<BR>
&nbsp; ENDIF(GDCM_FOUND)<BR>
<BR>
<BR>
<BR>
ADD_EXECUTABLE(ReadAndDumpDICOMDIR ReadAndDumpDICOMDIR.cxx )<BR>
TARGET_LINK_LIBRARIES(ReadAndDumpDICOMDIR ITKCommon ITKIO gdcmMSFF)<BR>
<BR>
<BR>
//==========================================================<BR>
<BR>
<BR>
// Librerie ITK<BR>
#include &quot;itkImage.h&quot;<BR>
#include &quot;itkImageFileReader.h&quot;<BR>
#include &quot;itkImageFileWriter.h&quot;<BR>
#include &quot;itkSobelEdgeDetectionImageFilter.h&quot;<BR>
#include &quot;itkCastImageFilter.h&quot;<BR>
#include &quot;itkRescaleIntensityImageFilter.h&quot;<BR>
#include &quot;itkGDCMImageIO.h&quot;<BR>
#include &quot;itkRegionOfInterestImageFilter.h&quot;<BR>
// Librerie GDCM<BR>
#include &quot;gdcmReader.h&quot;<BR>
#include &quot;gdcmMediaStorage.h&quot;<BR>
#include &quot;gdcmAttribute.h&quot;<BR>
#include &quot;gdcmApplicationEntity.h&quot;<BR>
#include &quot;gdcmElement.h&quot;<BR>
#include &quot;gdcmSequenceOfItems.h&quot;<BR>
<BR>
bool Region ( char* nomefile, unsigned int X_min, unsigned int Y_min, unsigned int X_max, unsigned int Y_max );<BR>
<BR>
<BR>
int main(int argc, char* argv[] )<BR>
{<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Controllo del numero di argomenti introdotti da riga di comando<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( argc &lt; 3 )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;Usage: &quot; &lt;&lt; std::endl;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; argv[0] &lt;&lt; &quot; inputImageFile&nbsp; outputImageFile &quot; &lt;&lt; std::endl;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return EXIT_FAILURE;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Settaggio delle variabili in input<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char * InputImageFilename&nbsp; = argv[1];<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char * OutputImageFilename = argv[2];<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Dichiarazione dei tipi<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const unsigned int Dimension = 2;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef unsigned char PixelType;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef itk::Image&lt; PixelType, Dimension &gt; ImageType;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef itk::ImageFileReader&lt; ImageType &gt; ReaderType;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef itk::ImageFileWriter&lt; ImageType &gt; WriterType;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef itk::GDCMImageIO ImageIOType;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImageIOType::Pointer dicomIO = ImageIOType::New();<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReaderType::Pointer reader = ReaderType::New();<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader-&gt;SetFileName( InputImageFilename );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader-&gt;SetImageIO( dicomIO );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WriterType::Pointer writer = WriterType::New();<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer-&gt;SetFileName( OutputImageFilename );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer-&gt;SetInput( reader-&gt;GetOutput() );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer-&gt;Update();<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned int x_min = 1;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned int y_min = 1;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned int x_max = 1;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned int y_max = 1;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( Region ( argv[1], x_min, y_min, x_max, y_max ) )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;ok\n&quot;;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;no\n&quot;;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<BR>
<BR>
}<BR>
<BR>
bool Region ( char* nomefile, unsigned int X_min, unsigned int Y_min, unsigned int X_max, unsigned int Y_max )<BR>
{<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gdcm::Reader reader;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader.SetFileName( nomefile );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( !reader.Read() )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cerr &lt;&lt; &quot;Could not read: &quot; &lt;&lt; nomefile &lt;&lt; std::endl;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gdcm::File &amp;file = reader.GetFile();<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gdcm::DataSet &amp;ds = file.GetDataSet();<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gdcm::Tag tsqur(0x0018,0x6011);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( !ds.FindDataElement( tsqur ) )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const gdcm::DataElement &amp;squr= ds.GetDataElement( tsqur );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //std::cout &lt;&lt; squr &lt;&lt; std::endl;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const gdcm::SequenceOfItems *sqi = squr.GetSequenceOfItems();<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( !sqi || !sqi-&gt;GetNumberOfItems() )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //std::cout &lt;&lt; sqi &lt;&lt; std::endl;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const gdcm::Item &amp; item = sqi-&gt;GetItem(1);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //std::cout &lt;&lt; item &lt;&lt; std::endl;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const gdcm::DataSet&amp; nestedds = item.GetNestedDataSet();<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //std::cout &lt;&lt; nestedds &lt;&lt; std::endl;&nbsp;&nbsp;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gdcm::Tag tX0(0x0018,0x6018);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gdcm::Tag tY0(0x0018,0x601a);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gdcm::Tag tX1(0x0018,0x601c);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gdcm::Tag tY1(0x0018,0x601e);<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( (!nestedds.FindDataElement( tX0 ))||(!nestedds.FindDataElement( tY0 ))||(!nestedds.FindDataElement( tX1 ))||(!nestedds.FindDataElement( tY1 )) )<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const gdcm::DataElement&amp; deX0 = nestedds.GetDataElement( tX0 );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const gdcm::DataElement&amp; deY0 = nestedds.GetDataElement( tY0 );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const gdcm::DataElement&amp; deX1 = nestedds.GetDataElement( tX1 );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const gdcm::DataElement&amp; deY1 = nestedds.GetDataElement( tY1 );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //std::cout &lt;&lt; deX0 &lt;&lt; std::endl &lt;&lt; deY0 &lt;&lt; std::endl &lt;&lt; &lt;&lt; deX1 &lt;&lt; std::endl &lt;&lt; deY1 &lt;&lt; std::endl;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //const gdcm::ByteValue *bvX0 = deX0.GetByteValue();<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //const gdcm::ByteValue *bvY0 = deY0.GetByteValue();<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //const gdcm::ByteValue *bvX1 = deX1.GetByteValue();<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //const gdcm::ByteValue *bvY1 = deY1.GetByteValue();<BR>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //std::cout &lt;&lt; bvX0 &lt;&lt; std::endl &lt;&lt; bvY0 &lt;&lt; std::endl &lt;&lt; bvX1 &lt;&lt; std::endl &lt;&lt; bvY1 &lt;&lt; std::endl;&nbsp;&nbsp;&nbsp;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gdcm::Attribute&lt;0x0018,0x6018&gt; atX0;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gdcm::Attribute&lt;0x0018,0x601a&gt; atY0;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gdcm::Attribute&lt;0x0018,0x601c&gt; atX1;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gdcm::Attribute&lt;0x0018,0x601e&gt; atY1;<BR>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; atX0.SetFromDataElement( deX0 );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; atY0.SetFromDataElement( deY0 );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; atX1.SetFromDataElement( deX1 );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; atY1.SetFromDataElement( deY1 );<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const uint32_t* X0 = atX0.GetValues();<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const uint32_t* Y0 = atY0.GetValues();<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const uint32_t* X1 = atX1.GetValues();<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const uint32_t* Y1 = atY1.GetValues();<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //std::cout &lt;&lt; X0 &lt;&lt; std::endl &lt;&lt; Y0 &lt;&lt; std::endl &lt;&lt; X1 &lt;&lt; std::endl &lt;&lt; Y1 &lt;&lt; std::endl;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X_min = static_cast&lt;unsigned int&gt;(X0[0]);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Y_min = static_cast&lt;unsigned int&gt;(Y0[0]);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X_max = static_cast&lt;unsigned int&gt;(X1[0]);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Y_max = static_cast&lt;unsigned int&gt;(Y1[0]);<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;X_min = &quot; &lt;&lt; X_min &lt;&lt; std::endl;&nbsp;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;Y_min = &quot; &lt;&lt; Y_min &lt;&lt; std::endl;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;X_max = &quot; &lt;&lt; X_max &lt;&lt; std::endl;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; &quot;Y_max = &quot; &lt;&lt; Y_max &lt;&lt; std::endl;<BR>
<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<BR>
}<BR>
<BR>
<BR>
<BR>
</FONT>
</P>

</BODY>
</HTML>