[Insight-users] native function returning an itk::Image
protein
proteinbme at gmail.com
Mon Sep 1 13:36:02 EDT 2008
Hi Luis,
Thanks! I think my problem is solved!
Best,
yi
2008/8/31 Luis Ibanez <luis.ibanez at kitware.com>:
>
> Hi Protein,
>
>
> In order to keep an ITK image alive when returning it from
> a function, you *MUST* return it as a SmartPointer.
>
> Instead of your current signature:
>
> ImageType* readImg(char* imageFileName);
>
> You should use
>
> ImageType::Pointer readImg(char* imageFileName);
>
>
> In that way the smart pointer will be copied in the stack when
> the function is returning, and that temporary copy wil keep the
> image alive long enough to survive the destruction of data in
> the local scope of the function.
>
> Make sure that the returned variable is assigned to a
> SmartPointer as well.
>
>
> That is, when you call the function do something like:
>
> ImageType::Pointer myImage = readImg("brain.dcm");
>
>
> NOTE: You *do not* need, and you *should not* modify the
> reference counting of ITK images. SmartPointers
> are supposed to do that for you.
>
>
>
> Regards,
>
>
> Luis
>
>
> ---------------
> protein wrote:
>>
>> Hey all,
>>
>> This might be a duplicated question but I really didn't find a answer..
>>
>> Basically my scenario could be described as to write a native function
>> to read a .png file, using an instantiated itk::ImageFileReader<unsigned
>> char>,
>> and return an itk::Image<unsigned char>. How to keep that itk::Image alive
>> after returning from the native function?
>>
>> So in the header file I defined:
>>
>> const unsigned int Dimension = 2;
>> typedef float PixelType;
>> typedef itk::Image< PixelType, Dimension > ImageType;
>> typedef itk::ImageFileReader< ImageType > ImageReaderType;
>>
>> then I declear a function, which takes
>> char* imageFileName as input
>> and
>> output an ImageType*
>>
>> ImageType* readImg(char* imageFileName);
>>
>> the definition readImg function:
>> ImageReaderType reader = ImageReaderType::New();
>> reader->SetFileName(imageFileName);
>> reader->Update();
>> return reader->GetOutput();
>>
>>
>> But when calling this function in main(), by:
>> ImageType::Pointer img = readImg("test.png");
>>
>> I know the reader is destructed when going back to main, thus the
>> there will be error.
>>
>> So I increased the reference count of reader before returning,
>> to keep it alive even after returned from the readImg function, I added:
>> reader->SetReferenceCount(1+reader->GetReferenceCount());
>> before "return reader->GetOutput();"
>>
>> Then in the main, I could use the img.
>>
>> However this seems not that nice to me since reader won't get released....
>>
>>
>> Could anyone tell me in general how to deal with such kind of problems?
>> I really appreciate that!
>>
>> Thanks,
>> Yi
>> _______________________________________________
>> 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