[Insight-users] ResampleImageFilter crashes in release mode

Michael Schildt michael.schildt at ifn-magdeburg.de
Wed Jul 1 08:28:12 EDT 2009


Hello Luis,

thank you for your suggestions.

I inserted the Prints in my source code and here ist the output:
--------------------------- fixedIm -------------------------------
Image (00339668)
  RTTI typeinfo:   class itk::Image<float,3>
  Reference Count: 3
  Modified Time: 20
  Debug: Off
  Observers:
    none
  Source: (none)
  Source output index:  0
  Release Data: Off
  Data Released: False
  Global Release Data: Off
  PipelineMTime: 13
  UpdateMTime: 19
  LargestPossibleRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [256, 256, 256]
  BufferedRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [256, 256, 256]
  RequestedRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [256, 256, 256]
  Spacing: [1, 1, 1]
  Origin: [0, 0, 0]
  Direction:
1 0 0
0 1 0
0 0 1

  IndexToPointMatrix:
  1 0 0
0 1 0
0 0 1

  PointToIndexMatrix:
  1 0 0
0 1 0
0 0 1

  PixelContainer:
    ImportImageContainer (01390EA8)
      RTTI typeinfo:   class itk::ImportImageContainer<unsigned long,float>
      Reference Count: 1
      Modified Time: 17
      Debug: Off
      Observers:
        none
      Pointer: 034B0020
      Container manages memory: false
      Size: 16777216
      Capacity: 16777216

--------------------------- movingIm ------------------------------
Image (00337178)
  RTTI typeinfo:   class itk::Image<float,3>
  Reference Count: 4
  Modified Time: 40
  Debug: Off
  Observers:
    none
  Source: (none)
  Source output index:  0
  Release Data: Off
  Data Released: False
  Global Release Data: Off
  PipelineMTime: 33
  UpdateMTime: 39
  LargestPossibleRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [256, 256, 256]
  BufferedRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [256, 256, 256]
  RequestedRegion:
    Dimension: 3
    Index: [0, 0, 0]
    Size: [256, 256, 256]
  Spacing: [1, 1, 1]
  Origin: [0, 0, 0]
  Direction:
1 0 0
0 1 0
0 0 1

  IndexToPointMatrix:
  1 0 0
0 1 0
0 0 1

  PointToIndexMatrix:
  1 0 0
0 1 0
0 0 1

  PixelContainer:
    ImportImageContainer (0033BE98)
      RTTI typeinfo:   class itk::ImportImageContainer<unsigned long,float>
      Reference Count: 1
      Modified Time: 37
      Debug: Off
      Observers:
        none
      Pointer: 074C0020
      Container manages memory: false
      Size: 16777216
      Capacity: 16777216

--------------------------- resampler -----------------------------
ResampleImageFilter (00338A08)
  RTTI typeinfo:   class itk::ResampleImageFilter<class
itk::Image<float,3>,cla
s itk::Image<float,3>,double>
  Reference Count: 2
  Modified Time: 64
  Debug: Off
  Observers:
    none
  Number Of Required Inputs: 1
  Number Of Required Outputs: 1
  Number Of Threads: 1
  ReleaseDataFlag: Off
  ReleaseDataBeforeUpdateFlag: Off
  Input 0: (00337178)
  Output 0: (00338B88)
  AbortGenerateData: Off
  Progress: 0
  Multithreader:
    RTTI typeinfo:   class itk::MultiThreader
    Reference Count: 1
    Modified Time: 49
    Debug: Off
    Observers:
      none
    Thread Count: 1
    Global Maximum Number Of Threads: 128
    Global Default Number Of Threads: 1
  DefaultPixelValue: 0
  Size: [256, 256, 256]
  OutputStartIndex: [0, 0, 0]
  OutputOrigin: [0, 0, 0]
  OutputSpacing: [1, 1, 1]
  OutputDirection: 1 0 0
0 1 0
0 0 1

  Transform: 00337350
  Interpolator: 00338860
  UseReferenceImage: Off

I already call Update on the Images but after the Set..- commands. I'm
not sure about the order of commands to import the images to itk. Here
is my import method called to create fixedIm and movingIm, maybe this
helps to localize the problem (MRIScalarLayer is a custom class just
containing the image data and some infos):

template<typename dType> typename itk::Image<dType,3>::Pointer
dataInterface2itk(MRIScalarLayer<dType> *diImage)
{
  typedef itk::Image<dType,3> Image3DType;
  typename Image3DType::Pointer image = Image3DType::New();
  typedef itk::ImportImageFilter<dType,3> ImportFilterImage3DType;
  typename ImportFilterImage3DType::Pointer import =
ImportFilterImage3DType::New();
  typename ImportFilterImage3DType::SizeType size;
  size[0] = diImage->getSize((unsigned char)0); // size along X
  size[1] = diImage->getSize((unsigned char)1); // size along Y
  size[2] = diImage->getSize((unsigned char)2); // size along Z
  typename ImportFilterImage3DType::IndexType start;
  start.Fill( 0 );
  typename ImportFilterImage3DType::RegionType region;
  region.SetIndex( start );
  region.SetSize( size );
  import->SetRegion( region );
  double spacing[ 3 ];
  // hier sollte noch das gap mit beachtet werden, welches es nicht in
itk gibt
  spacing[0] = diImage->getSpacing((unsigned char)0); // along X direction
  spacing[1] = diImage->getSpacing((unsigned char)1); // along Y direction
  spacing[2] = diImage->getSpacing((unsigned char)2); // along Z direction
  import->SetSpacing( spacing );
  double origin[ 3 ];
  origin[0] = diImage->getOrigin((unsigned char)0); // X coordinate
  origin[1] = diImage->getOrigin((unsigned char)1); // Y coordinate
  origin[2] = diImage->getOrigin((unsigned char)2); // Z coordinate
  import->SetOrigin( origin );

  const unsigned int numberOfPixels = diImage->getSize();
  dType* data = diImage->getData();
  import->SetImportPointer( data, numberOfPixels, false );
  import->Update();
  image = import->GetOutput();
  image->Update();

//  cout << image;
  return image;
}

Best requards,
    Michael Schildt

Luis Ibanez schrieb:
>
> Hi Michael,
>
>
>        This looks like a bug in your code      :-(
>
>
>
> Typical suspects are:
>
>
> A) The fixed image is not available yet at
>      the time you call GetLargestPossibleRegion(),
>      GetOrigin(), GetSpacing().
>
>       You should call  
>
>                     fixedIm->Update()
>
>         before you call any of the above methods.
>
>
> We will learn a lot about other possible causes if
> you add to your code the following:
>
>         fixedIm->Print( std::cout );
>         movingIm->Print( std::cout );
>         resampler->Print( std::cout );
>
> before the line
>
>          resampler->Update();
>
> and if you post the resulting output text to the
> mailing list.
>
>
>       Please let us know what you find.
>
>
>            Thanks
>
>
>                  Luis
>
>
> ----------------------------------------------------------------
> On Fri, Jun 26, 2009 at 6:42 AM, Michael Schildt 
> <michael.schildt at ifn-magdeburg.de 
> <mailto:michael.schildt at ifn-magdeburg.de>> wrote:
>
>     Hello!
>
>     I have some trouble with ResampleImageFilter. I'm not sure if it is a
>     bug in my program or in ITK. It works as expected in Debug
>     configuration
>     but crashes in Release mode. I traced to the source line in ITK
>     were it
>     appear in RelWithDebMode configuration. I attach some information and
>     source.
>
>     Best reguards,
>       Michael Schildt
>
>     The method based on the example in the itkSoftwareGuide:
>     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>     template <typename dataT, typename TrfType>
>     typename itk::Image<dataT,3>::Pointer transformImage(typename
>     itk::Image<dataT,3>::Pointer fixedIm,
>                                                        typename
>     itk::Image<dataT,3>::Pointer movingIm,
>                                                        typename
>     TrfType::ConstPointer transform)
>     {
>      typedef itk::Image<dataT, 3> ImageType;
>      typedef TrfType TransformType;
>      typedef itk::LinearInterpolateImageFunction<ImageType,double>
>     InterpolatorType;
>      //typedef itk::WindowedSincInterpolateImageFunction<ImageType,3>
>     InterpolatorType;
>
>      typedef itk::ResampleImageFilter<ImageType,ImageType> ResamplerType;
>
>      typename InterpolatorType::Pointer interpolator =
>     InterpolatorType::New();
>
>      typename ResamplerType::Pointer resampler = ResamplerType::New();
>      resampler->SetInput( movingIm );
>
>      resampler->SetTransform( transform.GetPointer() );
>      resampler->SetInterpolator( interpolator.GetPointer() );
>      resampler->SetSize( fixedIm->GetLargestPossibleRegion().GetSize() );
>      resampler->SetOutputOrigin( fixedIm->GetOrigin() );
>      resampler->SetOutputSpacing( fixedIm->GetSpacing() );
>      resampler->SetDefaultPixelValue( 0 );
>
>      // resample the moving image
>      resampler->Update();
>
>      return resampler->GetOutput();
>     }
>     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>
>     It appears in the Update() method of the resampler. While debugging it
>     seems like a problem in itkDataObject.cxx at line marked with **
>
>     //----------------------------------------------------------------------------
>     void
>     DataObject
>     ::UpdateOutputData()
>     {
>      // If we need to update due to PipelineMTime, or the fact that our
>      // data was released, then propagate the UpdateOutputData to the
>     source
>      // if there is one.
>      if ( m_UpdateMTime < m_PipelineMTime || m_DataReleased ||
>          this->RequestedRegionIsOutsideOfTheBufferedRegion() )
>       {
>       if ( m_Source )      // <---m_Source is valid, but when i step over
>     here, it gets an invalid pointer
>         {
>     **      m_Source->UpdateOutputData(this);      // maybe call on
>     invalid
>     pointer?
>         }
>       }
>     }
>     //----------------------------------------------------------------------------
>
>     Stack backtrace:
>
>        BrainGUI.exe!std::_Vector_iterator<unsigned
>     int,std::allocator<unsigned int> >::operator+()  + 0x17 Bytes    C++
>
>           BrainGUI.exe!std::vector<unsigned
>         int,std::allocator<unsigned int> ::resize(unsigned int
>         _Newsize=1, unsigned int _Val=0)  Zeile 721 +
>
>     0x36 Bytes    C++
>        BrainGUI.exe!std::vector<bool,std::allocator<bool>
>
>         ::_Insert_x(std::_Vb_const_iterator<unsigned
>
>     int,int,std::vector<bool,std::allocator<bool> > > _Where=..., unsigned
>     int _Count=1)  Zeile 2312    C++
>        BrainGUI.exe!std::vector<bool,std::allocator<bool>
>
>         ::_Insert_n(std::_Vb_const_iterator<unsigned
>
>     int,int,std::vector<bool,std::allocator<bool> > > _Where=..., unsigned
>     int _Count=1, bool _Val=false)  Zeile 2292    C++
>        BrainGUI.exe!std::vector<bool,std::allocator<bool>
>
>         ::resize(unsigned int _Newsize=1, bool _Val=false)  Zeile 2044
>            C++
>
>        BrainGUI.exe!itk::ProcessObject::CacheInputReleaseDataFlags()
>     Zeile 1055    C++
>        BrainGUI.exe!itk::ProcessObject::UpdateOutputData(itk::DataObject *
>     __formal=0x02079270)  Zeile 964    C++
>        BrainGUI.exe!itk::DataObject::UpdateOutputData()  Zeile 420 + 0x8
>     Bytes    C++
>
>     BrainGUI.exe!transformImage<float,itk::VersorRigid3DTransform<double>
>
>         (itk::SmartPointer<itk::Image<float,3> > fixedIm={...},
>
>     itk::SmartPointer<itk::Image<float,3> > movingIm={...},
>     itk::SmartPointer<itk::VersorRigid3DTransform<double> const >
>     transform={...})  Zeile 123    C++
>        BrainGUI.exe!VersorRigid3DRegistration::doRegistration(bool
>     newVolume=true, void (const double &, const
>     std::basic_string<char,std::char_traits<char>,std::allocator<char>
>     > &)*
>     progress=0x004029e1)  Zeile 254 + 0x81 Bytes    C++
>        BrainGUI.exe!RegThread::Entry()  Zeile 273 + 0xf Bytes    C++
>        BrainGUI.exe!wxThreadInternal::DoThreadStart()  + 0xa5 Bytes    C++
>        BrainGUI.exe!wxThreadInternal::WinThreadStart()  + 0x6a Bytes  
>      C++
>        BrainGUI.exe!_callthreadstartex()  Zeile 348 + 0x6 Bytes    C
>        BrainGUI.exe!_threadstartex(void * ptd=0x04ef1118)  Zeile 326 + 0x5
>     Bytes    C
>
>     System:
>       - Windows XP Prof SP3
>       - Visual Studio 2008 Express Edition
>       - ITK 3.14
>       - CMake 2.6.4
>       - wxWidgets 2.8.9 (wxPack Installer)
>       - Pentium 4
>       - 2GB Ram
>
>
>     _____________________________________
>     Powered by www.kitware.com <http://www.kitware.com>
>
>     Visit other Kitware open-source projects at
>     http://www.kitware.com/opensource/opensource.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
>
>



More information about the Insight-users mailing list