[vtkusers] Pass an itkimage::Pointer to a template function in a non template class
Antonin Perrot-Audet
antonin07130 at gmail.com
Wed May 12 11:31:49 EDT 2010
Hello ITK users,
I am facing a problem I guess many of you already solved :
I wrote a non-template class, but I would like this class to accept both
itk images and vtk images.
In order to process the vtk images, I would like to create a template
function within my non template class, that takes an itkimage::Pointer
as input, internally convert it into a vtkimage* and store the vtkimage*
in an array.
It seems like I can't pass the itkimage::Pointer as an argument : If I
try to write the image from within the function (with an itk writer), I
write an empty image (of the good size !).
here is a code example of what I am trying to do :
1) A simplified version of what I want to do :
The version of my function (AddImage) that just writes the images from
the function :
----------------myclass.h------------------
// plenty of other functions
template <typename TitkImage>
void AddImage(typename TitkImage::Pointer iImage)
{
typedef itk::ImageFileWriter<TitkImage> WriterType;
typename WriterType::Pointer itkwriter = WriterType::New();
itkwriter->SetInput(iImage);
itkwriter->SetFileName ("iktout.png");
itkwriter->Update();
itkwriter->Write();
}
-----------------------------------------------
-----------------main.cpp-------------------
int main( )
{
// declare an instance of myclass
typedef itk::Image<unsigned short,2> ImageType;
typedef itk::ImageFileReader<ImageType> itkreaderType;
// setup the itk reader with the correct filename, and update it
myclass->AddImage<ImageType>( itkreader->GetOutput() );
return 0;
}
-----------------------------------------------
2) what I actually want to do :
The version of myclass that imports an itkimage converts it as a vtk
image and store it somewhere in myclass, main.cpp is the same as in 1)
----------------myclass.h-----------------
// non template class definition and heritage
// non template members and functions ...
template <typename TitkImage>
void AddImage(typename TitkImage::Pointer iImage, std::string
iImageName ="")
{
typedef itk::ImageToVTKImageFilter<TitkImage> ConnectorType;
typename ConnectorType::Pointer itkvtkConnector = ConnectorType::New();
itkvtkConnector->SetInput(iImage);
try
{
itkvtkConnector->Update();
}
catch( itk::ExceptionObject & exp )
{
std::cerr << exp << std::endl;
}
AddImage( itkvtkConnector->GetOutput() ); // call the other
importer of myclass
}
void AddImage(vtkImageData* iImage); // a function that stores a
vtkImageData* into an array
// other stuff ....
-----------------------------------------------
I have already looked at :
http://old.nabble.com/Smart-pointers-as-function-argument-ts26375719.html#a26375719
but it doesn't answer my problem, as the itkimage is already bad inside
my function.
The weird thing is that if I print it from my function, it prints that
the image is a 2D image, of correct dimensions, and of unsigned char
pixel type.
Well, if someone has an idea, that would help a lot !
Thanks a lot,
Antonin.
PS: As soon as I am done with that thing, I will write a small script to
build itk's nightly every night.
More information about the vtkusers
mailing list