ActiViz实战:基于ActiViz 9.3读取分割后的心脏模型并实现面绘制

文章目录

  • 一、效果预览
  • 二、实现代码
  • 三、源码地址


一、效果预览

20240627_150614

二、实现代码

public partial class Form1 : Form
{private int _organCount;//组织数量private List<vtkPolyDataMapper> _multOrganMapper = new List<vtkPolyDataMapper>();//多组织映射器private List<vtkActor> _organActors = new List<vtkActor>();private vtkRenderer _organRenderer;//渲染器private vtkRenderWindow _organRenderWindow;//渲染窗口private vtkRenderWindowInteractor _renderWindowInteractor;//渲染窗口交互器private int[] _organValue;private RenderWindowControl _renderWindowControl;private double[] center;public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){_renderWindowControl = renderWindowControl1;_organRenderWindow = _renderWindowControl.RenderWindow;_organRenderer = _organRenderWindow.GetRenderers().GetFirstRenderer();_renderWindowInteractor = _organRenderWindow.GetInteractor();}private void bt1_Click(object sender, EventArgs e){CreateActors(new int[] { 1, 2, 3, 4, 5, 6, 7, 8 });ColorConverter colorConverter = new ColorConverter();List<Color> colors = new List<Color>{(Color)colorConverter.ConvertFromString("#752830"),(Color)colorConverter.ConvertFromString("#1ee4a5"),(Color)colorConverter.ConvertFromString("#125717"),(Color)colorConverter.ConvertFromString("#5854FA"),(Color)colorConverter.ConvertFromString("#bfdc35"),(Color)colorConverter.ConvertFromString("#8b5d0e"),(Color)colorConverter.ConvertFromString("#b929d3"),(Color)colorConverter.ConvertFromString("#15a2af"),};List<double> opacitys = new List<double>() { 1, 1, 1, 1, 1, 1, 1, 1  };List<int> visiInts = new List<int>() { 1, 1, 1, 1, 1, 1, 1, 1, };SetActorProperty(colors, opacitys, visiInts);string str =  "Resources\\heart.nii.gz";LoadedNiiHeartData(str);}/// <summary>/// 根据心脏组织数量创建角色/// </summary>/// <param name="organValue"></param>public void CreateActors(int[] organValue){_organValue = organValue;_organCount = organValue.Length;for (int i = 0; i < _organCount; i++){vtkPolyDataMapper mapper = new vtkPolyDataMapper();_multOrganMapper.Add(mapper);vtkActor actor = new vtkActor();_organActors.Add(actor);_organRenderer.AddActor(actor);}}/// <summary>/// 设置角色参数,并渲染角色/// </summary>/// <param name="actorColors"></param>/// <param name="opacitys"></param>/// <param name="visiInts"></param>public void SetActorProperty(List<Color> actorColors, List<double> opacitys, List<int> visiInts){for (int i = 0; i < _organCount; i++){Color c = actorColors[i];_organActors[i].GetProperty().SetColor(c.R / 255.0, c.G / 255.0, c.B / 255.0);//设置角色颜色_organActors[i].GetProperty().SetOpacity(opacitys[i]);//设置角色透明度_organActors[i].SetVisibility(visiInts[i]);//设置角色显隐}_organRenderer.Render();}vtkAppendPolyData appendFilter;public void LoadedNiiHeartData(string niiPath){vtkNIFTIImageReader reader = vtkNIFTIImageReader.New();reader.SetFileName(niiPath);reader.Update();vtkImageData imageData = reader.GetOutput();appendFilter = vtkAppendPolyData.New();for (int i = 0; i < _organCount; i++){vtkImageData tempData = new vtkImageData();tempData.DeepCopy(imageData);vtkImageData iData = SepImageData(tempData, i + 1);vtkPolyDataAlgorithm edge = CreateEdges3D(iData, i + 1);vtkPolyDataNormals smooth = CreateSmooth(edge.GetOutputPort());_multOrganMapper[i].SetInputConnection(smooth.GetOutputPort());_multOrganMapper[i].ScalarVisibilityOff();_organActors[i].SetMapper(_multOrganMapper[i]);_organActors[i].GetProperty().SetSpecular(0.3);//反射率_organActors[i].GetProperty().SetOpacity(1);//透明度_organActors[i].GetProperty().SetSpecularPower(20);//反射光强度appendFilter.AddInputData(_multOrganMapper[i].GetInput());}appendFilter.Update();center = appendFilter.GetOutput().GetCenter();//创建一个cameravtkCamera aCamera = vtkCamera.New();aCamera.SetViewUp(0, 0, 1);aCamera.SetPosition(0, 10, 0);aCamera.SetFocalPoint(0, 0, 0);_organRenderer.SetActiveCamera(aCamera);_organRenderer.UseDepthPeelingOn();_organRenderer.SetUseFXAA(true);_organRenderer.ResetCamera();//450msaCamera.SetPosition(0, 10, 0);aCamera.OrthogonalizeViewUp();_organRenderer.ResetCameraClippingRange();_renderWindowInteractor.Start();}private vtkImageData SepImageData(vtkImageData imageData, int organNum){var pointNum = imageData.GetNumberOfPoints();var type = imageData.GetScalarType();imageData.AllocateScalars(type, 1);//90msunsafe{byte* pt = (byte*)imageData.GetScalarPointer();//130ms          }return imageData;}private vtkPolyDataAlgorithm CreateEdges3D(vtkImageData imageData, int organNum){vtkFlyingEdges3D flyingEdges3D = vtkFlyingEdges3D.New();flyingEdges3D.SetInputData(imageData);flyingEdges3D.ComputeGradientsOff();flyingEdges3D.ComputeNormalsOff();flyingEdges3D.SetValue(0, organNum);flyingEdges3D.ComputeScalarsOff();flyingEdges3D.Update();//50ms return flyingEdges3D;}private vtkPolyDataNormals CreateSmooth(vtkAlgorithmOutput algorithmOutput){vtkWindowedSincPolyDataFilter smooth = vtkWindowedSincPolyDataFilter.New();smooth.SetInputConnection(algorithmOutput);smooth.SetNumberOfIterations(30);double passBand = 0.01;smooth.SetPassBand(passBand);smooth.BoundarySmoothingOff();smooth.FeatureEdgeSmoothingOff();smooth.NonManifoldSmoothingOn();smooth.NormalizeCoordinatesOn();vtkPolyDataNormals smoothnormals = vtkPolyDataNormals.New();smoothnormals.SetInputConnection(smooth.GetOutputPort());smoothnormals.SetFeatureAngle(60);return smoothnormals;}    
}

三、源码地址

踩坑创作不易,白嫖党勿扰:源码

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

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

相关文章

第30课 绘制原理图——放置网络标签

什么是网络标签&#xff1f; 我们在很多电路图中都能看到&#xff0c;为了让图纸更加简洁&#xff0c;并不是每一根导线都要确确实实地画出来。可以在导线悬空的一端添加一个名称标签&#xff0c;接着在另一根导线的悬空一端添加上一个同名的名称标签&#xff0c;那么就可以让…

Qt 基于FFmpeg的视频播放器 - 播放、暂停以及拖动滑动条跳转

Qt 基于FFmpeg的视频转换器 - 播放、暂停以及拖动进度条跳转 引言一、设计思路二、核心源码以及相关参考链接 引言 本文基于FFmpeg&#xff0c;使用Qt制作了一个极简的视频播放器. 相比之前的版本&#xff0c;加入了播放、暂停、拖动滑动条跳转功能&#xff0c;如上所示 (左图)…

SpringSecutrity原理

一、基于RBAC实现的权限管理通常需要涉及以下几张表&#xff1a; 1. 用户表&#xff08;user&#xff09;&#xff1a;记录系统中的所有用户&#xff0c;包括用户ID、用户名、密码等信息。 2. 角色表&#xff08;role&#xff09;&#xff1a;记录系统中的所有角色&#xff0…

基于51单片机太阳能风能风光互补路灯控制器

一.硬件方案 本设计由STC89C52单片机电路太阳能电池板电路风机发电电路锂电池充电保护电路升压电路稳压电路光敏电阻电路4位高亮LED灯电路2档拨动开关电路电源电路设计而成。 二.设计功能 &#xff08;1&#xff09;采用风机和太阳能电池板给锂电池充电&#xff0c;具有充电…

系统架构设计师 - 数据库系统(2)

数据库系统 数据库系统规范化理论 ★ ★ ★ ★ ★函数依赖求候选键Armstrong公理范式判断第一范式 1NF第二范式 2NF第三范式 3NFBC 范式 BCNF 模式分解保持函数依赖分解无损分解 并发控制 ★事务的 ACID 特性并发存在的问题并发解决方案 - 封锁协议 数据库的安全性 ★安全性的分…

MySQL入门学习-索引.创建索引

索引是 MySQL 中用于加速查询的一种数据结构。它通过在表的列上创建索引来加快数据的检索速度。 一、索引的概念 索引类似于书的目录&#xff0c;可以快速定位到表中的数据。当在表中的列上创建索引后&#xff0c;MySQL 会根据索引列的值对数据进行排序&#xff0c;并建立一个…

【C++STL基础入门】wstring类基础使用

文章目录 前言C STL基础入门&#xff1a;wstring类的基础使用前言正文wstring是什么常用的构造函数常用的操作函数 总结 前言 在C的标准模板库(STL)中&#xff0c;wstring是一个重要的类&#xff0c;它是string的宽字符版本&#xff0c;用于存储和操作宽字符序列。本文将详细介…

十三、Maven(1)

&#x1f33b;&#x1f33b;目录 一、maven价绍二、maven的功能1、项目自动化构建2、管理jar、war包3、实现项目结构设计 三、maven安装1、maven的安装环境需要jdk2、Maven的安装路径中不能出现中文和空格3、压缩包解压即可4、配置环境变量 四、maven的仓库1. Maven仓库配置2. …

选型手册:Bosch Sensortec 博世 微机电系统(MEMS)传感器和方案

前言 博世传感器公司&#xff08;Bosch Sensortec&#xff09; 是全球领先的微机电系统&#xff08;MEMS&#xff09;传感器和解决方案供应商。公司成立于2005年&#xff0c;是德国罗伯特博世有限公司&#xff08;Robert Bosch GmbH&#xff09;旗下的全资子公司。博世传感器公…

SpringBoot【3】集成 Swagger

SpringBoot 集成 Swagger 前言pom.xml 配置文件application.yml 配置文件config 包Swagger2Config entity 包UserEntity service 包impl 包SwaggerServiceImpl SwaggerService controller 包SwaggerController SwaggerApplication验证 前言 创建项目步骤、及版本选择等&#x…

展开说说:Android列表之RecyclerView

RecyclerView 它是从Android5.0出现的全新列表组件&#xff0c;更加强大和灵活。用于显示列表形式 (list) 或者网格形式 (grid) 的数据&#xff0c;替代ListView和GridView成为Android主流的列表组件。可以说Android客户端只要有表格的地方就有RecyclerView。 RecyclerView 内…

【Android】Material TabLayout使用详解

基本用法 TabItem可以设置text&#xff0c;icon&#xff0c;layout三个属性 其它属性都通过TabLayout来统一设置 <com.google.android.material.tabs.TabLayout><com.google.android.material.tabs.TabItem/><com.google.android.material.tabs.TabItem/>…

VCS编译bug汇总

‘typedef’ is not expected to be used in this contex 注册前少了分号。 Scope resolution error resolution : 声明指针时 不能与类名同名&#xff0c;即 不能声明为adapter. cannot find member "type_id" 忘记注册了 拼接运算符使用 关键要加上1b&#xff0…

[MySQL]购物管理系统—简略版

本文内容需以MySQL支持 特别感谢baidu comate AI提供的少量虚拟数据 0.建库(建立数据库——utf8字符集&#xff0c;utf8_general_ci排序规则) 1.此项目ER图如下 2.DDLDML(共九表&#xff0c;27数据) SET FOREIGN_KEY_CHECKS 0;DROP TABLE IF EXISTS goods; CREATE TABLE g…

前端vue-cli相关知识与搭建过程(项目创建,组件路由)very 详细

一.关于vue-cli 1.什么是vue Vue (读音 /vju ː /&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。 Vue.js 是前端的主流框架之一&#xff0c;和 Angular.js…

【公开数据集获取】

Open Images Dataset https://www.youtube.com/watch?vdLSFX6Jq-F0

一分钟彻底掌握java泛型

Java中的泛型&#xff08;Generics&#xff09; 在Java中&#xff0c;泛型是JDK 5引入的一个非常重要的特性&#xff0c;它允许你在定义类、接口和方法时使用类型参数&#xff08;type parameters&#xff09;。使用泛型的主要好处是可以提供编译时的类型检查&#xff0c;减少…

【M365运维】Outlook和Teams里不显示用户的组织架构

【问题】 由于一些误操作&#xff0c;把用户账户禁用并重新启用后&#xff0c;发现在Outlook和Teams里无法查看用户的组织结构图了。如下图所示&#xff1a; - 在Outlook 里&#xff0c;用户标签页的组织一直显示“正在加载..."&#xff0c;成员身份也是“找不到任何组。…

【GD32】08 - IIC(以SHT20为例)

GD32中的IIC 今天来了解一下GD32中的硬件IIC&#xff0c;其实我个人是觉得软件IIC比较方便的&#xff0c;不过之前文章里用的都是软件IIC&#xff0c;今天就算是走出自己的舒适圈&#xff0c;我们来了解了解GD32中的硬件IIC。 我这里用的型号是GD32F407&#xff0c;不同型号的…

等保测评初级简答题试题

基本要求&#xff0c;在应用安全层面的访问控制要求中&#xff0c;三级系统较二级系统增加的措施有哪些&#xff1f; 答&#xff1a;三级比二级增加的要求项有&#xff1a; 应提供对重要信息资源设置敏感标记的功能&#xff1b; 应按照安全策略严格控制用户对有敏感标记重要…