[VTK]DICOM序列到.stl输出

#define vtkRenderingCore_AUTOINIT 3(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingOpenGL2)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL2)
#include "vtkDICOMImageReader.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkMarchingCubes.h"
#include "vtkStripper.h"
#include "vtkActor.h"
#include "vtkPolyDataMapper.h"
#include "vtkProperty.h"
#include "vtkCamera.h"
#include "vtkBoxWidget.h"
#include "vtkSmartPointer.h" 
#include "vtkTriangleFilter.h"
#include "vtkMassProperties.h"
#include "vtkSmoothPolyDataFilter.h"
#include "vtkPolyDataNormals.h"
#include "vtkContourFilter.h"
#include "vtkRecursiveDividingCubes.h"
#include "vtkSTLWriter.h"

int main(int argc, char* argv[])
{
    std::string filename = "out_Smooth.stl";//设置输出文件路径

    //读取二维切片数据序列
    vtkSmartPointer< vtkDICOMImageReader >reader =
        vtkSmartPointer< vtkDICOMImageReader >::New();
    reader->SetDataByteOrderToLittleEndian();
    reader->SetDirectoryName("COU IV");//设置读取路径

    reader->SetDataSpacing(1.0, 1.0, 1.0);//设置每个体素的大小
    reader->Update();


    //抽取等值面为骨头的信息
    //MC算法
    vtkSmartPointer< vtkMarchingCubes > boneExtractor =
        vtkSmartPointer< vtkMarchingCubes >::New();
    boneExtractor->SetInputConnection(reader->GetOutputPort());
    boneExtractor->SetValue(0, 400); //设置提取的等值信息
    boneExtractor->Update();


    //利用ContourFilter提取等值面
    /*vtkSmartPointer< vtkContourFilter > boneExtractor =
        vtkSmartPointer< vtkContourFilter >::New();
    boneExtractor->SetInputConnection(reader->GetOutputPort());
    boneExtractor->SetValue(0, 200); //设置提取的等值信息
    boneExtractor->Update();*/

    //DC算法   耗时长,模型有明显缝隙
    /*vtkSmartPointer< vtkRecursiveDividingCubes > boneExtractor =
        vtkSmartPointer< vtkRecursiveDividingCubes >::New();
    boneExtractor->SetInputConnection(reader->GetOutputPort());
    boneExtractor->SetValue(500);
    boneExtractor->SetDistance(1);
    boneExtractor->SetIncrement(2);
    boneExtractor->Update();*/



    //剔除旧的或废除的数据单元,提高绘制速度(可略去这一步)
    vtkSmartPointer< vtkStripper > boneStripper =
        vtkSmartPointer< vtkStripper >::New(); //三角带连接
    boneStripper->SetInputConnection(boneExtractor->GetOutputPort());
    boneStripper->Update();

    //平滑滤波
    vtkSmartPointer<vtkSmoothPolyDataFilter> pSmoothPolyDataFilter = vtkSmartPointer<vtkSmoothPolyDataFilter>::New();
    pSmoothPolyDataFilter->SetInputConnection(boneStripper->GetOutputPort());
    //pSmoothPolyDataFilter->SetNumberOfIterations(m_nNumberOfIterations);
    pSmoothPolyDataFilter->SetRelaxationFactor(0.05);

    vtkSmartPointer<vtkPolyDataNormals> pPolyDataNormals = vtkSmartPointer<vtkPolyDataNormals>::New();
    pPolyDataNormals->SetInputConnection(pSmoothPolyDataFilter->GetOutputPort());
    //pPolyDataNormals->SetFeatureAngle(m_nFeatureAngle);


    //将模型输出到入STL文件
    vtkSmartPointer<vtkSTLWriter> stlWriter =
        vtkSmartPointer<vtkSTLWriter>::New();
    stlWriter->SetFileName(filename.c_str());
    stlWriter->SetInputConnection(pPolyDataNormals->GetOutputPort());
    stlWriter->Write();


    //建立映射
    vtkSmartPointer< vtkPolyDataMapper > boneMapper =
        vtkSmartPointer< vtkPolyDataMapper >::New();
    boneMapper->SetInputData(pPolyDataNormals->GetOutput());
    boneMapper->ScalarVisibilityOff();
    //建立角色
    vtkSmartPointer< vtkActor > bone =
        vtkSmartPointer< vtkActor >::New();
    bone->SetMapper(boneMapper);

    bone->GetProperty()->SetDiffuseColor(1.0, 1.0, 1.0);
    bone->GetProperty()->SetSpecular(.3);
    bone->GetProperty()->SetSpecularPower(20);

    //定义绘制器
    vtkSmartPointer< vtkRenderer > aRenderer =
        vtkSmartPointer< vtkRenderer >::New();
    //定义绘制窗口
    vtkSmartPointer< vtkRenderWindow > renWin =
        vtkSmartPointer< vtkRenderWindow >::New();
    renWin->AddRenderer(aRenderer);
    //定义窗口交互器
    vtkSmartPointer< vtkRenderWindowInteractor > iren =
        vtkSmartPointer< vtkRenderWindowInteractor >::New();
    iren->SetRenderWindow(renWin);

    //创建一个camera
    vtkSmartPointer< vtkCamera > aCamera =
        vtkSmartPointer< vtkCamera >::New();
    aCamera->SetViewUp(0, 0, -1);
    aCamera->SetPosition(0, 1, 0);
    aCamera->SetFocalPoint(0, 0, 0);

    aRenderer->AddActor(bone);
    aRenderer->SetActiveCamera(aCamera);
    aRenderer->ResetCamera();
    aCamera->Dolly(1.5);
    aRenderer->SetBackground(0, 0, 0);
    aRenderer->ResetCameraClippingRange();

    //将3D模型渲染到绘制窗口
    iren->Initialize();
    iren->Start();

    return 0;
}

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值