[Insight-users] ITK Filter in an Osirix plugin

Quent quentin.bezsilko at gmail.com
Mon May 10 04:04:57 EDT 2010


Hi all,
I'm working on an osirix plugin and I've already succeeded in importing the
data from the Osirix viewer to itk to create an itk::ImportImageFilter
object.
What I need to do now is to create a filter on this importFilter. I've
already tried to create a MeanImageFilter but it simply did not work because
of a segmentation fault caused by a call to a dynamic_cast function. The
problem is I did not call any such function.

After creating the filter, I'll have to bring the pixels from the filter
back to the Osirix viewer and see the modifications made by the filter. For
this part, I know how I will proceed to do it.

I think the ImportImageFiter object works fine because no error was produced
while I was running the program with gdb and without the MeanImageFilter.
Here is the source code :

- (long) filterImage:(NSString*) menuName{
	
       // Duplication of the Osirix viewer 
	ViewerController * new2DViewer = [self duplicateCurrent2DViewerWindow];
	id waitWindow = [viewerController startWaitWindow:@"Essai modification de
l'image"];
		
        // Defining the variables for the ImportFilter
	typedef itk::Image <float, 3> ImageType;
	
	ImageType::RegionType region;
	ImageType::SizeType size;

	double spacing[3];
	
	typedef itk::Image <float, 3> InputImageType;
	typedef itk::Image <float, 3> OutputImageType;
			
	typedef itk::ImportImageFilter <float, 3> ImportFilterType;
	ImportFilterType::Pointer importFilter = ImportFilterType::New();
			
	typedef itk::ImageFileReader <InputImageType> ReaderType;
	typedef itk::ImageFileWriter <ImageType> WriterType;
	
	WriterType::Pointer writer = WriterType::New();
	ReaderType::Pointer reader = ReaderType::New();
	
	NSArray * pixList = [new2DViewer pixList];
	DCMPix * curPix = [pixList objectAtIndex:0];
	
	int height = [curPix pheight];
	int width = [curPix pwidth];
	int depth = [pixList count];
	
	size[0] = width; size[1] = height; size[2] = depth; 
	region.SetSize(size);
			 
	ImageType::IndexType start;
	start.Fill(0);
	region.SetIndex(start);
	
	const unsigned int numberOfPixels = height * width * depth;
	
	double spaceX = [curPix pixelSpacingX];
	double spaceY = [curPix pixelSpacingY];
	double spaceZ = [curPix sliceInterval];
	
	if(spaceZ == 0){
		spaceZ = [curPix sliceThickness];
	}
	
	spacing[0] = spaceX; spacing[1] = spaceY; spacing[2] = spaceZ; 
	
	double ox = [curPix originX];
	double oy = [curPix originY];
	double oz = [curPix originZ];
	
	double origin[3];
	origin[0] = ox; origin[1] = oy; origin[2] = oz;
	
        // Buffer containing the data
	float * localBuffer = new float[numberOfPixels];
	memcpy(localBuffer, [viewerController volumePtr], numberOfPixels);
	
        // After the copy, I need to decrement the pointer
        // It doesn't work if I don't ...
	localBuffer -= numberOfPixels;

	importFilter->SetRegion(region);
	importFilter->SetSpacing(spacing);
	importFilter->SetOrigin(origin);	
	importFilter->SetImportPointer(localBuffer, numberOfPixels, false);
		
        // Creating the ImportFilter	
	try{
		importFilter->Update();
		NSRunCriticalAlertPanel(@"importFilter->Update()", @"OK", nil, nil, nil);
	}
	catch(itk::ExceptionObject & err){
		FILE * fichier = fopen("/Users/u703inserm/Desktop/fichier.txt", "w");
		if(fichier != NULL){
			fputs("Exception ImportFilter", fichier);
			fputs(err.GetDescription(), fichier);
		}
	}
        // Works fine until there
	
        // Here starts the problem
	// Application of a filter : MeanImageFilter (Osirix crashes)
	typedef itk::MeanImageFilter <ImageType, ImageType> FilterType;
	FilterType::Pointer filter = FilterType::New();
	filter->SetInput(importFilter->GetOutput());
	
	try{
		filter->Update();
	}
	catch (itk::ExceptionObject & err) {
		FILE * fichier = fopen("/Users/u703inserm/Desktop/fichier.txt", "w");
		if(fichier != NULL){
			fputs("Exception ImportFilter", fichier);
			fputs(err.GetDescription(), fichier);
		}		
	}

	[new2DViewer endWaitWindow:waitWindow];
	[new2DViewer needsDisplayUpdate];
        return 0;
}

And the error is :

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x6e6b6e4d
0x92cbafe6 in __dynamic_cast ()

I appreciate any help,
Thanks
Quentin

-- 
View this message in context: http://old.nabble.com/ITK-Filter-in-an-Osirix-plugin-tp28508674p28508674.html
Sent from the ITK - Users mailing list archive at Nabble.com.



More information about the Insight-users mailing list