[ITK-users] Possible missing method in itkImageSource

Joël Schaerer joel.schaerer at laposte.net
Fri Oct 17 12:03:49 EDT 2014


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