[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