三维重建学习记录2-将CT数据集转化为三维模型

三维重建学习记录2-将CT数据集转化为三维模型软件:VS2017+VTK8.2
先上代码:
1#define vtkRenderingCore_AUTOINIT 3(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingOpenGL2)
2#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL2)
3 #include "vtkDICOMImageReader.h"
4 #include "vtkRenderWindowInteractor.h"
5 #include "vtkRenderer.h"
6 #include "vtkRenderWindow.h"
7 #include "vtkMarchingCubes.h"
8 #include "vtkStripper.h"
蓝牙定位系统9 #include "vtkActor.h"
10 #include "vtkPolyDataMapper.h"
11 #include "vtkProperty.h"
12 #include "vtkCamera.h"
13 #include "vtkBoxWidget.h"
14 #include "vtkSmartPointer.h"
15 #include "vtkTriangleFilter.h"
16 #include "vtkMassProperties.h"
17 #include "vtkSmoothPolyDataFilter.h"
18 #include "vtkPolyDataNormals.h"
19 #include "vtkContourFilter.h"
20 #include "vtkRecursiveDividingCubes.h"
21 #include "vtkSTLWriter.h"
22
23int main(int argc, char* argv[])
24 {
25    std::string filename = "out_Smooth.stl";//设置输出⽂件路径
26
简易淋浴器
27//读取⼆维切⽚数据序列
28    vtkSmartPointer< vtkDICOMImageReader >reader =
29        vtkSmartPointer< vtkDICOMImageReader >::New();
30    reader->SetDataByteOrderToLittleEndian();
31    reader->SetDirectoryName("E://dicomimage");//设置读取路径
32
33    reader->SetDataSpacing(1.0, 1.0, 1.0);//设置每个体素的⼤⼩
34    reader->Update();
35
36
37//抽取等值⾯为⾻头的信息
38//MC算法
39    vtkSmartPointer< vtkMarchingCubes > boneExtractor =
40        vtkSmartPointer< vtkMarchingCubes >::New();
41    boneExtractor->SetInputConnection(reader->GetOutputPort());
42    boneExtractor->SetValue(0, 400); //设置提取的等值信息
43    boneExtractor->Update();
44
45
46//利⽤ContourFilter提取等值⾯
47/*vtkSmartPointer< vtkContourFilter > boneExtractor =
48        vtkSmartPointer< vtkContourFilter >::New();
49    boneExtractor->SetInputConnection(reader->GetOutputPort());
50    boneExtractor->SetValue(0, 200); //设置提取的等值信息
51    boneExtractor->Update();*/
52
53//DC算法耗时长,模型有明显缝隙
54/*vtkSmartPointer< vtkRecursiveDividingCubes > boneExtractor =
55        vtkSmartPointer< vtkRecursiveDividingCubes >::New();
56    boneExtractor->SetInputConnection(reader->GetOutputPort());
57    boneExtractor->SetValue(500);
58    boneExtractor->SetDistance(1);
59    boneExtractor->SetIncrement(2);
60    boneExtractor->Update();*/
61
62
63
64//剔除旧的或废除的数据单元,提⾼绘制速度(可略去这⼀步)
65    vtkSmartPointer< vtkStripper > boneStripper =
66        vtkSmartPointer< vtkStripper >::New(); //三⾓带连接
67    boneStripper->SetInputConnection(boneExtractor->GetOutputPort());
68    boneStripper->Update();
69
70//平滑滤波
71    vtkSmartPointer<vtkSmoothPolyDataFilter> pSmoothPolyDataFilter = vtkSmartPointer<vtkSmoothPolyDataFilter>::New();
72    pSmoothPolyDataFilter->SetInputConnection(boneStripper->GetOutputPort());
73//pSmoothPolyDataFilter->SetNumberOfIterations(m_nNumberOfIterations);
74    pSmoothPolyDataFilter->SetRelaxationFactor(0.05);
75
76    vtkSmartPointer<vtkPolyDataNormals> pPolyDataNormals = vtkSmartPointer<vtkPolyDataNormals>::New();耳塞棉
77    pPolyDataNormals->SetInputConnection(pSmoothPolyDataFilter->GetOutputPort());
78//pPolyDataNormals->SetFeatureAngle(m_nFeatureAngle);
79
80
81//将模型输出到⼊STL⽂件
82    vtkSmartPointer<vtkSTLWriter> stlWriter =
83        vtkSmartPointer<vtkSTLWriter>::New();
84    stlWriter->SetFileName(filename.c_str());
85    stlWriter->SetInputConnection(pPolyDataNormals->GetOutputPort());橄榄采摘机
飞盘制作
86    stlWriter->Write();
87
88
89//建⽴映射
90    vtkSmartPointer< vtkPolyDataMapper > boneMapper =
91        vtkSmartPointer< vtkPolyDataMapper >::New();
92    boneMapper->SetInputData(pPolyDataNormals->GetOutput());
93    boneMapper->ScalarVisibilityOff();
94//建⽴⾓⾊
95    vtkSmartPointer< vtkActor > bone =
96        vtkSmartPointer< vtkActor >::New();
97    bone->SetMapper(boneMapper);
98
99    bone->GetProperty()->SetDiffuseColor(1.0, 1.0, 1.0);
100    bone->GetProperty()->SetSpecular(.3);
101    bone->GetProperty()->SetSpecularPower(20);
102
103//定义绘制器
104    vtkSmartPointer< vtkRenderer > aRenderer =
105        vtkSmartPointer< vtkRenderer >::New();
106//定义绘制窗⼝
107    vtkSmartPointer< vtkRenderWindow > renWin =
108        vtkSmartPointer< vtkRenderWindow >::New();
109    renWin->AddRenderer(aRenderer);
110//定义窗⼝交互器
111    vtkSmartPointer< vtkRenderWindowInteractor > iren =
112        vtkSmartPointer< vtkRenderWindowInteractor >::New();
113    iren->SetRenderWindow(renWin);
114液化气燃烧器
115//创建⼀个camera
116    vtkSmartPointer< vtkCamera > aCamera =
117        vtkSmartPointer< vtkCamera >::New();
118    aCamera->SetViewUp(0, 0, -1);
119    aCamera->SetPosition(0, 1, 0);
120    aCamera->SetFocalPoint(0, 0, 0);
121
122    aRenderer->AddActor(bone);
123    aRenderer->SetActiveCamera(aCamera);
124    aRenderer->ResetCamera();
125    aCamera->Dolly(1.5);
126    aRenderer->SetBackground(0, 0, 0);
127    aRenderer->ResetCameraClippingRange();
128
129//将3D模型渲染到绘制窗⼝
130    iren->Initialize();
131    iren->Start();
132
133return0;
134 }
View Code
注:运⾏后笔记本要等⼏分钟,等待渲染完成。运⾏时内存和CPU实时曲线⼀直在变。⽽且路径⾥的⽂件要全部是满⾜要求的CT图,不然会报错。
效果图:(显⽰的是断⾻CT图重建效果)

本文发布于:2024-09-20 19:58:20,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/313751.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:模型   设置   绘制   数据   等值   渲染   提取   信息
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议