Itk: ImageRegionIterator GetIndex() 调用使程序出现段错误

Itk: ImageRegionIterator GetIndex() call makes the program segfault

我正在遍历 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
        // ...
        //
    }
}

现在...最后一个 for 仅在 someBool 为假时有效。如果为真,程序将在 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

因此您的 relabeledImage 很可能被破坏了。另一种方法是有条件地引用图像:

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!