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
// ...
//
}
}
は今...この最後のfor
がsomeBool
がfalseの場合にのみ動作します。プログラムの主要部分を要約します。それが本当であれば、プログラムはでtypename TInputMask::IndexType seed = pIit->GetIndex();
行でクラッシュします。
さらに、for
をif(someBool)
(pIit.reset(&iit);
の直後)に入れても、プログラムはクラッシュしません。
最後に、relabeledImage
をNiftyファイルとして保存すると、ボリュームの各スライドが問題なく表示されます。
アイデア?
おかげで、私はそれが破壊されるイメージとは何かを持っていたと思ったが、私はweak_pointerの問題を知りませんでした。実際には、イテレータの作成、最後の 'for'およびコードの残りの部分(ここには掲載されていません)を含む関数を追加することでこれを解決しました。私はこの関数に 'if'(再ラベル付け)または' else'(オリジナル)の対応するラベルImageを渡します。 – Marco