文档章节

VTK实现Reslice

小王爷_2019
 小王爷_2019
发布于 2015/11/27 09:15
字数 741
阅读 481
收藏 0

参考水灵大神的代码编写的,将其改为在C#下,用activiz实现。

大神的源码在这里:

http://blog.csdn.net/www_doling_net/article/details/8551523


在c#中,有些VTK的功能不支持,所以需要自己改一下:

namespace SliceMonitortest
{
    /// <summary>
    /// 封装了4*4矩阵的乘法
    /// 因为在Activiz中,vtkMatrix4x4的 MultiplyPoint 功能无法使用,所以自己封装了一个类来实现矩阵乘法。
    /// </summary>
   public class Matrix4
    {
       private double[,] vtkArray;
       public double[,] VtkArray
       {
           get
           {
               
               return vtkArray;
           }
       }
       public Matrix4(vtkMatrix4x4 vtkMatrix)
       {
           vtkArray=new double[4,4];

           for (int i = 0; i < 4; i++)
           {
               //double[] temp = new double[4];
               for (int j = 0; j < 4; j++)
               {
                  
                   vtkArray[i,j] = vtkMatrix.GetElement(i,j);

               }
              
           }

       }
       /// <summary>
       /// 矩阵乘法
       /// </summary>
       /// <param name="inArray">输入矩阵</param>
       /// <param name="outArray">输出矩阵</param>
       public  void MultiplyPoint(double[] inArray,double[] outArray)
       {
           for (int i = 0; i < 4; i++)
           {
               outArray[i] = 0.0;
               for (int j = 0; j < 4; j++)
               {
                   outArray[i] += vtkArray[i, j] * inArray[j];
               }
           }
       }
    }
}


namespace SliceMonitortest
{
    public partial class Form1 : Form
    {
        private vtkDICOMImageReader _reader = null;
        private vtkRenderer _render = null;
        private vtkRenderWindow _renwin = null;
        private vtkRenderWindowInteractor _iren = null;
        private vtkImageReslice reslice = null;
        private vtkObject.vtkObjectEventHandler InteractorHandler = null;
        private int Slicing;

        public string FileDir
        {
            get;
            set;

        }

        public Form1()
        {
            InitializeComponent();
        }

        private void renderWindowControl1_Load(object sender, EventArgs e)
        {
            _renwin = renderWindowControl1.RenderWindow;
            _render = _renwin.GetRenderers().GetFirstRenderer();
            _iren = _renwin.GetInteractor();
            InteractorHandler=new vtkObject.vtkObjectEventHandler(_iren_AnyEvt);//注册交互事件处理程序
            _iren.AnyEvt += InteractorHandler;
            Slicing = 0;
        }

        void _iren_AnyEvt(vtkObject sender, vtkObjectEventArgs e)
        {
            int[] lastPos = _iren.GetLastEventPosition();
            int[] currPos = _iren.GetEventPosition();
            vtkCommand.EventIds eid = (vtkCommand.EventIds)e.EventId;
            if (eid == vtkCommand.EventIds.LeftButtonPressEvent)
            {
                this.Slicing = 1;
            }
            else if (eid == vtkCommand.EventIds.LeftButtonReleaseEvent)
            {
                this.Slicing = 0;
            }
            else if (eid == vtkCommand.EventIds.MouseMoveEvent)
            {
                if (this.Slicing==1)
                {
                    int deltY = lastPos[1] - currPos[1];//计算鼠标移动
                    reslice.Update();
                    double sliceSpacing = reslice.GetOutput().GetSpacing()[2];
                    vtkMatrix4x4 matrix = reslice.GetResliceAxes();//获取转换矩阵

                    Matrix4 tempmatrix = new Matrix4(matrix);
                    //因为vtkMatrix4x4的 MultiplyPoint 功能无法使用,所以自己封装了一个类实现矩阵乘法
                   
                  
                    // move the center point that we are slicing through
                    double[] point=new double[4]{0.0,0.0,sliceSpacing*deltY,1.0};
                    double[] center = new double[4]{0.0,0.0,0.0,0.0};
                    tempmatrix.MultiplyPoint(point,center);
                    //计算边界,当超出边界时不再移动
                    int[] extent = _reader.GetOutput().GetExtent();
                    double[] spacing = _reader.GetOutput().GetSpacing();
                    double[] origin = _reader.GetOutput().GetOrigin();
                    double[] Border=new double[3];
                    Border[0]= origin[0] + spacing[0]  * (extent[0] + extent[1]);
                    Border[1]= origin[1] + spacing[1] * (extent[2] + extent[3]);
                    Border[2]= origin[2] + spacing[2]  * (extent[4] + extent[5]);

                    for (int i = 0; i < 3; i++)
                    {
                        if (center[i] < origin[i]) center[i] = origin[i];
                    }
                    for (int i = 0; i < 3; i++)
                    {
                        if (center[i] > Border[i]) center[i] = Border[i];
                    }


                    matrix.SetElement(0, 3, center[0]);
                    matrix.SetElement(1, 3, center[1]);
                    matrix.SetElement(2, 3, center[2]);
                    //if((center[0]<0)||(center[0]>))

                    _iren.Render();
                    
                    

                }
                else
                {
                    vtkInteractorStyle style = vtkInteractorStyle.SafeDownCast(_iren.GetInteractorStyle());
                    if (style != null)
                    {
                        style.OnMouseMove();
                    }
                }
            }

        }

        private void btn_ReadFiles_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog dlg = new FolderBrowserDialog();
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                FileDir = dlg.SelectedPath;
            }
            if (!String.IsNullOrEmpty(FileDir))
            {
                _reader = new Kitware.VTK.vtkDICOMImageReader();
                _reader.SetDirectoryName(FileDir);
                _reader.SetDataByteOrderToLittleEndian();
                _reader.Update();

                int[] extent = _reader.GetOutput().GetExtent();
                double[] spacing = _reader.GetOutput().GetSpacing();
                double[] origin = _reader.GetOutput().GetOrigin();

                double[] center = new double[3];
                center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]);
                center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]);
                center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]);

                double[] axialElements ={
                    1,0,0,0,
                    0,1,0,0,
                    0,0,1,0,////
                    0,0,0,1
                };//平行于XY平面,轴面

                vtkMatrix4x4 resliceAxes = new vtkMatrix4x4();
                for (int i = 0; i < 4; i++)
                {
                    for (int j = 0; j < 4; j++)
                        resliceAxes.SetElement(i, j, axialElements[i * 4 + j]);
                }

                resliceAxes.SetElement(0, 3, center[0]);
                resliceAxes.SetElement(1, 3, center[1]);
                resliceAxes.SetElement(2, 3, center[2]);
                Console.WriteLine("center[0]:{0},center[1]:{1},center[2]:{2}",center[0],center[1],center[2]);

                reslice = new vtkImageReslice();
                reslice.SetInputConnection(_reader.GetOutputPort());
                reslice.SetOutputDimensionality(2);
                reslice.SetResliceAxes(resliceAxes);
                reslice.SetInterpolationModeToLinear();

                vtkLookupTable colortable = new vtkLookupTable();
                colortable.SetRange(0, 1000);
                colortable.SetValueRange(0.0, 1.0);
                colortable.SetSaturationRange(0.0, 0.0);
                colortable.SetRampToLinear();
                colortable.Build();

                vtkImageMapToColors colormap = new vtkImageMapToColors();
                colormap.SetLookupTable(colortable);
                colormap.SetInputConnection(reslice.GetOutputPort());

                vtkImageActor imgActor = new vtkImageActor();
                imgActor.SetInput(colormap.GetOutput());

                _render.AddActor(imgActor);
                _render.SetBackground(0.4, 0.5, 0.6);

                vtkInteractorStyle imagestyle = new vtkInteractorStyle();

                _iren.SetInteractorStyle(imagestyle);

                _render.ResetCamera();

                _renwin.Render();
                _iren.Initialize();
                _iren.Start();

            }



        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (_iren != null)
                _iren.AnyEvt -= InteractorHandler;
        }

        
    }
}


© 著作权归作者所有

小王爷_2019
粉丝 14
博文 31
码字总数 35373
作品 0
海淀
程序员
私信 提问
计算机图形学平台--VTK

Vtk(visualization toolkit)是一个开放资源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有大约2...

匿名
2010/09/20
11.4K
0
Activiz 使用笔记-3 数据源(1)

activiz本身自带的user guide 比较简单,所以我按着vtk的user guide来慢慢学。从简单例子入手去学习VTK。当然我之前已经看过很多VTK相关的东西了,但是没有自己去写去总结,导致我一段时间不...

小王爷和老王爷
2015/09/07
230
0
Activiz 使用笔记-4 数据源(2)

上一篇写了一些数据源的生成或者读取方法。下面开始严肃的讲一下VTK中的数据集,虽然感觉有时候不会直接去用,但是感觉这个是基础,所以要先看。 直接看《VTK用户手册》的第44页 3.1 可视化v...

小王爷和老王爷
2015/11/24
124
0
VTK5.6安装配置教程

1. 必须下载: vtk-5.6.0-win32.exe vtk-5.6.0.zip 源程序 vtkdata-5.6.0.zip 数据 (vtk相关安装程序下载:http://vtk.org) cmake-2.8.2-win32-x86.zip (cmake程序下载:http://www.cmak......

teacheryang
2010/10/12
0
0
vtk平移、旋转,连接MFC问题总结(拓展VTK 到MFC上,思路说的很好)

最近在用vtk+MFC写一个程序,因为初学vtk,照着vtk的例子实现了一些功能,但是有几个问题深深的困惑了我,久久得不到解决。搜遍网络也没找到相应的例子。今天终于解决了,发出来大家一起学习...

eric_e
2018/04/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springmvc集成cas,并解决前后端分离情况

1.最近项目需要集成已经存在的cas系统。 但是目前已集成的系统都是jsp。而我们项目是前后端分离开发(伪),没有分开部署。 2.cas原理就不介绍了 网上例子很多。基本都是使用302重定向实现的...

起名字什么的太麻烦了
28分钟前
3
0
HDFS-原理

1. 写操作

叶枫啦啦
今天
2
0
聊聊elasticsearch的MembershipAction

序 本文主要研究一下elasticsearch的MembershipAction MembershipAction elasticsearch-6.7.1/server/src/main/java/org/elasticsearch/discovery/zen/MembershipAction.java public class M......

go4it
今天
3
0
Redis集群

Redis cluster tutorial Redis集群提供一种方式自动将数据分布在多个Redis节点上。 Redis Cluster provides a way to run a Redis installation where data is automatically sharded acros......

OSC首席混子
今天
3
0
AWS codecommit 触发jenkins工作

在gitlab和github上面都有直接发送webhook的配置,但是在AWS上面是没有的直接配置webhook触发jenkins构建的设置的。 通过查看AWS多个service的官方文档,找到了解决方案,方案如下: (1)在c...

守护-创造
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部