VTK重建CT图像(代码亲测无误)
1.读取数据
2.提取等值面
3.显示结果
一是要有输入源(jpegreader读入的数据)
二是要有相机(camera)
三是要有展示的窗口(window)
#include "vtkAutoInit.h"
#include <vtkSmartPointer.h>
#include <vtkJPEGReader.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkRenderer.h>
#include <vtkStringArray.h>
#include <vtkRenderWindow.h>
#include <vtkContourFilter.h>
#include <vtkPolyDataNormals.h>
#include <vtkStripper.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkSphereSource.h>
#include <vtkSTLWriter.h>
#include <vtkSTLReader.h>
#include <vtkSmoothPolyDataFilter.h>
using namespace std;
void readSTLFile()
{
vtkSmartPointer<vtkRenderer> aRenderer =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renWin =
vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(aRenderer);
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();//设置绘图窗口交互
iren->SetRenderWindow(renWin);
//读取stl格式文件
vtkSmartPointer<vtkSTLReader> vtkReader = vtkSmartPointer<vtkSTLReader>::New();
vtkReader->SetFileName("out.stl");
vtkSmartPointer<vtkPolyDataMapper> skinMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
skinMapper->SetInputConnection(vtkReader->GetOutputPort());//设置输入链接,输出端口获取来自vtkReader的数据
skinMapper->ScalarVisibilityOff(); //这样不会带颜色
vtkSmartPointer<vtkActor> skin =
vtkSmartPointer<vtkActor>::New();
skin->SetMapper(skinMapper);//设置映射器
//设置相机
vtkSmartPointer<vtkCamera> aCamera =
vtkSmartPointer<vtkCamera>::New();
aCamera->SetViewUp(0, 0, -1);//视图
aCamera->SetPosition(0, 1, 0);//位置
aCamera->SetFocalPoint(0, 0, 0);//焦点
aCamera->ComputeViewPlaneNormal()//视图平面法线;
aCamera->Azimuth(30.0);
aCamera->Elevation(30.0);
aCamera->Dolly(1.5);
aRenderer->AddActor(skin);//添加skin对象
aRenderer->SetActiveCamera(aCamera);//设置相机
aRenderer->ResetCamera();//重置相机
aRenderer->SetBackground(.2, .3, .4);//设置背景颜色,double类型
aRenderer->ResetCameraClippingRange();
renWin->Render();
iren->Initialize();
iren->Start();
}
void writeSTLFile() {
vtkSmartPointer<vtkRenderer> aRenderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renWin->AddRenderer(aRenderer);
//读取JPG序列图像
vtkSmartPointer< vtkStringArray > fileArray = vtkSmartPointer< vtkStringArray >::New();
char fileName[128];
for (int i = 1; i < 31; i++)
{
sprintf(fileName, "E:/Users/Desktop/CT_Number/CT_%d.jpeg", i);
std::string fileStr(fileName);
fileArray->InsertNextValue(fileStr);
}
vtkSmartPointer<vtkJPEGReader> jpegReader = vtkSmartPointer<vtkJPEGReader>::New();
jpegReader->SetFileNames(fileArray);
renderWindowInteractor->SetRenderWindow(renWin);
vtkSmartPointer<vtkContourFilter> skinExtractor =
vtkSmartPointer<vtkContourFilter>::New();
skinExtractor->SetInputConnection(jpegReader->GetOutputPort());//设置输入链接,输出端口获取来自jpegReader的数据
skinExtractor->SetValue(10, 200); //值越大,保留的部分越少。
//重新计算法向量
vtkSmartPointer<vtkPolyDataNormals> skinNormals =
vtkSmartPointer<vtkPolyDataNormals>::New();
skinNormals->SetInputConnection(skinExtractor->GetOutputPort());//设置输入链接,输出端口获取来自skinExtractor的数据
skinNormals->SetFeatureAngle(60.0);
//create triangle strips and/or poly-lines 为了更快的显示速度
vtkSmartPointer<vtkStripper> skinStripper =
vtkSmartPointer<vtkStripper>::New();
skinStripper->SetInputConnection(skinNormals->GetOutputPort());//设置输入链接,输出端口获取来自skinNormals的数据
vtkSmartPointer<vtkPolyDataMapper> skinMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
skinMapper->SetInputConnection(skinStripper->GetOutputPort());//设置输入链接,输出端口获取来自skinStripper的数据
skinMapper->SetInputConnection(skinExtractor->GetOutputPort());//设置输入链接,输出端口获取来自skinExtractor的数据
skinMapper->ScalarVisibilityOff(); //这样不会带颜色
vtkSmartPointer<vtkActor> skin =
vtkSmartPointer<vtkActor>::New();
skin->SetMapper(skinMapper);
//写入stl格式
std::string filename = "out.stl";
vtkSmartPointer<vtkSTLWriter> stlWriter =
vtkSmartPointer<vtkSTLWriter>::New();
stlWriter->SetFileName(filename.c_str());
stlWriter->SetInputConnection(skinExtractor->GetOutputPort());
stlWriter->SetFileTypeToBinary();//生成二进制文件,stlWriter默认是ASCII码格式,
//二进制文件可以有效改善stl文件大小
stlWriter->Write();
aRenderer->AddActor(skin);
renderWindowInteractor->Start();
aRenderer->SetBackground(.2, .3, .4);//设置背景颜色
renWin->SetSize(640, 480);//设置窗口大小
renderWindowInteractor->Initialize();
renderWindowInteractor->Start();
}
int main()
{
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
writeSTLFile();
//readSTLFile();
return 0;
}