[vtkusers] Issues moving code to a function and returning a smart pointer
David Doria
daviddoria at gmail.com
Mon May 20 09:55:51 EDT 2013
On Fri, May 17, 2013 at 3:43 PM, Manuel Corrales
<manuelcorrales at gmail.com> wrote:
> Hello all. I have a simple code that reads an image using ITK, then it
> convert it to VTK and after that I display the image in a QVTKWidget. The
> code is this and works fine:
>
> typedef itk::Image< double, 2 > ImageType;
> typedef itk::ImageToVTKImageFilter<ImageType> ConnectorType;
> typedef itk::ImageFileReader<ImageType> ReaderType;
>
> ReaderType::Pointer reader = ReaderType::New();
> reader->SetFileName(file.c_str());
> reader->Update();
>
> ConnectorType::Pointer connector = ConnectorType::New();
> connector->SetInput(reader->GetOutput());
> connector->Update();
> ImageReader *myReader = new ImageReader();
> vtkSmartPointer<vtkImageViewer2> vtkImageViewer =
> vtkSmartPointer<vtkImageViewer2>::New();
> vtkImageViewer->SetInput(connector->GetOutput());
> vtkImageViewer->SetRenderWindow(this->qvtkWidget->GetRenderWindow());
> vtkImageViewer->Render();
>
>
> Now if I change this code and create a separate function to perform the
> connection from ITK to VTK, I get a segfault:
>
> ImageReader *myReader = new ImageReader();
> vtkSmartPointer<vtkImageViewer2> vtkImageViewer =
> myReader->renderITKReaderInVTK(file);
> vtkImageViewer->SetRenderWindow(this->qvtkWidget->GetRenderWindow());
> vtkImageViewer->Render();
>
> and the called function:
>
> vtkSmartPointer<vtkImageViewer2>
> ImageReader::renderITKReaderInVTK(std::string fileName) {
> typedef itk::Image< double, 2 > ImageType;
> typedef itk::ImageToVTKImageFilter<ImageType> ConnectorType;
> typedef itk::ImageFileReader<ImageType> ReaderType;
>
> ReaderType::Pointer reader = ReaderType::New();
> qDebug() << "Setting reader file name";
> reader->SetFileName(fileName.c_str());
> qDebug() << "Updating reader";
> reader->Update();
>
> ConnectorType::Pointer connector = ConnectorType::New();
> qDebug() << "Setting input to connector";
> connector->SetInput(reader->GetOutput());
> qDebug() << "Updating connector";
> connector->Update();
>
> vtkSmartPointer<vtkImageViewer2> vtkImageViewer =
> vtkSmartPointer<vtkImageViewer2>::New();
> qDebug() << "Setting connector outupt -> imageViewer input";
> vtkImageViewer->SetInput(connector->GetOutput());
> qDebug() << "Image viewer set up ready";
> return vtkImageViewer;
> }
>
> Any ideas why the same code (I think) works if it is all together but fail
> when it's in a different function?
>
> Thanks in advance!
> Regards,
> Manuel.
It is much easier for us if you provide a compilable example of the
error. I tried the following, but it seems to work fine. If you can
provide something like this that segfaults, I'm sure someone can help
you out.
#include <vtkVersion.h>
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkImageViewer2.h>
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageToVTKImageFilter.h"
vtkSmartPointer<vtkImageViewer2> CreateImageViewer();
int main(int, char *[])
{
typedef itk::Image< double, 2 > ImageType;
typedef itk::ImageToVTKImageFilter<ImageType> ConnectorType;
typedef itk::ImageFileReader<ImageType> ReaderType;
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName("test.png");
reader->Update();
ConnectorType::Pointer connector = ConnectorType::New();
connector->SetInput(reader->GetOutput());
connector->Update();
vtkSmartPointer<vtkImageViewer2> imageViewer = CreateImageViewer();
imageViewer->SetInputData(connector->GetOutput());
imageViewer->Render();
return EXIT_SUCCESS;
}
vtkSmartPointer<vtkImageViewer2> CreateImageViewer()
{
vtkSmartPointer<vtkImageViewer2> imageViewer =
vtkSmartPointer<vtkImageViewer2>::New();
return imageViewer;
}
More information about the vtkusers
mailing list