简体   繁体   中英

Segmentation Fault on FloatType Images ITK

I get a segmentation fault when trying to display or apply any filter to an ikt::Image with float pixel types . I can use this same code (swapping the pixel types) to open an image with unsigned char pixel type and it works just fine . Both images I mentioned (the float pixel ones and the unsigned char one) are of type Nifti.

I also have opened the image with ImageIOBase to check the pixel type and its indeed float.

#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkExtractImageFilter.h"
#include "itkImageToVTKImageFilter.h"
#include "vtkImageViewer.h"
#include "vtkImageMapper3D.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkSmartPointer.h"
#include "vtkImageActor.h"
#include "vtkInteractorStyleImage.h"
#include "vtkRenderer.h"
#include "itkRGBPixel.h"
#include <unistd.h>
#include "QuickView.h"
#include <armadillo>
#include "itkBinaryThresholdImageFilter.h"
#include "itkMedianImageFilter.h"



typedef float FloatPixelType;
typedef itk::Image<FloatPixelType,  3> Input3DFloatImageType;
typedef itk::Image<FloatPixelType, 2> FloatImageType;
typedef itk::ImageFileReader< Input3DFloatImageType> Float3DReaderType;
typedef itk::ImageToVTKImageFilter<FloatImageType> FloatConnectorType;
typedef itk::ExtractImageFilter< Input3DFloatImageType, FloatImageType > FloatFilterType;

int main(int argc, char *argv[]){

const char * grayMatterFile = "../../I3T/I3TGM.img";
Float3DReaderType::Pointer floatReader = Float3DReaderType::New();
floatReader->SetFileName( grayMatterFile );

FloatFilterType::Pointer floatFilter = FloatFilterType::New();
floatFilter->SetDirectionCollapseToSubmatrix();
floatFilter->InPlaceOn();
floatReader->UpdateOutputInformation();
Input3DFloatImageType::RegionType floatRegion = floatReader->GetOutput()->GetLargestPossibleRegion();

Input3DFloatImageType::SizeType floatSize = floatRegion.GetSize();
floatSize[1] = 0;
Input3DFloatImageType::IndexType floatIndexStart = floatRegion.GetIndex();

for(int i = 0; floatRegion.GetSize()[1]; i++){
        
        floatIndexStart[1] = i;
        Input3DFloatImageType::RegionType floatDesiredRegion;
        
        floatDesiredRegion.SetSize( floatSize);
        floatDesiredRegion.SetIndex( floatIndexStart);
    
        // Float image
        floatFilter->SetInput( floatReader->GetOutput() );
        floatFilter->SetExtractionRegion( floatDesiredRegion ); 
        floatFilter->Update();
        ShowImage<FloatImageType>(floatFilter->GetOutput());
    
    
    }
}

template<typename TImageType>
void ShowImage(typename TImageType::Pointer image){

    typedef itk::ImageToVTKImageFilter<TImageType> ThisConnectorType;
    typename ThisConnectorType::Pointer connector = ThisConnectorType::New();
    connector->SetInput(image);

    try{
        connector->Update();
     } catch( itk::ExceptionObject & error ) {
        std::cerr << "Error: " << error << std::endl;
        return;
     }


    vtkSmartPointer<vtkImageActor> actor =  vtkSmartPointer<vtkImageActor>::New();

    actor->GetMapper()->SetInputData(connector->GetOutput());

    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->ResetCamera();

    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);

    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New();

    renderWindowInteractor->SetInteractorStyle(style);

    renderWindowInteractor->SetRenderWindow(renderWindow);
    renderWindowInteractor->Initialize();

    renderWindowInteractor->Start();
}

Segmentation fault occurs in line: floatFilter->Update();

You lack floatFilter->Update(); right before ShowImage .

Edit:

Your updated code (with minor modifications) runs on my computer. Your installation of ITK or VTK might be broken. Try running it in debug mode using an IDE, that will show you where is the fault occurring.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM