VTK重建CT图像,写入和读取STL格式文件

1 篇文章 0 订阅

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;
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bingo-yy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值