[Insight-users] Segmentation fault when calling itk::KdTree::Search(queryPoint, radius, neighbors)
Bill Lorensen
bill.lorensen at gmail.com
Sun Nov 29 08:27:44 EST 2009
I wonder if itk's kdtree is thread safe. Are you running this on a
multiple processor machine? This could explain why your custom
transform works with registration and not with the resampler...
Bill
On Sun, Nov 29, 2009 at 7:13 AM, motes motes <mort.motes at gmail.com> wrote:
> Ups here is the whole thing:
>
> (gdb) where
> #0 itk::Statistics::KdTree<itk::Statistics::ListSample<itk::Vector<double,
> 3u> > >::NearestNeighborSearchLoop (this=0x1d0cf30, node=0x1d0e1f0,
> query=@0x7f14a4298cf0,
> lowerBound=@0x7f14a4298ac0, upperBound=@0x7f14a4298aa0) at
> /home/mort/local/InsightToolkit-3.14.0/Code/Numerics/Statistics/itkKdTree.h:448
> #1 0x00000000005e4618 in
> itk::Statistics::KdTree<itk::Statistics::ListSample<itk::Vector<double,
> 3u> > >::NearestNeighborSearchLoop (this=0x1d0cf30, node=0x1d0e370,
> query=@0x7f14a4298cf0, lowerBound=@0x7f14a4298ac0,
> upperBound=@0x7f14a4298aa0) at
> /home/mort/local/InsightToolkit-3.14.0/Code/Numerics/Statistics/itkKdTree.txx:312
> #2 0x00000000005e4618 in
> itk::Statistics::KdTree<itk::Statistics::ListSample<itk::Vector<double,
> 3u> > >::NearestNeighborSearchLoop (this=0x1d0cf30, node=0x1d0e3b0,
> query=@0x7f14a4298cf0, lowerBound=@0x7f14a4298ac0,
> upperBound=@0x7f14a4298aa0) at
> /home/mort/local/InsightToolkit-3.14.0/Code/Numerics/Statistics/itkKdTree.txx:312
> #3 0x00000000005e4425 in
> itk::Statistics::KdTree<itk::Statistics::ListSample<itk::Vector<double,
> 3u> > >::NearestNeighborSearchLoop (this=0x1d0cf30, node=0x1d0e7b0,
> query=@0x7f14a4298cf0, lowerBound=@0x7f14a4298ac0,
> upperBound=@0x7f14a4298aa0) at
> /home/mort/local/InsightToolkit-3.14.0/Code/Numerics/Statistics/itkKdTree.txx:291
> #4 0x00000000005e4425 in
> itk::Statistics::KdTree<itk::Statistics::ListSample<itk::Vector<double,
> 3u> > >::NearestNeighborSearchLoop (this=0x1d0cf30, node=0x1d0efb0,
> query=@0x7f14a4298cf0, lowerBound=@0x7f14a4298ac0,
> upperBound=@0x7f14a4298aa0) at
> /home/mort/local/InsightToolkit-3.14.0/Code/Numerics/Statistics/itkKdTree.txx:291
> #5 0x00000000005e4618 in
> itk::Statistics::KdTree<itk::Statistics::ListSample<itk::Vector<double,
> 3u> > >::NearestNeighborSearchLoop (this=0x1d0cf30, node=0x1d0eff0,
> query=@0x7f14a4298cf0, lowerBound=@0x7f14a4298ac0,
> upperBound=@0x7f14a4298aa0) at
> /home/mort/local/InsightToolkit-3.14.0/Code/Numerics/Statistics/itkKdTree.txx:312
> #6 0x00000000006f02eb in
> itk::Statistics::KdTree<itk::Statistics::ListSample<itk::Vector<double,
> 3u> > >::Search (this=0x1d0cf30, query=@0x7f14a4298cf0,
> numberOfNeighborsRequested=<value optimized out>,
> result=@0x7f14a4298cd0) at
> /home/mort/local/InsightToolkit-3.14.0/Code/Numerics/Statistics/itkKdTree.txx:291
> #7 0x00000000006f0a5a in itk::MyDeformableTransform<double, 3u,
> 3u>::TransformPoint (this=0x12322b0, point=<value optimized out>,
> outputPoint=@0x7f14a4298f50,
> weights=<value optimized out>, indices=<value optimized out>,
> inside=<value optimized out>)
> at /home/mort/local/code/registration/my_deformable_transform.cpp:693
> #8 0x00000000005fb9d2 in itk::MyDeformableTransform<double, 3u,
> 3u>::TransformPoint (this=0x12322b0, point=@0x7f14a4298f90)
> at /home/mort/local/code/registration/my_deformable_transform.cpp:778
> #9 0x000000000067ad2f in itk::ResampleImageFilter<itk::Image<float,
> 3u>, itk::Image<float, 3u>, double>::NonlinearThreadedGenerateData
> (this=0x1d11030,
> outputRegionForThread=<value optimized out>, threadId=<value
> optimized out>) at
> /home/mort/local/local/InsightToolkit-3.14.0/Code/BasicFilters/itkResampleImageFilter.txx:257
> #10 0x000000000059f85e in itk::ImageSource<itk::Image<float, 3u>
>>::ThreaderCallback (arg=<value optimized out>)
> at /home/mort/local/InsightToolkit-3.14.0/Code/Common/itkImageSource.txx:292
> #11 0x000000000074eb56 in itk::MultiThreader::SingleMethodProxy
> (arg=0x1d191d8) at
> /home/mort/local/InsightToolkit-3.14.0/Code/Common/itkMultiThreader.cxx:853
> #12 0x00007f14a6f1d3ba in start_thread () from /lib/libpthread.so.0
> #13 0x00007f14a62dbfcd in clone () from /lib/libc.so.6
> #14 0x0000000000000000 in ?? ()
> (gdb)
>
>
> On Sun, Nov 29, 2009 at 1:03 PM, motes motes <mort.motes at gmail.com> wrote:
>> [New Thread 0x7f14a7c5f750 (LWP 4955)]
>> [New Thread 0x7f14a4299950 (LWP 4958)]
>>
>> Program received signal SIGSEGV, Segmentation fault.
>> [Switching to Thread 0x7f14a4299950 (LWP 4958)]
>> itk::Statistics::KdTree<itk::Statistics::ListSample<itk::Vector<double,
>> 3u> > >::NearestNeighborSearchLoop (this=0x1d0cf30, node=0x1d0e1f0,
>> query=@0x7f14a4298cf0,
>> lowerBound=@0x7f14a4298ac0, upperBound=@0x7f14a4298aa0) at
>> /home/mort/local/InsightToolkit-3.14.0/Code/Numerics/Statistics/itkKdTree.h:448
>> 448 if ( m_Distances[i] > farthestDistance )
>> (gdb)
>>
>>
>>
>>
>>
>>
>> On Sun, Nov 29, 2009 at 10:27 AM, Karthik Krishnan
>> <karthik.krishnan at kitware.com> wrote:
>>> If you get a segfault, please post the stack trace using gdb.
>>>
>>> On Sat, Nov 28, 2009 at 5:47 AM, motes motes <mort.motes at gmail.com> wrote:
>>>> I use the following types to create a KdTree:
>>>>
>>>> typedef Vector<TScalarType, SpaceDimension>
>>>> VectorType;
>>>> typedef itk::Statistics::ListSample<VectorType>
>>>> SampleType;
>>>> typedef itk::Statistics::KdTreeGenerator< SampleType >
>>>> TreeGeneratorType;
>>>> typedef typename TreeGeneratorType::KdTreeType
>>>> TreeType;
>>>> typedef typename TreeType::InstanceIdentifierVectorType
>>>> NeighborsType;
>>>>
>>>>
>>>> typename SampleType::Pointer sample = SampleType::New();
>>>> typename TreeGeneratorType::Pointer treeGenerator = TreeGeneratorType::New();;
>>>> typename TreeType::Pointer tree;
>>>>
>>>>
>>>> I create the tree with:
>>>>
>>>> this->sample->SetMeasurementVectorSize(Dimension);
>>>> VectorType mv;
>>>> for (unsigned int i = 0 ; i < 1000 ; ++i ) {
>>>> mv[0] = (float) i;
>>>> mv[1] = (float) ((1000 - i) / 2 );
>>>> mv[2] = (float) ((1000 - i) / 2 );
>>>> sample->PushBack( mv );
>>>> }
>>>>
>>>> treeGenerator->SetSample(sample);
>>>> treeGenerator->SetBucketSize(16);
>>>> treeGenerator->Update();
>>>> tree = treeGenerator->GetOutput();
>>>>
>>>>
>>>>
>>>>
>>>> From the function"TransformPoint" (in a transform I have created) I
>>>> then call the Search method:
>>>>
>>>> NeighborsType neighbors;
>>>> VectorType vectorPoint;
>>>> vectorPoint.Fill(0);
>>>> for (int i=0; i<NDimensions; i++) {
>>>> vectorPoint[i] = point[i];
>>>> }
>>>> tree->Search(vectorPoint, 10.0, neighbors);
>>>>
>>>>
>>>>
>>>>
>>>> But when I run the application I get a segmentation fault. I have
>>>> tried to run the application with Valgrind but I get no error:
>>>>
>>>> valgrind --leak-check=yes --track-origins=yes ./MyApp
>>>> INFO:: Computing registered image
>>>> ==8389==
>>>> ==8389== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 8 from 1)
>>>> ==8389== malloc/free: in use at exit: 0 bytes in 0 blocks.
>>>> ==8389== malloc/free: 13,153,309 allocs, 13,153,309 frees,
>>>> 8,529,290,300 bytes allocated.
>>>> ==8389== For counts of detected errors, rerun with: -v
>>>> ==8389== All heap blocks were freed -- no leaks are possible.
>>>>
>>>>
>>>>
>>>> I am pretty sure that the problem is the dynamic array 'neighbors'. If
>>>> I call the version of Search where the number of neighbors are
>>>> specified I don't get any segmentation fault:
>>>>
>>>>
>>>> NeighborsType neighbors;
>>>> VectorType vectorPoint;
>>>> vectorPoint.Fill(0);
>>>> for (int i=0; i<NDimensions; i++) {
>>>> vectorPoint[i] = point[i];
>>>> }
>>>> unsigned int numberOfNeighbors = 3;
>>>> tree->Search( vectorPoint, numberOfNeighbors, neighbors ) ;
>>>>
>>>> But since I need the version where the radius is specified the above
>>>> is not an option.
>>>>
>>>>
>>>>
>>>> Another thing. The error only occurs when I run a resampling Filter.
>>>> If I run the transform through a registration process it works fine.
>>>> The resampling Filter is created like this:
>>>>
>>>> typedef itk::ResampleImageFilter< FixedImageType, FixedImageType >
>>>> ResampleFilterType;
>>>> typedef itk::LinearInterpolateImageFunction< FixedImageType, double >
>>>> LinearInterpolatorType;
>>>>
>>>> LinearInterpolatorType::Pointer linearInterpolator =
>>>> LinearInterpolatorType::New();
>>>> ResampleFilterType::Pointer resampler = ResampleFilterType::New();
>>>> resampler->SetInput(imageM);
>>>> resampler->SetTransform(adaptiveTransform);
>>>> resampler->SetInterpolator(linearInterpolator);
>>>> resampler->SetOutputOrigin(imageF->GetOrigin());
>>>> resampler->SetOutputSpacing(imageF->GetSpacing());
>>>> resampler->SetSize(imageF->GetLargestPossibleRegion().GetSize());
>>>> resampler->SetDefaultPixelValue(0);
>>>>
>>>>
>>>> try {
>>>>
>>>> resampler->Update();
>>>>
>>>> }
>>>>
>>>> catch( itk::ExceptionObject & err ) {
>>>>
>>>> std::cerr << "ExceptionObject caught !" << std::endl;
>>>>
>>>> std::cerr << err << std::endl;
>>>>
>>>> }
>>>>
>>>>
>>>> Any ideas are most welcome!
>>>> _____________________________________
>>>> Powered by www.kitware.com
>>>>
>>>> Visit other Kitware open-source projects at
>>>> http://www.kitware.com/opensource/opensource.html
>>>>
>>>> Kitware offers ITK Training Courses, for more information visit:
>>>> http://www.kitware.com/products/protraining.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
>>>>
>>>
>>
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.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