<div dir="ltr"><div>I'm writing a multiple thread version of a custom filter. It uses a ROI filter to extract a 3x3x3 region of the input image. The center of this ROI is moved through the input image in a loop. If I run the code with a single thread, it works correctly. If I use more threads I get segmentation fault after the first iteration, i.e. when I reuse the ROI filter. </div>

<div><br></div><div>I've tried using a different instance of the ROI filter at each iteration, saving the output of the filter to an image and calling DisconnectPipeline, calling Modified(), Update(), UpdateLargestPossibleRegion(), replacing the ROI filter with an Extract Image filter, but none of this worked. What am I doing wrong? I'm using ITK 4.2</div>

<div><br></div><div><br></div><div>template<class TImage></div><div>void myFilter<TImage></div><div>::ThreadedGenerateData(const typename Superclass::OutputImageRegionType& outputRegionForThread, ThreadIdType threadId)</div>

<div>{</div><div>  typename TImage::ConstPointer input = this->GetInput();</div><div>  typename TImage::Pointer output = this->GetOutput();</div><div>  typedef typename itk::RegionOfInterestFilter<TImage, TImage> roiType;    </div>

<div><br></div><div>  typename roiType::Pointer roi = roiType::New();</div><div>  roi->SetInput(input);</div><div>  </div><div>  typename TImage::RegionType window;</div><div>  typename TImage::RegionType::SizeType size;</div>

<div>  size.Fill(3); //window size=3x3x3</div><div>  window.SetSize(size);</div><div>  typename TImage::IndexType pi; //pixel index</div><div><br></div><div>  itk::ImageRegionIteratorWithIndex<TImage> out(output, outputRegionForThread);</div>

<div><br></div><div>  // typename TImage::Pointer buffer;</div><div><br></div><div>  for(; !out.IsAtEnd(); ++out)</div><div>  {</div><div>    pi = out.GetIndex();</div><div><br></div><div>    window.SetIndex(0, pi[0]-1);</div>

<div>    window.SetIndex(1, pi[1]-1);</div><div>    window.SetIndex(2, pi[2]-1);</div><div><br></div><div>    if ( outputRegionForThread.IsInside( window ) )</div><div>    {</div><div>      try</div><div>      {</div><div>

        // typename roiType::Pointer roi = roiType::New();</div><div>        roi->SetInput(input);</div><div>        roi->SetExtractionRegion(window);</div><div>        // roi->SetNumberOfThreads(1);</div><div>        // roi->Modified();</div>

<div>        roi->Update();</div><div>        // roi->UpdateLargestPossibleRegion();</div><div>        // roi->Update();</div><div>        // buffer = roi->GetOutput();</div><div>        // buffer->Update();</div>

<div>        // buffer->DisconnectPipeline();</div><div>      }</div><div>      catch( itk::ExceptionObject & err )</div><div>      {</div><div>        std::cerr << "ExceptionObject caught !" << std::endl;</div>

<div>        std::cerr << err << std::endl;</div><div>        return;</div><div>      }</div><div>    }</div><div>  }</div><div>}</div><div><br></div><div><br></div><div>-- </div><div>Andrea </div><div><br></div>

-- <br><div dir="ltr"><div>Andrea Valsecchi</div><div><br></div><div>Postdoctoral Researcher<br></div><div>European Centre for Soft Computing</div><div><br></div><div>Edificio de Investigación</div><div>Calle Gonzalo Gutiérrez Quirós s/n </div>

<div>33600 Mieres, Asturias, Spain</div><div><br></div><div>Telephone: +34 985456545</div><div>Fax: +34 985456699</div><div>Email: <a href="mailto:andrea.valsecchi@softcomputing.es" target="_blank">andrea.valsecchi@softcomputing.es</a></div>

<div>Web: <a href="http://www.softcomputing.es" target="_blank">http://www.softcomputing.es</a></div><div><br></div></div>
</div>