-1
浮動小数点ピクセルタイプを持つikt :: Imageにフィルタを表示または適用しようとすると、のセグメント化エラーが発生します。 符号なしのchar型のイメージを開くために同じコード(ピクセルタイプを交換する)を使うことができ、それはちょうど良いで動作します。 私が言及した画像(floatピクセルのものとunsigned charのもの)はどちらもNiftiタイプです。FloatTypeイメージのセグメンテーションフォルトITK
また、ImageIOBaseで画像を開いて、ピクセルタイプとその浮動小数点数を確認しました。
#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();
}
セグメンテーション障害が線で発生:floatFilter->更新();
ありがとうございました!
ありがとうございました!しかし、エラーは持続するようになりました。実際には、追加した行にセグメンテーション違反が発生しました。他のアイデア? –
エラーメッセージは何ですか? ITKはちょうどクラッシュすることはほとんどありませんが、通常はエラーメッセージを出力します。また、コードはコンパイルされません。インクルードと欠落した定義を追加して、問題をコピー&ペーストして再現できますか? –
これはセグメンテーションフォルトとしか言いません。私は、この質問にクラッシュの一部であるコードを追加しました。しかし、以下のリンクで完全なファイルを見ることができます。当時私は多くの異なるものをテストして以来、非常に面倒なコードです。あなたがそれを見ることができるように、単にレポを公開しました。そして、本当にありがとう! https://github.com/bonisthegreat/GrayMatter/blob/master/m0/m0.cxx –