vtkdelaunay3d的参数设置_VTK 渲染体数据并加方位标注
参考:
代码是在vtk560环境下写出来的。下面直接贴代码:
using vtk;
namespace dicomorientationtest
{
public partial class Form1 : Form
{
#region 私有成员
private vtk.vtkFormsWindowControl vtkFormsWindowControl1 = null;
private vtk.vtkDICOMImageReader _reader = null;
private vtk.vtkVolume _vtkVolume = null;
private vtk.vtkRenderer _render = null;
private vtk.vtkGenericRenderWindowInteractor _iren = new vtk.vtkGenericRenderWindowInteractor();
private vtk.vtkRenderWindow _renwin = null;
private vtk.vtkFollower textActor;
#endregion
#region 属性
public string FileDir
{
get;
set;
}
#endregion
public Form1()
{
InitializeComponent();
InitRenderWindow();
}
private void InitRenderWindow()
{
this.vtkFormsWindowControl1 = new vtkFormsWindowControl();
this.SuspendLayout();
this.vtkFormsWindowControl1.Name = "vtkFormsWindowControl1";
this.vtkFormsWindowControl1.Size = new System.Drawing.Size(800, 800);
this.vtkFormsWindowControl1.TabIndex = 0;
this.Location = new System.Drawing.Point(10, 10);
this.vtkFormsWindowControl1.Text = "vtkFormsWindowControl1";
this.Controls.Add(vtkFormsWindowControl1);
}
private void btn_Open_Click(object sender, EventArgs e)
{
FolderBrowserDialog dlg = new FolderBrowserDialog();
if (DialogResult.OK == dlg.ShowDialog())
{
FileDir = dlg.SelectedPath;
}
}
private void btn_render_Click(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(FileDir))
{
_render = new vtkRenderer();
#region dicom
_reader = new vtkDICOMImageReader();
_reader.SetDirectoryName(FileDir);
_reader.SetDataByteOrderToLittleEndian();
_reader.Update();
int[] dimensions = _reader.GetOutput().GetDimensions();
#region opacity transfer
vtkPiecewiseFunction compositeOpacity = new vtkPiecewiseFunction();
compositeOpacity.AddPoint(-2048, 0);
compositeOpacity.AddPoint(128.643, 0);
compositeOpacity.AddPoint(129.982, 0.0982143);
compositeOpacity.AddPoint(173.636, 0.1);
compositeOpacity.AddPoint(255.884, 0.1);
compositeOpacity.AddPoint(3661, 1);
//compositeOpacity.AddPoint(173.636, 0);
//compositeOpacity.AddPoint(255.884, 0);
//compositeOpacity.AddPoint(3661, 0);
#endregion
#region colortransfer
vtkColorTransferFunction colorFun = new vtkColorTransferFunction();
colorFun.AddRGBPoint(-2048, 0, 0, 0);
colorFun.AddRGBPoint(128.643, 0, 0, 0);
colorFun.AddRGBPoint(129.982, 0.615686, 0, 0.0156863);
colorFun.AddRGBPoint(173.636, 0.909804, 0.454902, 0);
colorFun.AddRGBPoint(255.884, 0.886275, 0.886275, 0.886275);
colorFun.AddRGBPoint(584.878, 0.968627, 0.968627, 0.968627);
colorFun.AddRGBPoint(3661, 1, 1, 1);
#endregion
vtkVolumeProperty property = new vtkVolumeProperty();
property.ShadeOff();
property.SetInterpolationTypeToLinear();
property.SetColor(colorFun);
property.SetScalarOpacity(compositeOpacity);
property.SetDiffuse(0.9);
property.SetAmbient(0.1);
property.SetSpecular(0.2);
property.SetSpecularPower(10.0);
double[] range = _reader.GetOutput().GetScalarRange();
double min = range[0];
double max = range[1];
double diff = max - min;
double slope = 4095.0 / diff;//斜率
double inter = -slope * min;//截距
double shift = inter / slope;
vtkImageShiftScale vtkImageCast = new vtkImageShiftScale();
vtkImageCast.SetInput(_reader.GetOutput());
vtkImageCast.SetScale(slope);
vtkImageCast.SetShift(shift);
vtkImageCast.SetOutputScalarTypeToUnsignedShort();
vtkImageCast.Update();
vtkVolumeRayCastCompositeFunction compositefunction = new vtkVolumeRayCastCompositeFunction();
compositefunction.SetCompositeMethodToInterpolateFirst();
vtkVolumeRayCastMapper mapper = new vtkVolumeRayCastMapper();
mapper.SetVolumeRayCastFunction(compositefunction);
mapper.SetInput(vtkImageCast.GetOutput());
mapper.SetSampleDistance(0.1);
vtkVolume volume = new vtkVolume();
volume.SetMapper(mapper);
volume.SetProperty(property);
_render.AddViewProp(volume);
#endregion
#region axes
double[] space = _reader.GetOutput().GetSpacing();
Console.WriteLine("spacing[0]={0},[1]={1},[2]={2}", space[0], space[1], space[2]);
int[] extents = _reader.GetOutput().GetExtent();
Console.WriteLine("extents[0]={0},[1]={1},[2]={2},[3]={3},[4]={4},[5]={5}",
extents[0], extents[1], extents[2], extents[3], extents[4], extents[5]);
vtkTransform transform = new vtkTransform();
transform.Translate(0.0, 0.0, 0.0);
transform.Scale((extents[1]) * (space[0]), (extents[3]) * (space[1]), (extents[5]) * (space[2]));
vtkAxesActor axes = new vtkAxesActor();
axes.SetUserTransform(transform);
_render.AddActor(axes);
#endregion
#region text
double scalesize=(extents[1]) * (space[0])/20;
//原点
vtkVectorText otext = new vtkVectorText();
otext.SetText("O");
vtkPolyDataMapper textMapper = new vtkOpenGLPolyDataMapper();
textMapper.SetInputConnection(otext.GetOutputPort());
textActor = new vtkFollower();
textActor.SetMapper(textMapper);
textActor.SetScale(scalesize,scalesize,scalesize);
textActor.AddPosition(0, -0.1, 0);
textActor.SetCamera(_render.GetActiveCamera());
_render.AddViewProp(textActor);
//左 L
vtkVectorText lText = new vtkVectorText();
lText.SetText("L");
vtkPolyDataMapper lMapper = new vtkOpenGLPolyDataMapper();
lMapper.SetInputConnection(lText.GetOutputPort());
vtkFollower lActor = new vtkFollower();
lActor.SetMapper(lMapper);
lActor.SetScale(scalesize,scalesize,scalesize);
lActor.GetProperty().SetColor(0,1,0);
lActor.AddPosition((extents[1] * space[0])+10, (extents[3] * space[1]) / 2, (extents[5] * space[2]) / 2);
lActor.SetCamera(_render.GetActiveCamera());
_render.AddViewProp(lActor);
//右 R
vtkVectorText rText = new vtkVectorText();
rText.SetText("R");
vtkPolyDataMapper rMapper = new vtkOpenGLPolyDataMapper();
rMapper.SetInputConnection(rText.GetOutputPort());
vtkFollower rActor = new vtkFollower();
rActor.SetMapper(rMapper);
rActor.SetScale(scalesize, scalesize, scalesize);
rActor.GetProperty().SetColor(1, 0, 0);
rActor.AddPosition(-10, (extents[3] * space[1]) / 2, (extents[5] * space[2]) / 2);
rActor.SetCamera(_render.GetActiveCamera());
_render.AddViewProp(rActor);
//前 A
vtkVectorText aText = new vtkVectorText();
aText.SetText("A");
vtkPolyDataMapper aMapper = new vtkOpenGLPolyDataMapper();
aMapper.SetInputConnection(aText.GetOutputPort());
vtkFollower aActor = new vtkFollower();
aActor.SetMapper(aMapper);
aActor.SetScale(scalesize, scalesize, scalesize);
aActor.GetProperty().SetColor(0, 1, 0);
aActor.AddPosition((extents[1] * space[0]) / 2, (extents[3] * space[1])+10, (extents[5] * space[2]) / 2);
aActor.SetCamera(_render.GetActiveCamera());
_render.AddViewProp(aActor);
//后 P
vtkVectorText pText = new vtkVectorText();
pText.SetText("P");
vtkPolyDataMapper pMapper = new vtkOpenGLPolyDataMapper();
pMapper.SetInputConnection(pText.GetOutputPort());
vtkFollower pActor = new vtkFollower();
pActor.SetMapper(pMapper);
pActor.SetScale(scalesize, scalesize, scalesize);
pActor.GetProperty().SetColor(1, 0, 0);
pActor.AddPosition((extents[1] * space[0]) / 2, -10, (extents[5] * space[2]) / 2);
pActor.SetCamera(_render.GetActiveCamera());
_render.AddViewProp(pActor);
//头 H
vtkVectorText hText = new vtkVectorText();
hText.SetText("H");
vtkPolyDataMapper hMapper = new vtkOpenGLPolyDataMapper();
hMapper.SetInputConnection(hText.GetOutputPort());
vtkFollower hActor = new vtkFollower();
hActor.SetMapper(hMapper);
hActor.SetScale(scalesize, scalesize, scalesize);
hActor.GetProperty().SetColor(0, 1, 0);
hActor.AddPosition((extents[1] * space[0]) / 2,(extents[3] * space[1]) / 2,-10 );
hActor.SetCamera(_render.GetActiveCamera());
_render.AddViewProp(hActor);
//脚 F
vtkVectorText fText = new vtkVectorText();
fText.SetText("F");
vtkPolyDataMapper fMapper = new vtkOpenGLPolyDataMapper();
fMapper.SetInputConnection(fText.GetOutputPort());
vtkFollower fActor = new vtkFollower();
fActor.SetMapper(fMapper);
fActor.SetScale(scalesize, scalesize, scalesize);
fActor.GetProperty().SetColor(0, 1, 0);
fActor.AddPosition((extents[1] * space[0]) / 2, (extents[3] * space[1]) / 2, (extents[5] * space[2])+10);
fActor.SetCamera(_render.GetActiveCamera());
_render.AddViewProp(fActor);
#endregion
_render.ResetCamera();
vtkFormsWindowControl1.GetRenderWindow().AddRenderer(_render);
_renwin = vtkFormsWindowControl1.GetRenderWindow();
_renwin.AddRenderer(_render);
_renwin.Render();
}
else
{
MessageBox.Show("请先选定文件夹!");
}
}
}
}
效果图:
vtkdelaunay3d的参数设置_VTK 渲染体数据并加方位标注相关推荐
- 【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )
文章目录 安卓直播推流专栏博客总结 一. Android 端数据采集涉及到的相关概念 二. Camera 预览图像尺寸设置 三. 获取摄像头采集的数据格式 安卓直播推流专栏博客总结 Android R ...
- jmeter的java请求参数设置_Jmeter中json数据参数化、断言设置
第一步:光标定位到测试计划上,右键菜单"添加" -> Threads(users) -> 线程组,如下图 第二步: 光标定位到线程组,右键菜单选择 "添加&q ...
- 2021年大数据Hadoop(二十九):关于YARN常用参数设置
全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 关于yarn常用参数设置 设置container分配最小内 ...
- 【嵌入式开发】时钟初始化 ( 时钟相关概念 | 嵌入式时钟体系 | Lock Time | 分频参数设置 | CPU 异步模式设置 | APLL MPLL 时钟频率设置 )
文章目录 一. 时钟相关概念解析 1. 相关概念术语 ( 1 ) 时钟脉冲信号 ( 概念 : 电压幅度 时间间隔 形成脉冲 | 作用 : 时序逻辑基础 间隔固定 根据脉冲数量可计算出时间 ) ( 2 ...
- Jdbc访问mysql查询聚合函数_JDBC连接参数设置对Oracle数据库的影响分析
一次数据库性能问题处理引发的JDBC参数设置思考 近期某环境下系统,出现大面积页面访问缓慢情况,每个页面交易响应时间2-5秒,严重超过平日访问阈值. 经排查分析,问题主要出现在数据库,生成AWR得到3 ...
- sklearn逻辑回归参数设置_【机器学习笔记】:逻辑回归实战练习(二)
作者:xiaoyu 微信公众号:Python数据科学 知乎:python数据分析师 前言 前几篇介绍了逻辑回归在机器学习中的重要性:5个原因告诉你:为什么在成为数据科学家之前,"逻辑回归&q ...
- 聚类方法:DBSCAN算法研究(1)--DBSCAN原理、流程、参数设置、优缺点以及算法
DBSCAN聚类算法三部分: 1. DBSCAN原理.流程.参数设置.优缺点以及算法: http://blog.csdn.net/zhouxianen1987/article/detai ...
- CAN总线的位时序与参数设置
CAN总线的位时序与参数设置 CAN的位时序构成 CAN总线的每个位(Bit)的周期 Tbit = 1 / Baudrate.根据CAN规范,每个位的时间内又可细分成4段: 同步段(Synchroni ...
- layui进度条:调用、参数设置、动态渲染、数据热更新 (含案例、代码)
文章目录 layui进度条:调用.参数设置.动态渲染.数据热更新 (含案例.代码) 一.demo案例 1.1. 应用 · 截图: 1.2. 案例 · 全部代码: 二.自定义案例 2.1. 部分代码: ...
- x264中重要结构体参数解释,参数设置,函数说明
x264中重要结构体参数解释 http://www.usr.cc/thread-51995-1-3.html x264参数设置 http://www.usr.cc/thread-51996-1-3.h ...
最新文章
- WIN7 任务栏放右侧 有个BUG
- CentOS 6.7 RPM安装MySQL
- python【蓝桥杯vip练习题库】ADV-104打水问题
- 【数据结构】——堆排序
- Google搜索语法
- EJB3.0学习笔记---定义客户端访问接口:
- hdu 1698 线段树成段更新
- 团队作业2 需求分析与原型设计
- 也谈Oracle异常: ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
- Composite UI Application Block(CAB)
- webpack配置babel-loader
- 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_04-新增页面-服务端-接口开发...
- java isbn_ISBN(国际标准书号)的校验
- Git:rebase 是什么
- 双11商超大促,竞争白热化,智慧供应链成品牌最大助力!
- Uniapp微信小程序视频全屏播放功能极简实现法
- 简述c语言中break的作用,c语言break什么意思?
- 大二Web课程设计期末考试——基于HTML+CSS+JavaScript+jQuery电商类化妆品购物商城
- 大学物理实验报告 迈克尔逊干涉 and 三棱镜衍射
- Opencv4 CV_LOAD_IMAGE_GRAYSCALE找不到解决方法