[Insight-users] ITK-VTK pipeline connection

itk@stmoser.ch itk at stmoser . ch
Mon, 21 Jul 2003 21:41:50 +0200 (MEST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime at docserver . cac . washington . edu for more info.

--------------000102090503050207000202
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; FORMAT=flowed

Hi

I have done some debugging on the code that Michael posted this morning.
I found out that the extent of the vtkImageData is not correct at the
time when it is accessed. If an update() is done on the image data
itself in:

	// ##### method 1 to get the extent #####
--->	vtkImporter->GetOutput()->Update();
	int *extent = vtkImporter->GetOutput()->GetWholeExtent();

then the extent is updated and correct.

Is this a legitimate workaround? I thought that Update() methods should
only be invoked on filters rather than on the image data itself.

The reason to access the extent data is that in order to run a marching
cube on the data in VTK, the image is extended by one pixel in every
dimension using a vtkConstantPad filter, which requires the extent to
explicitely be set, so interference with the dataflow is inevitable.

Stephan
--------------000102090503050207000202
Content-Type: TEXT/PLAIN; NAME="DebugProject.cxx"
Content-Description: 
Content-Disposition: INLINE; FILENAME="DebugProject.cxx"

#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkMetaImageIO.h"

#include "vtkAIMReader.h"

#include "vtkPNGReader.h"
#include "vtkPointData.h"

#include "itkVTKImageToImageFilter.h"
#include "itkImageToVTKImageFilter.h"

#include "vtkPipelineConnectorITK2VTK.h"
#include "vtkImageConstantPad.h"
#include "vtkMarchingCubes.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderWindow.h"
#include "vtkProperty.h"
#include "vtkRenderer.h"


#include <iostream>

int main(int argc, char** argv) {
	typedef  itk::MetaImageIO MetaReaderType;
	MetaReaderType ::Pointer  metaReader  = MetaReaderType::New();

	typedef unsigned short PixelType;
	typedef itk::Image<PixelType, 3> ImageType;
	typedef itk::ImageFileReader<ImageType> ReaderType;
	typedef itk::ImageFileWriter<ImageType> WriterType;

	ReaderType::Pointer reader = ReaderType::New();
	reader->SetImageIO( metaReader );
	reader->SetFileName("d:\\regProjectData\\MHAs\\brainweb1.mha");
	try {
		reader->Update();
	} catch (itk::ExceptionObject e) {
		cerr << e << endl;
	}
	
	
	// ##### method 1 to connect the pipelines #####
	typedef itk::VTKImageExport<ImageType> ImageExportType;
	ImageExportType::Pointer itkExporter = ImageExportType::New();
	itkExporter->SetInput(reader->GetOutput());
	vtkImageImport* vtkImporter = vtkImageImport::New();  
	vtkPipelineConnectorITK2VTK<ImageExportType, vtkImageImport*>::
		ConnectPipelines(itkExporter, vtkImporter);
	

	/*
	// ##### method 2 to connect the pipelines #####
	typedef itk::ImageToVTKImageFilter<ImageType> ITK2VTKType;
	ITK2VTKType::Pointer vtkImporter = ITK2VTKType::New();
	vtkImporter->SetInput(reader->GetOutput());
	*/


	vtkImageConstantPad *pad = vtkImageConstantPad::New();
	pad->SetInput(vtkImporter->GetOutput());
	

	/*

	// ##### method 1 to get the extent #####
	int *extent = vtkImporter->GetOutput()->GetWholeExtent();

	*/
	

	// ##### method 2 to get the extent #####
	ImageType::SizeType size = 
		reader->GetOutput()->GetBufferedRegion().GetSize();
	int *extent = new int[6];
	extent[0] = 0;
	extent[1] = size[0];
	extent[2] = 0;
	extent[3] = size[1];
	extent[4] = 0;
	extent[5] = size[2];
	

	
	pad->SetOutputWholeExtent(extent[0]-1, extent[1] + 1 , extent[2]-1, 
		extent[3]+1, extent[4]-1, extent[5] +1 );
	pad->SetConstant(0);


	vtkMarchingCubes *mc = vtkMarchingCubes::New();
	mc->SetInput(pad->GetOutput());
	mc->SetValue(0,128);

	vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
	mapper->SetInput(mc->GetOutput());
	mapper->ScalarVisibilityOff();

	vtkActor *actor= vtkActor::New();
	actor->SetMapper(mapper);
	actor->GetProperty()->SetColor(0,1,0);

	vtkRenderer *aRenderer = vtkRenderer::New();
	vtkRenderWindow *renWin = vtkRenderWindow::New();
	renWin->AddRenderer(aRenderer);
	renWin->SetSize(200,200);
	renWin->SetWindowName("MyWindow"); 
	vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
	iren->SetRenderWindow(renWin);
	aRenderer->SetBackground(0.0, 0.0, 1);
	aRenderer->AddActor(actor);
	aRenderer->ResetCamera();
	renWin->Render();
	iren->Start();


	return 0;
}

--------------000102090503050207000202--