VTK实现三维模型的导出保存,STL、OBJ和PLY等格式

基于之前的博客中实现的三维模型,将其导出保存为3D格式的文件,生成的文件可以使用通用的3D浏览器进行查看。附录的代码实现中各变量的命名使用可以查照之前的博客。

1.STL 保存

STL 文件格式,最早由美国的一家公司提出,是计算机实现三维数据打印的 一种通用格式文件。由于该格式文件存储方式简单,具有规范的接口格式,是现 阶段快速成型系统中被应用最多的一种标准文件格式,可以说市面上对其的应用 是十分广泛的,尤其是在医学影像和文物保护领域。STL 文件是通过很多小三角 形面片进行堆积来实现三维模型表面的构造的一种数据模型。但 STL 格式也存 在着一些不足,即它只能面熟三维结构模型的几何数据信息,文件的格式相对而 言简单,并不支持颜色和材质等详细信息。
在 VTK 中,STL 格式属于 vtkPoIyData 类型的文件格式。相关读写操作封 装在 vtkSTLReader 和 vtkSTLWriter 中。系统在完成对 DICOM 序列图像的三维 重建后,调用并实例化 vtkSTLWriter 类,创建该类的智能指针,通过类中的静 态函数 SetFileName()对写出文件命名,SetInputConnection()函数获取要写出的文 件数据,Write()和 Update()函数来实现最后的写出和状态更新,从而完成重建模 型的 STL 格式保存。
具体代码实现:

void NewWindow::exportSTL()   //导出为STL格式
{
   //获取保存路径
   QDir dir;
   QString file_path = QFileDialog::getSaveFileName(this, nullptr, "D:\\Bishe\\Project\\QtGuiApplication1", ".stl");
   if (file_path.isEmpty() == true) return;

   // 支持带中文路径的读取
   QByteArray ba = file_path.toLocal8Bit();
   const char* file_path_str = ba.data();

   QString file_path_str_q;
   file_path_str_q = file_path_str;
   ui->text_output->append(" File:\n" + file_path_str_q);//输出路径

   //减少三角网格
   vtkSmartPointer<vtkTriangleFilter> stlFilter = vtkSmartPointer<vtkTriangleFilter>::New();//对polyData处理
   stlFilter->SetInputData(this->polyData);

   //写出为STL格式
   vtkSmartPointer<vtkSTLWriter> stlWriter = vtkSmartPointer<vtkSTLWriter>::New();
   stlWriter->SetFileName(file_path_str);
   stlWriter->SetInputConnection(stlFilter->GetOutputPort());
   stlWriter->Write();
   stlWriter->Update();

}

2.OBJ保存

OBJ 文件格式,主要支持静态多边形模型,是一种标准 3D 模型文件格式。 在现阶段,市面上绝大部分知名的 3D 软件都支持对 OBJ 格式文件的相关读写, 因此是现阶段中最受欢迎的的文件格式。不过 OBJ 文件格式不足在于不能包含 动画、材质特性和动力学等信息,这方面是不如 PLY 文件格式。
在 VTK 中,OBJ 格式属于 VTKPoIyData 类型的文件格式。不同 STL 的读 写类,在 VTK 类库中,8.0 版本之前是通过 vtkOBJExporter 类来完成文件的写, 在 8.0 版本之后加入了 vtkOBJWriter 类,本系统开发则是基于 vtkOBJExporter 类实现。在 vtkOBJExporter 类中的文件写出不同 vtkOBJWriter 类对于单模型文 件数据的写,而是对场景的导出和写。系统在完成对 DICOM 序列图像的三维重 建后,调用并实例化 vtkOBJExporter 类,创建该类的智能指针,通过类中的静态 函数 SetFileName()对写出文件命名,SetInputConnection()函数获取要写出的文件 数据,Write()和 Update()函数来实现最后的写出和状态更新,从而完成重建模型 的 OBJ 格式保存。

void NewWindow::exportOBJ()   //导出为OBJ格式
{
   //获取保存路径
   QDir dir;
   QString file_path = QFileDialog::getSaveFileName(this, nullptr, "D:\\Bishe\\Project\\QtGuiApplication1", ".obj");
   if (file_path.isEmpty() == true) return;

   // 支持带中文路径的读取
   QByteArray ba = file_path.toLocal8Bit();
   const char* file_path_str = ba.data();

   QString file_path_str_q;
   file_path_str_q = file_path_str;
   ui->text_output->append(" File:\n" + file_path_str_q);

   vtkSmartPointer<vtkTriangleFilter> stlFilter = vtkSmartPointer<vtkTriangleFilter>::New();
   stlFilter->SetInputData(this->polyData);

   //写出为OBJ格式
   vtkSmartPointer<vtkOBJWriter> porter = vtkSmartPointer<vtkOBJWriter>::New();
   porter->SetFileName(file_path_str);
   porter->SetInputConnection(stlFilter->GetOutputPort());
   porter->Write();
   porter->Update();
}

3.PLY保存

PLY 文件格式,也可以理解为是指一种静态的多边形模型,是一种电脑档 案的格式。基于 OBJ 文件格式的基础,它对其有着进一步的改进优化,改进对 群组和任意属性了难以扩充的极大不足问题,并在此基础上提出了两个新的关键 词,“property”和“element”,从而实现了对“群组、点、面和资讯”等概念的 一个概括性表述。PLY 文件格式,不仅可以存储了通过对三维模型进行扫面获 得的一些关于模型的三维数值,同时也可以存储关于模型的颜色、透明度和表面 法向量等数据信息。在数据储存上,PLY 格式文件有着二元码和 ACSII 码两种 版本,版本之间也存在着很大差异。
PLY 格式文件则与 STL 格式相似,相关读写操作封装在 vtkPLYReader 和 vtkPLYWriter 中。系统在完成对 DICOM 序列图像的三维重建后,调用并实例化 vtkPLYWriter 类,创建该类的智能指针,通过类中的静态函数 SetFileName()对 写出文件命名,SetInputConnection()函数获取要写出的文件数据,Write()和 Update()函数来实现最后的写出和状态更新,从而完成重建模型的 PLY 格式保 存。

void NewWindow::exportPLY()   //导出为PLY格式
{
   //获取保存路径
   QDir dir;
   QString file_path = QFileDialog::getSaveFileName(this, nullptr, "D:\\Bishe\\Project\\QtGuiApplication1", ".ply");
   if (file_path.isEmpty() == true) return;

   // 支持带中文路径的读取
   QByteArray ba = file_path.toLocal8Bit();
   const char* file_path_str = ba.data();

   QString file_path_str_q;
   file_path_str_q = file_path_str;
   ui->text_output->append(" File:\n" + file_path_str_q);

   vtkSmartPointer<vtkTriangleFilter> stlFilter = vtkSmartPointer<vtkTriangleFilter>::New();
   stlFilter->SetInputData(this->polyData);

   //写出为PLY格式文件
   vtkSmartPointer<vtkPLYWriter>  plywriter = vtkSmartPointer<vtkPLYWriter>::New();
   plywriter->SetFileName(file_path_str);
   plywriter->SetInputConnection(stlFilter->GetOutputPort());
   plywriter->Write();
   plywriter->Update();
}

4.导出测试

在程序完成对 DICOM 序列图像的三维重建后,将重建后的模型导出并保存 为相应 3D 格式,导出文件具体如图 :
在这里插入图片描述
根据上图中导出保存文件格式和文件数据大小可知,在同一导出格式,针对 不同 DICOM 序列图像文件重建后的模型数据大小不一样,如图中 456.obj 和 781.obj;针对同一 DICOM 序列图像文件选择不同导出格式后导出的三维图像文 件的数据大小也不一样,如图中 123.stl、456.obj 和 951.ply。总结下来可得出结 论,DICOM 序列图像文件数据越大,重建的模型数据就越大;导出为 PLY 格式 文件所需存储空间最小,导出为 STL 格式文件导出所需存储空间次之,导出为 OBJ 格式文件所需存储空间最大。

5.总结

对比几种导出的实现可以知道,使用VTK自带的函数实现对三维模型的导出保存基本流程是相同的,最大的不同就是使用的函数不同而已。VTK实现三维模型导出保存也不止以上几种格式,具体可以根据自己需求实现。

额外补充一点,以上导出的三维模型皆是面绘制实现的三维模型,针对体绘制实现的三维模型由于数据量加大,使用自带的函数是无法实现导出的,我在之前查阅资料过程中看见有人说需要自己重写相关函数,不过由于工作量较大就没有具体实现。

  • 1
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【资源介绍】 基于Qt和VTK实现CT三维重建项目c++源码+项目说明.zip 该项目是个人毕设项目,答辩评审分达到95分,代码都经过调试测试,确保可以运行!欢迎下载使用,可用于小白学习、进阶。 该资源主要针对计算机、通信、人工智能、自动化等相关专业的学生、老师或从业者下载使用,亦可作为期末课程设计、课程大作业、毕业设计等。 项目整体具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现不同的功能。 项目进度记录 1、解决了内存问题 2、从切片上拾取点并计算在三维空间中的坐标 3、三维点标记 4、三维空间点的增删,设计测量模式的UI 5、添加了表格的数据增删 6、调试二次加载的BUG(添加重置功能) 7、裁剪功能的图像导入与滑条索引 8、优化:测量数据不可编辑 9、路径编码问题 10、实现裁剪功能(需要OpenCV) 11、增加导出裁剪图像时显示进度条的功能,由于VTK图像读取在内部完成,实现进度条功能相对复杂,暂未实现。 12、裸数据(二进制)裁剪 13、三维切面默认不显示 14、背景默认为黑色 15、bin文件读取增加自动读取config文件,确定宽高参数 16、裁剪后可直接读入到三维体绘制中,仍保留裁剪后保存的功能 17、三维体绘制的切面改为半透明 18、经测试,裁剪后读入(内存读入)出现了内存泄漏的问题,获取每一层的指针,解决了这个问题 19、解决进度条出现了假死的情况 20、解决选择文件夹为空的崩溃问题 21、实现对话框裁剪序列图像 22、在MainWindow中声明CropSequenceDialog为友元类,CropSequenceDialog则可以直接访问MainWindow的成员(包括私有)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值