• 问题反馈可发送邮件到stubbornhuang@qq.com

  • 感谢大家访问本站,希望本站的内容可以帮助到大家!

  • 如果觉得本站的内容有帮助,可以考虑打赏博主哦!

  • 本站由于前段时间遭受到大量临时和国外邮箱注册,所以对可注册的邮箱类型进行了限制!

  • 欢迎大家交换友链,可在https://www.stubbornhuang.com/申请友情链接进行友链交换申请!

  • 本站会放置Google广告用于维持域名以及网站服务器费用。

  • 计算机图形学与计算几何经典必备书单整理,下载链接可参考:https://www.stubbornhuang.com/1256/

  • 工资「喂饱肚子」,副业「养活灵魂」!

  • 在本站开通年度VIP,无限制下载本站资源和阅读本站文章

VTK读取序列的Dicom医学图片,用Marchingcube进行重建,并保存为obj文件

VTK 发布于2019-11-04 阅读 10,920次 5次评论 2次点赞 本文共7058个字,阅读需要18分钟。

1 代码版本

代码针对于VTK版本5.10,新版本仅供参考。

2 VTK5.10版本示例代码

#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkDICOMImageReader.h"
#include "vtkMarchingCubes.h"
#include "vtkStripper.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkSmartPointer.h"
#include "vtkProperty.h"
#include "vtkCamera.h"
#include "vtkOutlineFilter.h"
#include "vtkOBJExporter.h"

void main()
{
    vtkSmartPointer<vtkRenderer>ren=vtkSmartPointer<vtkRenderer>::New();             //设置绘制者(绘制对象指针)
    vtkSmartPointer<vtkRenderWindow>renWin=vtkSmartPointer<vtkRenderWindow>::New();         //设置绘制窗口
    renWin->AddRenderer(ren);                                 //将绘制者加入绘制窗口

    vtkSmartPointer<vtkRenderWindowInteractor>iren=vtkSmartPointer<vtkRenderWindowInteractor>::New();//设置绘制交互操作窗口的
    iren->SetRenderWindow(renWin);                             //将绘制窗口添加到交互窗口

    vtkSmartPointer<vtkDICOMImageReader>Reader=vtkSmartPointer<vtkDICOMImageReader>::New(); //创建读取dicom图片指针对象
    Reader->SetDirectoryName("E:\\dcm\\dcm"); //设置医学图像文件夹路径
    Reader->SetDataByteOrderToLittleEndian();
    Reader->Update();
    cout<<"读取数据完成"<<endl;


    //////////////////////////////////////////////
    vtkSmartPointer<vtkMarchingCubes>marchingcube=vtkSmartPointer<vtkMarchingCubes>::New();       //建立一个Marching Cubes 算法的对象    
    //marchingcube->SetInput((vtkDataSet *)Reader->GetOutput());      //获得所读取的数据
    marchingcube->SetInputConnection(Reader->GetOutputPort());      //第二种读取数据的方法
    marchingcube->SetValue(0,140);                                  //提取出灰度值为45的东西

    vtkSmartPointer<vtkStripper>Stripper=vtkSmartPointer<vtkStripper>::New();                   //建立三角带对象
    Stripper->SetInput( marchingcube->GetOutput() );              //将生成的三角片连接成三角带

    vtkSmartPointer<vtkPolyDataMapper>Mapper=vtkSmartPointer<vtkPolyDataMapper>::New();   //建立一个数据映射对象
    Mapper->SetInput(Stripper->GetOutput() );            //将三角带映射为几何数据
    Mapper->ScalarVisibilityOff();

    vtkSmartPointer<vtkActor>actor=vtkSmartPointer<vtkActor>::New();                            //建立一个代表皮肤的演员
    actor->SetMapper(Mapper);                                  //获得皮肤几何数据的属性
    actor->GetProperty()->SetDiffuseColor(1, .49, .25);            //设置皮肤颜色的属性//(1, .49, .25)
    //actor->GetProperty()->SetDiffuseColor(1, 1, .25);
    actor->GetProperty()->SetSpecular(0.3);                         //设置反射率
    actor->GetProperty()->SetSpecularPower(20);                    //设置反射光强度 
    actor->GetProperty()->SetOpacity(1.0);                 
    actor->GetProperty()->SetColor(1,0,0);                 //设置角色的颜色
    actor->GetProperty()->SetRepresentationToWireframe();


    vtkSmartPointer<vtkCamera>aCamera=vtkSmartPointer<vtkCamera>::New();     // 创建摄像机
    aCamera->SetViewUp ( 0, 0, -1 );        //设置相机的“上”方向
    aCamera->SetPosition ( 0, 1, 0 );       //位置:世界坐标系,设置相机位置
    aCamera->SetFocalPoint( 0, 0, 0 );     //焦点:世界坐标系,控制相机方向
    aCamera->ComputeViewPlaneNormal();     //重置视平面法向,基于当前的位置和焦点。否则会出现斜推剪切效果

    ///////////////////////////////////////
    vtkSmartPointer<vtkOutlineFilter>outlinefilter=vtkSmartPointer<vtkOutlineFilter>::New();
    outlinefilter->SetInputConnection(Reader->GetOutputPort());

    vtkSmartPointer<vtkPolyDataMapper>outlineMapper=vtkSmartPointer<vtkPolyDataMapper>::New();
    outlineMapper->SetInputConnection(outlinefilter->GetOutputPort());

    vtkSmartPointer<vtkActor>OutlineActor=vtkSmartPointer<vtkActor>::New();
    OutlineActor->SetMapper(outlineMapper);
    OutlineActor->GetProperty()->SetColor(0,0,0);
    // 告诉绘制者将要在绘制窗口中进行显示的演员
    ren->AddActor(actor);
    ren->AddActor(OutlineActor);

    ren->SetActiveCamera(aCamera);               ////设置渲染器的相机
    ren->ResetCamera();
    aCamera->Dolly(1.5);                //使用Dolly()方法沿着视平面法向移动相机,实现放大或缩小可见角色物体
    ren->SetBackground(1,1,1);               //设置背景颜色
    //ren->ResetCameraClippingRange();
    renWin->SetSize(1000, 600);
    renWin->Render();
    iren->Initialize();
    iren->Start(); 
    vtkSmartPointer<vtkOBJExporter> porter=vtkSmartPointer<vtkOBJExporter>::New();
    porter->SetFilePrefix("E:\\PolyDataWriter.obj");
    porter->SetInput(renWin);
    porter->Write();

}

3 VTK6.0以上版本代码

第三节中代码是VTK5.10版本所适用的,有一些小伙伴发现使用高版本如VTK6.0,VTK7.0的时候,数据传输会发现错误,是因为高版本的改变了数据的传输方式,需要改变数据连接方式,如将
Mapper->SetInput(Stripper->GetOutput() ); //将三角带映射为几何数据
修改为
Mapper->SetInputConnection(Stripper->GetOutputPort() ); //将三角带映射为几何数据

完整代码为:

#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkDICOMImageReader.h"
#include "vtkMarchingCubes.h"
#include "vtkStripper.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkSmartPointer.h"
#include "vtkProperty.h"
#include "vtkCamera.h"
#include "vtkOutlineFilter.h"
#include "vtkOBJExporter.h"

void main()
{
    vtkSmartPointer<vtkRenderer>ren=vtkSmartPointer<vtkRenderer>::New();             //设置绘制者(绘制对象指针)
    vtkSmartPointer<vtkRenderWindow>renWin=vtkSmartPointer<vtkRenderWindow>::New();         //设置绘制窗口
    renWin->AddRenderer(ren);                                 //将绘制者加入绘制窗口

    vtkSmartPointer<vtkRenderWindowInteractor>iren=vtkSmartPointer<vtkRenderWindowInteractor>::New();//设置绘制交互操作窗口的
    iren->SetRenderWindow(renWin);                             //将绘制窗口添加到交互窗口

    vtkSmartPointer<vtkDICOMImageReader>Reader=vtkSmartPointer<vtkDICOMImageReader>::New(); //创建读取dicom图片指针对象
    Reader->SetDirectoryName("C:\\Users\\Administrator\\Desktop\\医学CT图片\\COU IV"); //设置医学图像文件夹路径
    Reader->SetDataByteOrderToLittleEndian();
    Reader->Update();
    cout<<"读取数据完成"<<endl;


    //////////////////////////////////////////////
    vtkSmartPointer<vtkMarchingCubes>marchingcube=vtkSmartPointer<vtkMarchingCubes>::New();       //建立一个Marching Cubes 算法的对象    
    //marchingcube->SetInput((vtkDataSet *)Reader->GetOutput());      //获得所读取的数据
    marchingcube->SetInputConnection(Reader->GetOutputPort());      //第二种读取数据的方法
    marchingcube->SetValue(0,140);                                  //提取出灰度值为45的东西

    vtkSmartPointer<vtkStripper>Stripper=vtkSmartPointer<vtkStripper>::New();                   //建立三角带对象
    Stripper->SetInputConnection( marchingcube->GetOutputPort());              //将生成的三角片连接成三角带

    vtkSmartPointer<vtkPolyDataMapper>Mapper=vtkSmartPointer<vtkPolyDataMapper>::New();   //建立一个数据映射对象
    Mapper->SetInputConnection(Stripper->GetOutputPort() );            //将三角带映射为几何数据
    Mapper->ScalarVisibilityOff();

    vtkSmartPointer<vtkActor>actor=vtkSmartPointer<vtkActor>::New();                            //建立一个代表皮肤的演员
    actor->SetMapper(Mapper);                                  //获得皮肤几何数据的属性
    actor->GetProperty()->SetDiffuseColor(1, .49, .25);            //设置皮肤颜色的属性//(1, .49, .25)
    //actor->GetProperty()->SetDiffuseColor(1, 1, .25);
    actor->GetProperty()->SetSpecular(0.3);                         //设置反射率
    actor->GetProperty()->SetSpecularPower(20);                    //设置反射光强度 
    actor->GetProperty()->SetOpacity(1.0);                 
    actor->GetProperty()->SetColor(1,0,0);                 //设置角色的颜色
    actor->GetProperty()->SetRepresentationToWireframe();


    vtkSmartPointer<vtkCamera>aCamera=vtkSmartPointer<vtkCamera>::New();     // 创建摄像机
    aCamera->SetViewUp ( 0, 0, -1 );        //设置相机的“上”方向
    aCamera->SetPosition ( 0, 1, 0 );       //位置:世界坐标系,设置相机位置
    aCamera->SetFocalPoint( 0, 0, 0 );     //焦点:世界坐标系,控制相机方向
    aCamera->ComputeViewPlaneNormal();     //重置视平面法向,基于当前的位置和焦点。否则会出现斜推剪切效果

    ///////////////////////////////////////
    vtkSmartPointer<vtkOutlineFilter>outlinefilter=vtkSmartPointer<vtkOutlineFilter>::New();
    outlinefilter->SetInputConnection(Reader->GetOutputPort());

    vtkSmartPointer<vtkPolyDataMapper>outlineMapper=vtkSmartPointer<vtkPolyDataMapper>::New();
    outlineMapper->SetInputConnection(outlinefilter->GetOutputPort());

    vtkSmartPointer<vtkActor>OutlineActor=vtkSmartPointer<vtkActor>::New();
    OutlineActor->SetMapper(outlineMapper);
    OutlineActor->GetProperty()->SetColor(0,0,0);
    // 告诉绘制者将要在绘制窗口中进行显示的演员
    ren->AddActor(actor);
    ren->AddActor(OutlineActor);

    ren->SetActiveCamera(aCamera);               ////设置渲染器的相机
    ren->ResetCamera();
    aCamera->Dolly(1.5);                //使用Dolly()方法沿着视平面法向移动相机,实现放大或缩小可见角色物体
    ren->SetBackground(1,1,1);               //设置背景颜色
    //ren->ResetCameraClippingRange();
    renWin->SetSize(1000, 600);
    renWin->Render();
    iren->Initialize();
    iren->Start(); 
    vtkSmartPointer<vtkOBJExporter> porter=vtkSmartPointer<vtkOBJExporter>::New();
    porter->SetFilePrefix("E:\\PolyDataWriter.obj");
    porter->SetInput(renWin);
    porter->Write();

}

4 结果示例

VTK读取序列的Dicom医学图片,用Marchingcube进行重建,并保存为obj文件-第0张图片
VTK读取序列的Dicom医学图片,用Marchingcube进行重建,并保存为obj文件-第1张图片
VTK读取序列的Dicom医学图片,用Marchingcube进行重建,并保存为obj文件-第2张图片

欢迎扫码关注我的微信公众号,及时获取文章更新

微信公众号二维码

本文作者:StubbornHuang

版权声明:本文为站长原创文章,如果转载请注明原文链接!

原文标题:VTK读取序列的Dicom医学图片,用Marchingcube进行重建,并保存为obj文件

原文链接:https://www.stubbornhuang.com/200/

发布于:2019年11月04日 23:21:14

修改于:2023年06月26日 23:01:31

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

文章末尾
上一篇
WordPress - Windows使用PhpStudy本地部署WordPress
WordPress
下一篇
C++读取Shp文件并将Shp转化为DXF
C++
当前分类随机文章推荐

发表评论

您必须 [ 登录 ] 才能发表留言!

全部评论:5条

加载中...
  1. StubbornHuang Blog-lym头像
    lym 2022-11-21 15:05 来自天朝的朋友 谷歌浏览器 Windows 10 山东省济南市 联通

    我有安装 VTK环境,
    环境是:全新的C++控制台程序
    语言标准是: ISO C++14
    Windows SDK是:10.0

    已经事先编译好了VTK目录,版本为: 9.2.2
    配置过程是:
    1.在项目->属性->配置属性->VC++目录->包含目录里添加vtk的include文件夹。
    2.在项目->属性->配置属性->链接器 附加库目录里添加vtk的lib文件夹。
    3.在vtk的lib文件夹内新建一个txt文件,将DIR *.lib /B >LIBLIST.TXT写入文件保存,改后缀.txt为.bat并运行,这是在目录生成了一个新的.txt文件,文件存有所有lib文件的名字。
    4.在vtk的lib文件夹内新建一个txt文件,将DIR *.lib /B >LIBLIST.TXT写入文件保存,改后缀.txt为.bat并运行,这是在目录生成了一个新的.txt文件,文件存有所有lib文件的名字。
    5.编辑项目->属性->配置属性->链接器->输入 附加依赖项,将4.生成的所有lib文件的名字粘贴进去。
    6.在项目->属性->配置属性->调试 环境 写入PATH=生成的vtk dll文件的目录(bin文件夹)

    但是代码无法编译通过,错误提示是 “无法打开源 xxx.h” 代码内所有关于VTK的 .h头文件都提示无法找到

    • StubbornHuang Blog-lym头像
      lym 2022-11-21 15:07 来自天朝的朋友 谷歌浏览器 Windows 10 山东省济南市 联通

      我在VTK的编译目录的include/vtk-9.2文件夹下,有看到所有的头文件 xxx.h

      • StubbornHuang Blog-StubbornHuang头像
        StubbornHuang 站长 2022-11-21 15:50 来自天朝的朋友 谷歌浏览器 Windows 10 湖南省 电信

        配环境不至于问吧,建议度娘

        • StubbornHuang Blog-lym头像
          lym 2022-11-21 15:52 这家伙可能用了美佬的代理 谷歌浏览器 Windows 10 美国 Xerox

          按照教程试过了,没进展,现在发现不能用VS直接编译,用CMake编译成项目再VS打开就可以

          • StubbornHuang Blog-StubbornHuang头像
            StubbornHuang 站长 2022-11-21 15:53 来自天朝的朋友 谷歌浏览器 Windows 10 湖南省 电信

            多年不弄这个了,建议按官方教程来,之前编译就是用cmake

关注我们的公众号

微信公众号