2016-07-18 4 views
1

Ikt :: Imageの領域を反復処理しています。このImageは、プログラムの入力によって異なる場合があります。Itk:ImageRegionIterator GetIndex()呼び出しによってプログラムsegfaultが作成される

//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 
     // ... 
     // 
    } 
} 

は今...この最後のforsomeBoolがfalseの場合にのみ動作します。プログラムの主要部分を要約します。それが本当であれば、プログラムはでtypename TInputMask::IndexType seed = pIit->GetIndex();行でクラッシュします。

さらに、forif(someBool)pIit.reset(&iit);の直後)に入れても、プログラムはクラッシュしません。

最後に、relabeledImageをNiftyファイルとして保存すると、ボリュームの各スライドが問題なく表示されます。

アイデア?

答えて

1

itk::ImageRegionIterator、など、あなたのrelabeledImageが破壊しまったことをので、その可能性の高い画像

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

に弱いポインタを保持します。もう一つの方法は、条件付きで画像の参照を取ることです。

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! 
+0

おかげで、私はそれが破壊されるイメージとは何かを持っていたと思ったが、私はweak_pointerの問題を知りませんでした。実際には、イテレータの作成、最後の 'for'およびコードの残りの部分(ここには掲載されていません)を含む関数を追加することでこれを解決しました。私はこの関数に 'if'(再ラベル付け)または' else'(オリジナル)の対応するラベルImageを渡します。 – Marco

関連する問題