0

一連の 2D dicom 画像を読みたいです。次に、3D ボリュームとして表示します。そのために、次の手順に従いました。

1- ipp ソーター 2- setfilenames 3- vtkimagechangeinformation

これらの後、vtkimageviewer2 を使用してそれらを視覚化しようとしました。私が書いたほとんどすべてのコードを送ります。画像を読み込んで並べ替えると確信しています。しかし、それは次のようなエラーを出します

ソート成功:0.5

ソート成功:1.5

プログラムは予期せず終了しました。

これが私のコードです:

vtkGDCMImageReader *dicomReader =
vtkGDCMImageReader::New();

std::vector<std::string> filenames;
const char *filename = "/home/telemed/Downloads/Dentascan";

gdcm::Directory d;
d.Load( filename, false);

filenames = d.GetFilenames();

gdcm::IPPSorter s;

s.SetComputeZSpacing( true );

s.SetZSpacingTolerance( 1e-3 );

bool b = s.Sort( filenames );

if( !b )

{

    std::cerr << "Failed to sort:" << "s" << std::endl;

    return 1;

}

std::cout << "Sorting succeeded:" << s.GetZSpacing() << std::endl;

//s.Print( std::cout );

const std::vector<std::string> & sorted = s.GetFilenames();


vtkStringArray *files =vtkStringArray::New();

std::vector< std::string >::const_iterator it = sorted.begin();

for( ; it != sorted.end(); ++it)

{

    const std::string &f = *it;


    files->InsertNextValue( f.c_str() );

}

dicomReader->SetFileNames( files );

//dicomReader->Update();

vtkImageChangeInformation *changer =

vtkImageChangeInformation::New();

changer->SetInputConnection(dicomReader->GetOutputPort());

changer->SetOutputSpacing(VTK_DOUBLE_MAX,VTK_DOUBLE_MAX, 2.0);

changer->Update();


vtkInteractorStyleImage *imageStyle =vtkInteractorStyleImage::New();

vtkRenderWindowInteractor *interactor =vtkRenderWindowInteractor::New();

/ Calculate the center of the volume

dicomReader->GetOutput()->UpdateInformation();
int extent[6];

double spacing[3];

double origin[3];

dicomReader->GetOutput()->GetWholeExtent(extent);

dicomReader->GetOutput()->GetSpacing(spacing);

dicomReader->GetOutput()->GetOrigin(origin);

spacing[2] = 1.5;

vtkImageData* image = vtkImageData ::New();

image->SetSpacing(spacing);

std::cout << "Sorting succeeded:" << spacing[2] << std::endl;

double center[3];

center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]);

center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]);

center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]);

// Matrices for axial, coronal, sagittal, oblique view orientations

static double axialElements[16] = {
    1, 0, 0, center[0],

    0, 1, 0, center[1],

    0, 0, 1, center[2],

    0, 0, 0, 1 };

static double coronalElements[16] = {

    1, 0, 0, center[0],

    0, 0, 1, center[1],

    0,-1, 0, center[2],

    0, 0, 0, 1 };

static double sagittalElements[16] = {

    0, 0,-1, center[0],

    1, 0, 0, center[1],

    0,-1, 0, center[2],

    0, 0, 0, 1 };

// Set the slice orientation

vtkMatrix4x4 *resliceAxes = vtkMatrix4x4::New();

resliceAxes->DeepCopy(coronalElements);


vtkImageReslice *Reslice = vtkImageReslice::New();

Reslice->SetInputConnection(changer->GetOutputPort());

Reslice->SetOutputDimensionality(3);

Reslice->SetResliceAxes(resliceAxes);

Reslice->SetInterpolationModeToLinear();

vtkImageViewer2 *viewer = vtkImageViewer2::New();

viewer->SetupInteractor(interactor);

viewer->SetSize(500,500);

viewer->SetColorWindow(1024);

viewer->SetColorLevel(800);

viewer->SetInputConnection(Reslice->GetOutputPort());

// Create a greyscale lookup table

vtkLookupTable *table = vtkLookupTable::New();

table->SetRange(0, 200); // image intensity range

table->SetValueRange(0.0, 1.0); // from black to white

table->SetSaturationRange(0.0, 0.0); // no color saturation

table->SetRampToLinear();

table->Build();

// Map the image through the lookup table

vtkImageMapToColors *color = vtkImageMapToColors::New();

color->SetLookupTable(table);

color->SetInputConnection(Reslice->GetOutputPort());

// Display the image

vtkImageActor *actor = vtkImageActor::New();

actor->SetInput(color->GetOutput());

vtkRenderer *renderer = vtkRenderer::New();

renderer->AddActor(actor);

vtkRenderWindow *window = vtkRenderWindow::New();

window->AddRenderer(renderer);

interactor->SetInteractorStyle(imageStyle);

window->SetInteractor(interactor);

window->Render();

interactor->Start();

ご協力いただきありがとうございます。

4

2 に答える 2

0

VTK_gdcmorthoplanes を実装してみてください。

于 2013-09-06T10:08:16.310 に答える
0

コードを簡素化し、問題の原因を特定していただけますか。分割統治法を使用します。コードの後半をコメントアウトし、再コンパイルして実行します。

于 2013-02-27T15:27:43.047 に答える