Hi Bill,<br><br>Sorry, but it&#39;s getting more complicated with itkGDCMIMageIO.cxx.<br><br>With the previous ITK (the version prior to the rev 1.162 change that you did to itkGDCMIMageIO.cxx so my outputted 3d dicom volume would be in the correct orientation):<br>
<br>With this previous ITK, I had code working that read two dicom series and wrote them to a 3d dicom single file volume.<br><br>Now with the revised ITK (the version with the re 1.162 change that you did to itkGDCMIMageIO.cxx so
my outputted 3d dicom volume would be in the correct orientation):<br><br>With this revised ITK, my code that reads two dicom series and writes them to a 3d dicom single file volume.<br>
seg faults.<br><br>Could you check this for me please.<br><br>Ideally, I would like my previous segmentation code to output the correct dicom orientation, and my code that reads dicom series to both work with the same version of ITK.<br>
<br>Thanks,<br>john<br><br>You can download my dicom series data as compressed tar.gz from the following links:<br><br><a href="http://www.apmaths.uwo.ca/~jdrozd/datasubject.tar.gz">http://www.apmaths.uwo.ca/~jdrozd/datasubject.tar.gz</a><br>
<br>and<br><br><a href="http://www.apmaths.uwo.ca/~jdrozd/datasubject4.tar.gz">http://www.apmaths.uwo.ca/~jdrozd/datasubject4.tar.gz</a><br>
<br>(Prior to running the below code, untar and unzip these two compressed files and have them in the same directory as the code executable)<br><br>Below is my code:<br><br>/* to run ReadAtlasDicomSeriesAndReadSubjectDicomSeries.cxx, compile and type:<br>
./ReadAtlasDicomSeriesAndReadSubjectDicomSeries &quot;datasubject&quot; &quot;datasubject4/136_S_0429/MPR__GradWarp__B1_Correction__N3__Scaled/2007-06-18_13_28_06.0/S33724/70809234826766_S33724_I66806_Dicom&quot;<br>*/<br>
<br>#if defined(_MSC_VER)<br>#pragma warning ( disable : 4786 )<br>#endif<br><br>#include &quot;itkImageFileReader.h&quot;<br>#include &quot;itkImageFileWriter.h&quot;<br>#include &quot;itkOrientedImage.h&quot;<br>#include &quot;itkGDCMImageIO.h&quot;<br>
#include &quot;itkGDCMSeriesFileNames.h&quot;<br>#include &quot;itkImageSeriesReader.h&quot;<br><br>int main(int argc, char *argv[])<br>{<br>  <br>  typedef short InputPixelType;<br>  const unsigned int   InputDimension = 3;<br>
<br>  typedef itk::Image&lt; InputPixelType, InputDimension &gt; InputImageType;<br><br>  typedef itk::ImageSeriesReader&lt; InputImageType &gt; AtlasReaderSeriesType;<br><br>  typedef itk::ImageSeriesReader&lt; InputImageType &gt; SubjectReaderSeriesType;<br>
<br>  AtlasReaderSeriesType::Pointer movingatlasfilter = AtlasReaderSeriesType::New();<br><br>  SubjectReaderSeriesType::Pointer fixedsubjectfilter = SubjectReaderSeriesType::New();<br><br> typedef itk::GDCMImageIO           ImageIOType;<br>
<br>  ImageIOType::Pointer gdcmImageIOAtlas = ImageIOType::New();<br><br>  ImageIOType::Pointer gdcmImageIOSubject = ImageIOType::New();<br><br>  fixedsubjectfilter-&gt;SetImageIO( gdcmImageIOSubject );<br><br>  movingatlasfilter-&gt;SetImageIO( gdcmImageIOAtlas );<br>
  <br>typedef itk::GDCMSeriesFileNames AtlasNamesGeneratorType;<br>  AtlasNamesGeneratorType::Pointer AtlasnameGenerator = AtlasNamesGeneratorType::New();<br><br>typedef itk::GDCMSeriesFileNames SubjectNamesGeneratorType;<br>
  SubjectNamesGeneratorType::Pointer SubjectnameGenerator = SubjectNamesGeneratorType::New();   <br><br>  SubjectnameGenerator-&gt;SetUseSeriesDetails( true );<br>  SubjectnameGenerator-&gt;AddSeriesRestriction(&quot;0008|0021&quot; );<br>
<br>  SubjectnameGenerator-&gt;SetDirectory( argv[2] );<br><br>  AtlasnameGenerator-&gt;SetUseSeriesDetails( true );<br>  AtlasnameGenerator-&gt;AddSeriesRestriction(&quot;0008|0021&quot; );<br><br>  AtlasnameGenerator-&gt;SetDirectory( argv[1] );<br>
<br>try<br>    {<br>    std::cout &lt;&lt; std::endl &lt;&lt; &quot;The directory: &quot; &lt;&lt; std::endl;<br>    std::cout &lt;&lt; std::endl &lt;&lt; argv[1] &lt;&lt; std::endl &lt;&lt; std::endl;<br>    std::cout &lt;&lt; &quot;Contains the following Atlas DICOM Series: &quot;;<br>
    std::cout &lt;&lt; std::endl &lt;&lt; std::endl;<br><br>typedef std::vector&lt; std::string &gt;    AtlasSeriesIdContainer;<br>  <br>    const AtlasSeriesIdContainer &amp; AtlasseriesUID = AtlasnameGenerator-&gt;GetSeriesUIDs();<br>
  <br>    AtlasSeriesIdContainer::const_iterator AtlasseriesItr = AtlasseriesUID.begin();<br>    AtlasSeriesIdContainer::const_iterator AtlasseriesEnd = AtlasseriesUID.end();<br>    while( AtlasseriesItr != AtlasseriesEnd )<br>
      {<br>      std::cout &lt;&lt; AtlasseriesItr-&gt;c_str() &lt;&lt; std::endl;<br>      AtlasseriesItr++;<br>      }<br><br>std::string AtlasseriesIdentifier;<br><br>    if( argc &gt; 4 ) // If no optional series identifier<br>
      {<br>      AtlasseriesIdentifier = argv[3];<br>      }<br>    else<br>      {<br>      AtlasseriesIdentifier = AtlasseriesUID.begin()-&gt;c_str();<br>      }<br><br>std::cout &lt;&lt; std::endl &lt;&lt; std::endl;<br>
    std::cout &lt;&lt; &quot;Now reading Atlas series: &quot; &lt;&lt; std::endl &lt;&lt; std::endl;<br>    std::cout &lt;&lt; AtlasseriesIdentifier &lt;&lt; std::endl;<br>    std::cout &lt;&lt; std::endl &lt;&lt; std::endl;<br>
<br>typedef std::vector&lt; std::string &gt;   AtlasFileNamesContainer;<br>    AtlasFileNamesContainer AtlasfileNames;<br><br>    AtlasfileNames = AtlasnameGenerator-&gt;GetFileNames( AtlasseriesIdentifier );<br><br>    movingatlasfilter-&gt;SetFileNames( AtlasfileNames );<br>
<br>   <br>    try<br>      {<br>      movingatlasfilter-&gt;Update();<br>      std::cout &lt;&lt; &quot;Atlas read successfully&quot;  &lt;&lt; std::endl;<br>      }<br>    catch (itk::ExceptionObject &amp;ex)<br>      {<br>
      std::cout &lt;&lt; ex &lt;&lt; std::endl;<br>      return EXIT_FAILURE;<br>      }<br>      <br>      typedef itk::ImageFileWriter&lt; InputImageType &gt; AtlasWriterSubjectType;<br> <br>  AtlasWriterSubjectType::Pointer movingatlasfilterwriter = AtlasWriterSubjectType::New();<br>
<br> <br>  movingatlasfilterwriter-&gt;UseInputMetaDataDictionaryOff();<br>  movingatlasfilterwriter-&gt;SetImageIO( gdcmImageIOAtlas );<br> <br><br>movingatlasfilterwriter-&gt;SetFileName( &quot;atlasout.dcm&quot; );<br>
<br>movingatlasfilterwriter-&gt;SetInput( movingatlasfilter-&gt;GetOutput() );<br><br><br>try<br>      {<br>      movingatlasfilterwriter-&gt;Update();<br>      }<br>    catch (itk::ExceptionObject &amp;ex)<br>      {<br>
      std::cout &lt;&lt; ex &lt;&lt; std::endl;<br>      return EXIT_FAILURE;<br>      }<br>    }<br>  catch (itk::ExceptionObject &amp;ex)<br>    {<br>    std::cout &lt;&lt; ex &lt;&lt; std::endl;<br>    return EXIT_FAILURE;<br>
    }<br><br>    try<br>    {<br>    std::cout &lt;&lt; std::endl &lt;&lt; &quot;The directory: &quot; &lt;&lt; std::endl;<br>    std::cout &lt;&lt; std::endl &lt;&lt; argv[2] &lt;&lt; std::endl &lt;&lt; std::endl;<br>    std::cout &lt;&lt; &quot;Contains the following Subject DICOM Series: &quot;;<br>
    std::cout &lt;&lt; std::endl &lt;&lt; std::endl;<br><br>typedef std::vector&lt; std::string &gt;    SubjectSeriesIdContainer;<br>  <br>    const SubjectSeriesIdContainer &amp; SubjectseriesUID = SubjectnameGenerator-&gt;GetSeriesUIDs();<br>
<br>    SubjectSeriesIdContainer::const_iterator SubjectseriesItr = SubjectseriesUID.begin();<br>    SubjectSeriesIdContainer::const_iterator SubjectseriesEnd = SubjectseriesUID.end();<br>    while( SubjectseriesItr != SubjectseriesEnd )<br>
      {<br>      std::cout &lt;&lt; SubjectseriesItr-&gt;c_str() &lt;&lt; std::endl;<br>      SubjectseriesItr++;<br>      }<br><br>std::string SubjectseriesIdentifier;<br><br>    if( argc &gt; 4 ) // If no optional series identifier<br>
      {<br>      SubjectseriesIdentifier = argv[2];<br>      }<br>    else<br>      {<br>      SubjectseriesIdentifier = SubjectseriesUID.begin()-&gt;c_str();<br>      }<br><br>std::cout &lt;&lt; std::endl &lt;&lt; std::endl;<br>
    std::cout &lt;&lt; &quot;Now reading Subject series: &quot; &lt;&lt; std::endl &lt;&lt; std::endl;<br>    std::cout &lt;&lt; SubjectseriesIdentifier &lt;&lt; std::endl;<br>    std::cout &lt;&lt; std::endl &lt;&lt; std::endl;<br>
<br>typedef std::vector&lt; std::string &gt;   SubjectFileNamesContainer;<br>    SubjectFileNamesContainer SubjectfileNames;<br><br>    SubjectfileNames = SubjectnameGenerator-&gt;GetFileNames( SubjectseriesIdentifier );<br>
<br>    fixedsubjectfilter-&gt;SetFileNames( SubjectfileNames );<br><br>    try<br>      {<br>      fixedsubjectfilter-&gt;Update();<br>      std::cout &lt;&lt; &quot;Subject read successfully&quot;  &lt;&lt; std::endl;<br>
      }<br>    catch (itk::ExceptionObject &amp;ex)<br>      {<br>      std::cout &lt;&lt; ex &lt;&lt; std::endl;<br>      return EXIT_FAILURE;<br>      }<br>      <br>      typedef itk::ImageFileWriter&lt; InputImageType &gt; SubjectWriterSubjectType;<br>
 <br>  SubjectWriterSubjectType::Pointer fixedsubjectfilterwriter = SubjectWriterSubjectType::New();<br><br>  fixedsubjectfilterwriter-&gt;UseInputMetaDataDictionaryOff();<br>  fixedsubjectfilterwriter-&gt;SetImageIO( gdcmImageIOSubject );<br>
<br>  fixedsubjectfilterwriter-&gt;SetFileName( &quot;subjectout.dcm&quot; );<br><br>  fixedsubjectfilterwriter-&gt;SetInput( fixedsubjectfilter-&gt;GetOutput() );<br><br><br>try<br>      {<br>      fixedsubjectfilterwriter-&gt;Update();<br>
      }<br>    catch (itk::ExceptionObject &amp;ex)<br>      {<br>      std::cout &lt;&lt; ex &lt;&lt; std::endl;<br>      return EXIT_FAILURE;<br>      }<br>      }<br>  catch (itk::ExceptionObject &amp;ex)<br>    {<br>    std::cout &lt;&lt; ex &lt;&lt; std::endl;<br>
    return EXIT_FAILURE;<br>    }<br><br><br><br>return EXIT_SUCCESS;<br>}<br><br>