-1

DICOM 파일을 VTK를 사용하여 PLY 형식으로 변환하여 .pcd (점군 형식)로 변환하려고합니다. 나는 here 예제를 따랐다.Dicom to .PLY VTK를 사용한 변환

그러나 위의 예에서 코드는 .vtu 형식을 .ply 형식으로 변경해야합니다. 아래에 표시된대로 .dcm 형식을 .ply 형식으로 변환하도록 코드를 변경했습니다. 빌드가 성공했고 exe 파일도 작동하지만 필요한 출력 파일을 작성하지 않습니다. 아무도 내가 잘못한 곳을 지적 할 수 있니?

#include <vtkSmartPointer.h> 
#include <vtkPolyData.h> 
#include <vtkDICOMImageReader.h> 
#include <vtkXMLPolyDataReader.h> 
#include <vtkPLYWriter.h> 

int main(int argc, char *argv[]) 
{ 
    if(argc < 3) 
    { 
    std::cerr << "Required arguments: input.vtp output.ply" << std::endl; 
    return EXIT_FAILURE; 
    } 

    std::string inputFileName = argv[1]; 
    std::string outputFileName = argv[2]; 

    // Read the DICOM file in the specified directory. 
    vtkSmartPointer<vtkDICOMImageReader> reader = 
vtkSmartPointer<vtkDICOMImageReader>::New(); 
    reader->SetFileName(inputFilename.c_str()); 
    reader->Update(); 


    vtkSmartPointer<vtkPLYWriter> writer = vtkSmartPointer<vtkPLYWriter>::New(); 
    writer->SetFileName(outputFileName.c_str()); 
    writer->SetInputConnection(reader->GetOutputPort()); 
    writer->Update(); 

    return EXIT_SUCCESS; 
} 
+0

디버깅 해 보셨습니까? Update()를 호출 한 후 독자 객체는 어떻게 생깁니 까? 데이터가 올바르게로드 된 것처럼 보입니까? – brad

+0

당신은 imagedata, 3D 정규화 된 복셀 격자에로드하고 PLY 또는 polydata를 사용하여 저장하려고합니다. 이것은 구조화되지 않은 점 집합을위한 것입니다! 모든 복셀이 점 집합이되기를 원하십니까? 또는 이미지 강도를 기반으로 특정 세트? 포인트 클라우드로 변환 할 볼륨의 하위 집합을 가져 오는 행진 큐브 필터를 추가 할 것입니다. –

+0

@ g.stevo 예 보셀을 특정 점 집합으로 만들고 싶습니다. 기본적으로 추가 처리를 위해 척추 CT 이미지의 3D 점 구름 모델을 만들고 싶습니다. 행진하는 큐브를 사용하여 DICOM을 포인트 클라우드로 변환하는 방법을 이해하는 데 도움이되는 유용한 자료를 가르쳐 주시겠습니까? – user2521733

답변

0

는 아래는 DICOM 파일 후 PLY 형식 파일로 저장 마칭 큐브 polydata 필터로부터의 가장 큰 면적으로 접속 추출 간단한 윤곽의 일례이다. 귀하의 질문에 대한 대답입니다.

` 
#include <vtkSmartPointer.h> 
#include <vtkPolyData.h> 
#include <vtkDICOMImageReader.h> 
#include "vtkMarchingCubes.h" 
#include "vtkPolyDataConnectivityFilter.h" 
#include <vtkPLYWriter.h> 

int main(int argc, char *argv[]) 
{ 
    if(argc < 3) 
    { 
    std::cerr << "Required arguments: input.dcm output.ply" << std::endl; 
    return EXIT_FAILURE; 
    } 

    std::string inputFileName = argv[1]; 
    std::string outputFileName = argv[2]; 

    // Read the DICOM file in the specified directory. 
    vtkSmartPointer<vtkDICOMImageReader> reader = 
    vtkSmartPointer<vtkDICOMImageReader>::New(); 
    reader->SetFileName(inputFilename.c_str()); 
    reader->Update(); 

    //arb. threshold for bone based on CT Hounsfield Units 
    float isoValue = 400.0 

    vtkSmartPointer<vtkMarchingCubes> surface = vtkSmartPointer<vtkMarchingCubes>::New(); 
    surface->SetInputConnection(reader->GetOutputPort()); 
    surface->ComputeNormalsOn(); 
    surface->SetValue(0, isoValue); 
    surface->Update() 

    // To remain largest region 
    vtkSmartPointer<vtkPolyDataConnectivityFilter> confilter = 
    vtkSmartPointer<vtkPolyDataConnectivityFilter>::New(); 
    confilter->SetInputConnection(surface->GetOutputPort()); 
    confilter->SetExtractionModeToLargestRegion(); 
    confilter->Update(); 

    vtkSmartPointer<vtkPLYWriter> writer = vtkSmartPointer<vtkPLYWriter>::New(); 
    writer->SetFileName(outputFileName.c_str()); 
    writer->SetInputConnection(confilter->GetOutputPort()); 
    writer->Update(); 

    return EXIT_SUCCESS; 
}