Fwd: [Insight-users] Re: Passing pixel data from or to itk filter
Reinhard Hameeteman
k.hameeteman+maillist at gmail.com
Sun Dec 9 17:55:54 EST 2007
Hi Luis,
Thanks for taking a look.
Let me try to untangle things by reducing it to one method:
I want to pass the output buffer of the itk filter (an itk::Image<
itk::Vector< float, 3>, 3> image) to my application. So the itk filter
is responsible for allocating the buffer, but is told not to
deallocate the buffer when getting out of scope like this:
// create my own image
CustomImageType m_MemberImage.;
// pointer to an aray of 3 floats
vecf3 * pixelPointer;
// get pointer to itk output buffer
pixelPointer = itkFilter->GetOutput()->GetPixelContainer()->GetImportPointer();
// pass the itk buffer to my own application
m_MemberImage.setData( pixelPointer );
// tell itk filter not to destroy the buffer
itkFilter->GetOutput()->GetPixelContainer()->SetContainerManageMemory(false);
This works fine until I want to deallocated the image buffer using:
delete[] pixelPointer;
I've used this method before with itk::Image< short, 3> images and it
worked fine, but now with the vector image my program crashes upon
deleting the buffer.
Sorry for the confusing, I hope this clarifies it a bit.
Reinhard
On Dec 9, 2007 2:37 AM, Luis Ibanez <luis.ibanez at kitware.com> wrote:
>
> Hi Reinhard,
>
>
> I'm afraid that by now,
> your questions are too entangled to address them correctly.
>
>
> Let me rephrase the questions and please correct me if I'm getting
> them wrong.
>
>
> 1) you are running an ITK pipeline and you want the output of the
> pipeline to store its result in a block of memory that you have
> pre-allocated from your application.
>
>
> 2) You want to do this with a filter that produces as output an
> image whose pixel type is Vector<float,3>.
>
>
> 3) You are attempting to use the following method:
>
> m_Filter->GetOutput()->SetRegions(region);
>
> m_Filter->GetOutput()->GetPixelContainer()->SetImportPointer(
> static_cast< OutputPixelType * >( applicationAllocatedBuffer ),
> totalNumberOfPixels, false);
>
> m_Filter->GetOutput()->Allocate( );
>
>
> 4) When you run it, it crashes at the moment of dealocating the
> memory.
>
>
>
> Is that right ?
>
>
> If so, this leads to suspect that
>
>
> A) you have not allocated the right size of memory in your application
>
>
> or
>
>
> B) your assumptions about the organization of the pixel components
> in memory are not correct.
>
>
>
> Please provide a fresh description of the state of your problem.
>
>
> Thanks
>
>
>
> Luis
>
>
>
>
> ---------------------------
>
> Reinhard Hameeteman wrote:
> > To comment on my own questions:
> > The error in the second approach, was due to an invalid pointer the
> > was passed to the itk filter.
> > However the other 2 questions still remain. And since this approach
> > preferable because you allocate the memory once it is needed and not
> > long before that (depending on your filter), I would very much get
> > some comments on those issues.
> > Is someone capable of doing so?
> >
> > Reinhard
> >
> >
> > On Dec 3, 2007 11:50 AM, Reinhard Hameeteman
> > <k.hameeteman+maillist at gmail.com> wrote:
> >
> >>Hi,
> >>
> >>I am experiencing similar problems as described in
> >>http://www.itk.org/pipermail/insight-users/2005-December/016027.html.
> >>I use an itk pipeline within another image processing framework
> >>(MeVisLab). To avoid unnecessary memory copying I want to pass a
> >>pointer to the image data output from a itk filter output to an other
> >>data structure. As Luis described in e.g.
> >>http://www.itk.org/pipermail/insight-users/2007-May/022343.html there
> >>are 2 methods:
> >>1) Mummify the buffer of the output filter
> >>2) Provide the memory buffer to the output filter so when it computes
> >>the output image, it is already stored in the buffer that you
> >>provided.
> >>
> >>Until now, I used method 1 with success. Like this:
> >>CustomDatatType m_MemberImage.;
> >>m_MemberImage.setData(
> >>itkFilter->GetOutput()->GetPixelContainer()->GetImportPointer() );
> >>itkFilter->GetOutput()->GetPixelContainer()->SetContainerManageMemory(false);
> >>
> >>However this only works when I have a scalar voxel type and now I have
> >>created a pipeline that produces a itk::Image< itk::Vector< float, 3
> >>
> >>>, 3> image. The creation of the image and the passing of the pointer
> >>
> >>to my own data structure works fine. But as soon as I try to release
> >>the memory, my program crashes. This does not happen when the voxel
> >>type is of type int which is still unexplained.
> >>
> >>I used the second method as mentioned by Luis like this:
> >>
> >> CustomDatatType m_MemberImage;
> >> // Set size of m_MemberImage and allocate memory
> >>
> >> // Set size of itk output image
> >> region.SetSize( size );
> >> region.SetIndex( start );
> >> itkFilter->GetOutput(1)->SetRegions( region);
> >>
> >> // Set pointer of filter image to allocated data
> >> ItkFilterType::VectorVoxelType * pixelData;
> >> pixelData = static_cast<ItkFilterType::VectorVoxelType* >(
> >>m_MemberImage.getData() );
> >> itkFilter->GetOutput(1)->
> >> GetPixelContainer()->
> >> SetImportPointer(pixelData, m_MemberImage.getSize(), false);
> >>
> >>Using this method, there is still a problem with the vector voxel
> >>typed image. Using an image with int voxels things works fine, but as
> >>soon as the mentioned vector voxel type is used, access violations
> >>occur when the itk filter writes to the output buffer. This suggests
> >>that somehow the size of the buffer or the datatype is not set
> >>correctly. I checked both and they are ok.
> >>
> >>My questions:
> >>- Could someone comment on the difference in deleting a scalar and
> >>vector voxel typed image buffer.
> >>- Is there more generally, any difference in the memory management of
> >>scalar and multiple component voxel typed images?
> >>- Are there any suggestions on where to look for the problem in the
> >>second approach?
> >>
> >>Thanks a lot.
> >>
> >
> > _______________________________________________
> > Insight-users mailing list
> > Insight-users at itk.org
> > http://www.itk.org/mailman/listinfo/insight-users
> >
>
More information about the Insight-users
mailing list