2013-01-25 13 views
0

일련의 2D dicom 이미지를 읽고 싶습니다. 그런 다음 3D 볼륨으로 표시합니다. 이를 위해, I는이 단계를 따랐다볼륨 렌더링을위한 vtkgdcmimagereader

1- IPP 소터 2- setfilenames -3- vtkimagechangeinformation이 후

, I는 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(); 

감사 :

여기 내 코드입니다.

답변

0

코드를 단순화하고 문제의 출처를 확인할 수 있습니까? 분할 및 정복 방식을 사용하십시오. 후반부에 코드를 주석 처리하고, 다시 컴파일하고 실행하십시오.

0

VTK_gdcmorthoplanes를 구현 해보십시오.