[ITK-users] Possible missing method in itkImageSource
Joël Schaerer
joel.schaerer at laposte.net
Wed Jan 7 05:36:53 EST 2015
Any plans on fixing this? I've run into this issue again when attempting
a DisconnectPipeline() on a named output. It crashes because the
SetOutput() method attempts to create a new output after detaching the
old one using the faulty MakeOutput(key) method:
0x000000000063a3dc in itk::ProcessObject::SetOutput (this=0x1b2e060,
name=..., output=<optimized out>) at
../Modules/Core/Common/src/itkProcessObject.cxx:484
483 DataObjectPointer newOutput = this->MakeOutput(key);
484 this->SetOutput(key, newOutput); // Segfault
Thanks,
Joël
On 22/10/2014 15:44, Bradley Lowekamp wrote:
> Hello,
>
> I'm going to take a look at this issue.
>
> Brad
>
> On Oct 17, 2014, at 5:01 PM, Jim Miller <millerjv at gmail.com> wrote:
>
>> At first glance it looks like an oversight. I would expect, however, that we should be seeing warnings about the named version of MakeOutput in ProcessObject being hidden.
>>
>> Jim
>>
>>> On Oct 17, 2014, at 12:03 PM, Joël Schaerer <joel.schaerer at laposte.net> wrote:
>>>
>>> Hi all,
>>>
>>> I've run into a problem with named outputs, which I believe could be a bug in ITK.
>>>
>>> When using named outputs, one is supposed to create the output data objects in the constructor using the MakeOutput method (see http://www.itk.org/Wiki/ITK/Examples/Developer/ImageFilterMultipleOutputs for an example). The MakeOutput method exists for both indexed and named outputs.
>>> .
>>> These methods are declared and defined first in itkProcessObject:
>>>
>>> .h:
>>> * ...
>>> * ProcessObject::MakeOutput. Note that MakeOutput always returns a
>>> * itkSmartPointer to a DataObject. ImageSource and MeshSource override
>>> * this method to create the correct type of image and mesh respectively.
>>> * If a filter has multiple outputs of different types, then that
>>> * filter must provide an implementation of MakeOutput(). */
>>> virtual DataObjectPointer MakeOutput( const DataObjectIdentifierType & );
>>> virtual DataObjectPointer MakeOutput(DataObjectPointerArraySizeType idx);
>>>
>>> .cxx
>>> DataObject::Pointer
>>> ProcessObject
>>> ::MakeOutput( const DataObjectIdentifierType & name )
>>> {
>>> itkDebugMacro("MakeOutput(" << name << ")");
>>> if( this->IsIndexedOutputName(name) )
>>> {
>>> return this->MakeOutput( this->MakeIndexFromOutputName(name) );
>>> }
>>> return static_cast<DataObject *>(DataObject::New().GetPointer());
>>> }
>>>
>>> DataObject::Pointer
>>> ProcessObject
>>> ::MakeOutput(DataObjectPointerArraySizeType)
>>> {
>>> return static_cast<DataObject *>(DataObject::New().GetPointer());
>>> }
>>>
>>>
>>> For indexed outputs, it is redefined in ImageSource in order to create an image object of the correct type.
>>>
>>> template< typename TOutputImage >
>>> ProcessObject::DataObjectPointer
>>> ImageSource< TOutputImage >
>>> ::MakeOutput(ProcessObject::DataObjectPointerArraySizeType)
>>> {
>>> return TOutputImage::New().GetPointer();
>>> }
>>>
>>> So far, so good. However, the named output version of MakeOutput is not redefined in ImageSource, contrary to what the comment in itkProcessObject.h says. And so if someone tries to use it in an ImageToImageFilter, it will crash.
>>>
>>> Any reason for this behavior? Is this an oversight?
>>>
>>> Thanks,
>>>
>>> Joël
>>> _____________________________________
>>>
More information about the Insight-users
mailing list