VTK随笔五:VTK数据的读写

news2024/9/21 0:48:02

        VTK应用程序所需的数据可以通过两种途径获取:第一种是生成模型,然后处理这些模型数据(如由类 vtkCylinderSource 生成的多边形数据);第二种是从外部存储介质里导入相关的数据文件,然后在应用程序中处理这些读入的数据(如vkBMPReader 读取 BMP图像)。

        另一方面,VTK也可以将程序中处理完成的数据写入单个文件中,或者将所渲染的场景导出,以备后续操作的使用。从可视化管线的角度来看,一般以数据的读取(或由模型创建数据)开始,而以数据的写盘操作(或Mapper)结束。 

一、Reader 与 Writer 类 

VTK的Reader类要将外部数据读入可视化管线,主要的步骤如下:
1)实例化 Reader 对象。
2)指定所要读取的文件名。
3)调用 Update()方法促使管线执行。当管线后续的Fiter有Update()请求时,如调用Render()方法管线就会读取相应的图像文件,所以这一步有时也可省略。

使用 Writer 类的主要步骤如下:
1)实例化 Writer 对象。
2)输入要写盘的数据以及指定待写盘的了件名。
3)调用 Write0)方法促使 Writer 类开始写盘操作。

1、vtkImageData类型 

读取单个文件示例代码:

#include <vtkImageViewer2.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkPNGReader.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkJPEGWriter.h>
int main()
{
    //读取 PNG 图像
    vtkSmartPointer<vtkPNGReader> reader = vtkSmartPointer<vtkPNGReader>::New();
    reader->SetFileName("D:/VTK-logo.png");

    //显示读取的单幅 PNG 图像
    vtkSmartPointer<vtkImageViewer2> imageViewer = vtkSmartPointer<vtkImageViewer2>::New();
    imageViewer->SetInputConnection(reader->GetOutputPort());
    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    imageViewer->SetupInteractor(renderWindowInteractor);
    imageViewer->Render();
    imageViewer->GetRenderer()->ResetCamera();
    imageViewer->Render();

    //保存成 JPG 图像
    vtkSmartPointer<vtkJPEGWriter> writer = vtkSmartPointer<vtkJPEGWriter>::New();
    writer->SetFileName("VTK-logo.jpg");
    writer->SetInputConnection(reader->GetOutputPort());
    writer->Write();
    renderWindowInteractor->Start();
}

        在读取图像文件时,如果无法确定所读取的图像是什么格式,可以使用vtkImageReader2Factory 来读取要导入的文件,该类会试着寻找一种最适合的类对图像做读取操作,这个类可以读取大部分标准格式的图像文件。

    vtkSmartPointer<vtkImageReader2Factory> readerFactory = vtkSmartPointer<vtkImageReader2Factory>::New();
    vtklmageReader2 * reader = readerFactory->CreateImageReader2("../VTK-logo");
    reader->SetFileName("../VTK-logo");
    reader->Update();

 读取序列图像文件示例代码:

#include <vtkImageViewer2.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkJPEGReader.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
int main()
{
    //生成图像序列的文件名数组
    vtkSmartPointer< vtkStringArray > fileArray= vtkSmartPointer< vtkStringArray >::New();
    char fileName[128];
    for(int i= 1; i< 100; i++)
    {
        sprintf(fileName, "D:/Head/head%03d.jpg", i);
        vtkStdString fileStr(fileName);
        fileArray->InsertNextValue(fileStr);
    }

    //读取 JPG序列图像
    vtkSmartPointer<vtkJPEGReader> reader = vtkSmartPointer<vtkJPEGReader>::New();
    reader->SetFileNames(fileArray);

    //显示读取的 JPG 图像
    vtkSmartPointer<vtkImageViewer2> imageViewer = vtkSmartPointer<vtkImageViewer2>::New();
    imageViewer->SetInputConnection(reader->GetOutputPort());
    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =vtkSmartPointer<vtkRenderWindowInteractor>::New();
    imageViewer->SetSlice(50); //默认显示第50个切片(即第50 层)
    imageViewer->SetSliceOrientationToXY();
    //imageViewer->SetSliceOrientationToYZ();
    //imageViewer->SetSliceOrientationToXZ();
    imageViewer->SetupInteractor(renderWindowInteractor);
    imageViewer->Render();
    renderWindowInteractor->Start();

    return 0;
}

 读取的文件及示例运行结果

 2、vtkPolyData类型  

 3、vtkRectilinearGrid 类型
 4、vtkStructuredGrid 类型
 5、vtkUnstructuredGrid 类型

 二、场景的导入和导出

        场景的导入(Import)与导出(Export)是指将渲染场景中的对象,包括光照、相机、属性、变换矩阵等信息写入文件中,或者从外部文件中将这些对象导入渲染场景中,一般所导入的文件含有多个数据集。 

        VTK 中一般以关键字 Importer 和Exporter 命名的类是与场景的导入与导出相关的。Importer 类可以导入由其他 3D 模型软件(如 3DS MAX)所生成的模型文件;Exporter 则可以将 VTK里的场景生成可被其他 3D模型软件所处理的文件。

        VTK 支持的 Import 类包括 vtk3DSImporter 和vtkVRMLImporter;而支持的 Exporter 类则相对要多一些,主要有 vkRIBExporter、vtkGL2PSExporter、vtkIVExporter、vtkOBJExporer、vtkOOGLExporter、vtkVRMLExporter、vtkPOVExporter、vtkX3DExporter 等。

示例代码:

	// 3DS Import
	vtkSmartPointer<vtk3DSImporter> importer = vtkSmartPointer<vtk3DSImporter>::New();
	importer->SetFileName ( filename.c_str() );
	importer->ComputeNormalsOn();
	importer->Read();

	vtkSmartPointer<vtkRenderer> renderer = importer->GetRenderer();
	vtkSmartPointer<vtkRenderWindow> renderWindow = importer->GetRenderWindow();
	vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	renderWindowInteractor->SetRenderWindow(renderWindow);

三、总结

        本文主要介绍了处于 VTK 可视化管线两端的类,即读操作和写操作相关的类。VTK 针对不同的数据类型,提供了不同的读写类,对于类的使用者而言,最重要的是根据不同的文件类型选择合适的 Reader/Writer 类进行读写操作。
        另外,VTK 还可以导入由其他 3D 模型软件所生成的文件,也可将VTK 里生成的数据写成可被其他3D模型软件所处理的模型文件,这样有利于VTK与其他主流的模型软件的结合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2075458.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三网话费充值api接口有哪些优势?你了解多少?

一、话费充值 API 接口定义 话费充值 API 接口是一种专门为实现话费充值业务而设计的接口。通过接入该接口&#xff0c;个人或企业可以搭建话费充值平台&#xff0c;其界面展示与官方平台充值页面相似&#xff0c;可自动配置充值范围并支持三大运营商话费充值。 二、话费接口…

专业版SSL证书:强化网站安全的首选

专业版SSL证书&#xff0c;专为追求极致网站安全的企业设计。它不仅提供高强度的加密保护&#xff0c;有效防止数据在传输过程中被窃取或篡改&#xff0c;还通过严格的身份验证流程&#xff0c;向访客展示网站的真实身份。其独特的绿色地址栏或公司名显示功能&#xff0c;显著增…

打手机检测算法源码样本展示打手机检测算法实际应用场景介绍

打手机检测算法是一种利用计算机视觉技术来监测和识别人们在特定区域如驾驶舱、考场或其他敏感区域非法使用手机的行为。这种算法对于提高安全性和确保规则的遵守具有重要意义。以下是关于打手机检测算法源码及其实际应用的详细阐述&#xff1a; 1. 算法实现 - 深度学习框架&a…

探秘小米SU7亏损背后的真相:雷军的战略布局与汽车行业的逆袭

近日&#xff0c;小米发布了史上最佳单季财报&#xff0c;营收达到了889亿元&#xff0c;同比增长20.1%。然而&#xff0c;小米汽车业务的亏损依然引发了广泛关注。特别是&#xff0c;小米SU7每卖一辆亏损约6万元&#xff0c;但雷军对此却显得非常淡定甚至乐观。这背后究竟隐藏…

Leetcode面试经典150题-72.编辑距离

解法都在代码里&#xff0c;不懂就留言或者私信 动态规划最经典题之一&#xff0c;如果写不出来&#xff0c;动态规划好好再学学 class Solution {/**这个题是动态规划最经典的题&#xff0c;另一个最经典的是背包问题 */public int minDistance(String word1, String word2)…

解读vue3源码-响应式篇3 effect副作用函数

提示&#xff1a;看到我 请让我滚去学习 文章目录 前言effect问题拓展分支切换与 cleanup嵌套的 effect 与 effect 栈解决在副作用函数中同时读取和操作同一属性时无限循环 effect函数实现computed-api 实现图解在这里插入图片描述 总结 前言 什么是副作用函数&#xff1f; 在…

使用 Python 进行时间序列特征提取,从理论到实践

以下是提取时间序列分析特征时需要了解的所有内容 时间序列是一种特殊的动物。欢迎来到雲闪世界。 当我开始我的机器学习职业生涯时&#xff0c;我这样做是因为我喜欢物理&#xff08;开始机器学习的奇怪原因&#xff09;&#xff0c;并且从物理学中我了解到我也非常喜欢编码…

构建技术故障应急响应机制:开发团队的全面策略

构建技术故障应急响应机制&#xff1a;开发团队的全面策略 前言一、快速响应与问题定位实时监控与预警日志管理与分析分布式追踪紧急响应机制 二、预案与备份机制应急预案制定应急演练数据备份与恢复冗余部署与负载均衡 三、事后总结与持续改进全面复盘成果转化与实施持续改进机…

Prompt + 工作流组件 = AI智能体:开启智能化新时代

在这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的速度改变着我们的生活和工作方式。随着技术的不断进步&#xff0c;AI的应用场景也在不断扩展。而在这一过程中&#xff0c;Prompt和工作流组件的结合&#xff0c;正是构建AI智能体的关键所在…

Android中apk安装过程源码解析

本文中使用的Android源码基于Android 14 1 三方应用安装apk调用方法 public void installApk() {Intent intent new Intent(Intent.ACTION_VIEW);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);/** 自Android N开始&#xff0c;是通过FileProvider共享相关文件&#xff0…

NTU发布即插即用的嵌入式SLAM新SOTA!

导读&#xff1a; 当前的SLAM技术正逐渐向轻量化和高效化发展&#xff0c;在保证定位精度的同时&#xff0c;研究者们越来越倾向于简化冗余的框架&#xff0c;以在效率和性能之间找到最佳平衡点。 一个优秀的SLAM系统不仅需要提供精确的定位数据&#xff0c;还必须能够在不同平…

【PyQt】切换界面的实现

前言一、介绍二、代码2.1 QStackedWidget2.1.1 代码2.1.2 运行结果展示 2.2 QTabWidget2.2.1 代码2.2.2 运行结果展示 2.3 QDockWidget2.3.1 代码2.3.2 运行结果展示 PULSE结果 总结 前言 实现几个界面的切换展示的效果。 一、介绍 在 PyQt 中实现一个主界面包含其他子界面的…

#mark# ViteSvgIconsPlugin svgoOptions选项

svgoOptions 设置为false时 &#xff0c; 矢量svg图标 stroke线条不正常 找了半天 哪影响的 &#xff0c; 线条异常图如下 svgoOptions 改为true后 &#xff0c;显示正常了

并查集优化策略及其正确性证明:基于路径压缩与按秩合并

并查集优化策略及其正确性证明:基于路径压缩与按秩合并 前言优化策略算法伪代码C语言实现归纳法证明基础情况归纳步骤结论前言 引理:对于所有的结点x, 有 x.rank≤x.p.rank, 如 果x≠x.p, 则此式是严格不等 式。x.rank 的初始值为0,并且随时间而增加,直到x≠x.p; 从此以后,…

安卓13 背光反向 亮度反向 android13 backlight reverse

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码分析 4.代码修改 5.彩蛋 1.前言 有些设备,在调整背光的时候,会发现,背光调大,显示亮度反而变暗,背光调小,亮度变亮。这是由于PWM背光本身并没有一个标准去决定怎么样算是高亮度,怎么算是低亮度。因…

C语言-02 算法-程序的灵魂

算法-程序的灵魂 1、程序&#xff1d;算法数据结构2、什么是算法3、简单的算法举例4、算法的特性5、怎样表示一个算法5.1 用自然语言表示算法5.2 用流程图表示算法5.3 三种基本结构和改进的流程图5.4 用N-S流程图表示算法5.5 用伪代码表示算法5.6 用计算机语言表示算法 6、结构…

秋冬春夏,纪念在CSDN的第365天

目录 时光 收获 工作 生活 憧憬 时光 再次收到创作纪念日的消息时&#xff0c;已在CSDN创作和度过了一年的时光。创作&#xff0c;成了自己的第二工作空间&#xff0c;成为了日常的一种习惯。 每当看到第1篇文章的提醒消息&#xff0c;都会想起当时创作的初衷和情景。是一…

学了PMP能给我们带来什么变化?

一、PMP是什么 PMP(Project Management Professional)是一个在项目管理领域具有高级认证的资格。该认证由PMI在全球200多个国家和地区广泛推广&#xff0c;被认为是项目管理领域内最具含金量的认证之一。 持有PMP证书的项目经理不仅可以提升其项目管理能力&#xff0c;同时也…

LLaMA代码笔记 --基于lit-llama

代码来自&#xff1a;lit-llama modelscope模型下载 &#xff1a;llama-7b 下载后的模型需要转换为lit-llama使用的格式&#xff0c;详见 howto 文件夹下的 download_weights.md 文中代码为了方便说明&#xff0c;删减了一些内容&#xff0c;详细代码请查看源码。 generate …

磁场强度H和磁感应强度B,磁化强度M和磁极化强度J

磁场强度H、磁感应强度B、磁化强度M和磁极化强度J是四个非常重要的磁学基本概念&#xff0c;他们之间关联但有时又很容易混淆。分清这四个概念对于磁材行业从业者是非常重要的&#xff0c;今天我们就为大家细说一下它们的概念和关系。 磁场强度H 磁场强度H其实是一个没有实际…