Itk:ImageRegionIterator GetIndex()调用使程序成为segfault

Itk: ImageRegionIterator GetIndex() call makes the program segfault

本文关键字:程序 segfault 调用 ImageRegionIterator GetIndex Itk      更新时间:2023-10-16

我正在Ikt::Image的一个区域上迭代。根据程序的输入,此图像可能会有所不同。总结程序的主要部分:

//inputMask is an input and contains a label image
typedef typename itk::ImageRegionIterator<TInputImage> InputIteratorType;
std::auto_ptr<InputIteratorType> pIit;
if(someBool)
{
    // here I remove some labeled areas, based on some characteristics
    // ...
    // relabeledMask = result of the evaluations
    InputIteratorType iit(relabeledMask, relabeledMask->GetLargestPossibleRegion());
    pIit.reset(&iit);
}
else
{
    InputIteratorType iit(inputMask, inputMask->GetLargestPossibleRegion());
    pIit.reset(&iit);
}
for (pIit->GoToBegin(); !pIit->IsAtEnd(); ++(*pIit))
{
    if (pIit->Value() > 0)
    {
        typename TInputMask::IndexType seed = pIit->GetIndex();
        // remaining part of the program
        // ...
        //
    }
}

现在。。。该最后一个CCD_ 1仅在CCD_。如果是真的,程序在typename TInputMask::IndexType seed = pIit->GetIndex();行与Segmentation fault (core dumped)一起崩溃。

此外,如果我把这个for放在if(someBool)里面(就在pIit.reset(&iit);之后),程序就不会崩溃。

最后要注意的是,如果我将relabeledImage保存为Nifty文件,我可以毫无问题地看到卷的每一张幻灯片。

有什么想法吗?

itk::ImageRegionIterator等,持有指向图像的弱指针

https://itk.org/Doxygen410/html/classitk_1_1WeakPointer.html

因此很可能你的CCD_ 10被破坏了。另一种方法是有条件地参考图像:

TInputImage::Pointer imageToIterate;
if ( /* something */ )
{
    // do stuff
    theFilter->Update();
    imageToIterate = theFilter->GetOutput();
}else
{
    // do other stuff
}
typedef typename itk::ImageRegionIterator<TInputImage> InputIteratorType;
InputIteratorType iit(imageToIterate,imageToIterate->GetLargestPossibleRegion());
// iterate!