[ITK-users] [ITK] Proper chaining of filters

Joël Schaerer joel.schaerer at laposte.net
Thu Oct 2 10:22:24 EDT 2014


Hi Matt,

Thanks for the confirmation. I was thinking there might be another 
mechanism I wasn't aware of.

Joël

On 10/02/2014 04:16 PM, Matt McCormick wrote:
> Hi Joël,
>
> Calling
>
>    temp->SetInput(dilate->GetOutput());
>
> Connects the DataObject generated by dilate to the temp filter.  temp
> does not increment dilate's reference count, and it would be difficult
> to do since the SetInput input is the DataObject, not the
> ProcessObject.
>
> As a consequence, at least one SmartPointer needs to be kept in scope
> as with your second example.
>
> HTH,
> Matt
>
> On Thu, Oct 2, 2014 at 5:33 AM, Joël Schaerer <joel.schaerer at laposte.net> wrote:
>> Hi all,
>>
>> I've noticed a couple times that when building a pipeline with ITK, you need
>> to keep a reference to all filters before the pipeline is updated. This
>> seems a little counter-intuitive to me, so I would like to better understand
>> the issue and see if there is a way around it.
>>
>> As an example, the following code doesn't work:
>>
>>    DilateType::Pointer dilate = DilateType::New();
>>    dilate->SetInput(thresh->GetOutput());
>>    dilate->SetKernel(kernel);
>>
>>    dilate_filters.push_back(dilate);
>>    for (int i=0; i<14; ++i) {
>>      DilateType::Pointer temp = DilateType::New();
>>      temp->SetInput(dilate->GetOutput());
>>      temp->SetKernel(kernel);
>>      dilate = temp;
>>    }
>>    dilate->Update();
>>
>> Regions don't get propagated properly and I get the following exception when
>> writing the output:
>>
>> C++ exception with description
>> "/home/joel/workspace/ITK/Modules/IO/ImageBase/include/itkImageFileWriter.hxx:290:
>> itk::ERROR: ImageFileWriter(0x3130460): Largest possible region does not
>> fully contain requested paste IO regionPaste IO region: ImageIORegion
>> (0x7fff9bb72cc0)
>>    Dimension: 3
>>    Index: 0 0 0
>>    Size: 0 0 0
>> Largest possible region: ImageRegion (0x7fff9bb72bc0)
>>    Dimension: 3
>>    Index: [0, 0, 0]
>>    Size: [0, 0, 0]
>> " thrown in the test body.
>>
>> My guess is that the filters get destroyed before they get a chance to be
>> executed. If I explicitely keep references to each filter, it works:
>>
>>    DilateType::Pointer dilate = DilateType::New();
>>    dilate->SetInput(thresh->GetOutput());
>>    dilate->SetKernel(kernel);
>>    // We need to keep a reference to each filter in the pipeline before it is
>> updated
>>    std::vector<DilateType::Pointer> dilate_filters;
>>    dilate_filters.push_back(dilate);
>>    for (int i=0; i<14; ++i) {
>>      DilateType::Pointer temp = DilateType::New();
>>      temp->SetInput(dilate_filters.back()->GetOutput());
>>      temp->SetKernel(kernel);
>>      dilate = temp;
>>      dilate_filters.push_back(temp);
>>    }
>>    dilate_filters.back()->Update();
>>
>> My question is, why doesn't a filter keep a reference to the previous filter
>> in the pipeline? Is there a way around this?
>>
>> Thanks!
>>
>> Joël
>> _____________________________________
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Kitware offers ITK Training Courses, for more information visit:
>> http://www.kitware.com/products/protraining.php
>>
>> Please keep messages on-topic and check the ITK FAQ at:
>> http://www.itk.org/Wiki/ITK_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://public.kitware.com/mailman/listinfo/insight-users
>> _______________________________________________
>> Community mailing list
>> Community at itk.org
>> http://public.kitware.com/mailman/listinfo/community



More information about the Insight-users mailing list