[Insight-developers] Allocation question

Richard Beare richard.beare at gmail.com
Wed Oct 11 01:15:44 EDT 2006


Hi everyone,

I've sorted out the allocation issues which in turn solved the problem
that arose during termination.

However I'd still be interested to hear whether there is a correct way
of dealing with unwanted images at the end of a pipeline. At the
moment I'm just ignoring it and things seem to work.

On 10/11/06, Richard Beare <richard.beare at gmail.com> wrote:
> Hi,
>
> I've had some more success. It turned out that the problem with null
> masks related to an incorrect dynamic cast in the function that
> returned the mask pointer.
>
> However I still have some other problems that I'm confused about. At
> present the mini pipeline runs, but seg faults on exit in the
> unregister method.
>
> This makes me wonder whether I've done the allocation correctly.
>
> I started using a MakeOutput method, but the only examples I found
> called this from class constructors.
>
> I then used SignedDanielssonDistanceMapImageFilter as a template and
> did setting and ::New calls in my constructor. Is this a reasonable
> way to go?
>
> However I suspect that my problem may be related to correctly
> "sinking" my last mask output.
>
> My meta filter has two inputs - image and mask, and one output. The
> filters in the mini pipeline each have two inputs (image and mask) and
> two outputs (filtered image and updated mask). The mask output from
> the last filter in the mini pipeline isn't connected to anything, and
> I wonder if that matters. Is there a special way of terminating an
> unwanted half of a pipeline, or do I need to write a special filter to
> that doesn't produce two outputs to terminate the mini pipeline?
>
>
>
> On 10/11/06, Richard Beare <richard.beare at gmail.com> wrote:
> > Hi,
> > The output images are different types. I have overriden MakeOutput and
> > attempted to override AllocateOutputs, but didn't have any success.
> > Can you think of any filters that I might use as examples? I haven't
> > found anything yet.
> >
> > On 10/11/06, Miller, James V (GE, Research) <millerjv at crd.ge.com> wrote:
> > > Richard,
> > >
> > > If your output images are different types, then you need to override the
> > > MakeOutput() method to create an image of the appropriate type for the
> > > mask.
> > >
> > > You may also need to override the AllocateOutputs() method to allocate
> > > the pixel data.
> > >
> > > Jim
> > >
> > > -----Original Message-----
> > > From: insight-developers-bounces+millerjv=crd.ge.com at itk.org
> > > [mailto:insight-developers-bounces+millerjv=crd.ge.com at itk.org] On
> > > Behalf Of Richard Beare
> > > Sent: Monday, October 09, 2006 10:05 PM
> > > To: insight-developers at itk.org
> > > Subject: [Insight-developers] Allocation question
> > >
> > > Hi everyone,
> > >
> > > I'm experimenting with a filter that takes two input images and produces
> > > two output images (class A). I'm adapting a threaded filter that uses
> > > two inputs and produces one output. I'm attempting to connect several of
> > > these together in a mini pipeline (class B).
> > >
> > > I'm having a problem causing the allocation of the second mask image to
> > > happen at an appropriate time.
> > >
> > > I have the following methods defined in class A:
> > >
> > > ThreadedGenerateData
> > > GenerateInputRequestedRegion
> > >
> > > I do the following in the constructor:
> > >
> > >   this->SetNumberOfRequiredInputs( 2 );
> > >   this->SetNumberOfRequiredOutputs( 2 );
> > >   this->SetNthOutput( 0, this->MakeOutput( 0 ) );
> > >   this->SetNthOutput( 1, this->MakeOutput( 1 ) );
> > >
> > > and have the following for setting/getting input and output images
> > >
> > >   void SetMaskImage(MaskImageType *input)
> > >      {
> > >      // Process object is not const-correct so the const casting is
> > > required.
> > >      this->SetNthInput( 1, const_cast<TMaskImage *>(input) );
> > >      }
> > >
> > >   /** Get the marker image */
> > >   MaskImageType * GetMaskImage()
> > >     {
> > >     return static_cast<MaskImageType*>(const_cast<DataObject
> > > *>(this->ProcessObject::GetInput(1)));
> > >     }
> > >
> > >
> > >   /** Get the modified mask image */
> > >   MaskImageType * GetOutputMask()
> > > {
> > >    return dynamic_cast<MaskImageType *>(
> > >     this->GetOutput( 1 ) );
> > > }
> > >   /** Get the result image */
> > >   OutputImageType * GetOutputImage()
> > > {
> > >    return dynamic_cast<OutputImageType *>(
> > >     this->GetOutput( 0 ) );
> > > }
> > >
> > > In my mini pipeline filter I have one instance per dimension, connect
> > > the two inputs of each filter to the outputs of the previous filter,
> > > with the first one in the chain being connected to the inputs of the
> > > meta filter.
> > >
> > > My problem is that the GenerateInputRequestedRegion for my class A
> > > filter is reporting that the mask image is null.
> > >
> > > So the question is where to perform the allocation? I've experimented
> > > with AllocateOutputs, and BeforeThreadedGenerateData, but without
> > > success. I've no luck tracking down a sample filter either.
> > >
> > > What is the correct place for this sort of thing to happen?
> > >
> > > Thanks
> > > _______________________________________________
> > > Insight-developers mailing list
> > > Insight-developers at itk.org
> > > http://www.itk.org/mailman/listinfo/insight-developers
> > >
> >
>


More information about the Insight-developers mailing list