获取一个三维物体在某个特定点的三视图可以使用vtk的vtkImageReslice实现.首先是定义一些变量,初始化信息。在.h中定义。

vtkSmartPointer<vtkXMLImageDataReader> pXMLImageDataReader = vtkSmartPointer<vtkXMLImageDataReader>::New();
vtkSmartPointer<vtkImageCast> pImageCast = vtkSmartPointer<vtkImageCast>::New();
vtkSmartPointer<vtkImageReslice> pImageResliceX = vtkSmartPointer<vtkImageReslice>::New();
vtkSmartPointer<vtkImageReslice> pImageResliceY = vtkSmartPointer<vtkImageReslice>::New();
vtkSmartPointer<vtkImageReslice> pImageResliceZ = vtkSmartPointer<vtkImageReslice>::New();
vtkSmartPointer<vtkImageMapToColors> pImageMapToColorsX = vtkSmartPointer<vtkImageMapToColors>::New();
vtkSmartPointer<vtkImageMapToColors> pImageMapToColorsY = vtkSmartPointer<vtkImageMapToColors>::New();
vtkSmartPointer<vtkImageMapToColors> pImageMapToColorsZ = vtkSmartPointer<vtkImageMapToColors>::New();
vtkSmartPointer<vtkWindowLevelLookupTable>pWindowLevelLookupTable = vtkSmartPointer<vtkWindowLevelLookupTable>::New();
vtkSmartPointer<vtkImageActor> pImageActorX = vtkSmartPointer<vtkImageActor>::New();
vtkSmartPointer<vtkImageActor> pImageActorY = vtkSmartPointer<vtkImageActor>::New();
vtkSmartPointer<vtkImageActor> pImageActorZ = vtkSmartPointer<vtkImageActor>::New();
vtkSmartPointer<vtkRenderer> pRendererX = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderer> pRendererY = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderer> pRendererZ = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> pRenderWindow = vtkSmartPointer<vtkRenderWindow>::New();

定义一个函数,显示四视图(包括原始三维物体)。Show4DView().

Show4DView()
{pXMLImageDataReader->SetFileName("imagedata22stl.vti");pXMLImageDataReader->Update();//三视图int extent[6];  double spacing[3];  double origin[3];pXMLImageDataReader->GetUpdateExtent(extent);  pXMLImageDataReader->GetOutput()->GetSpacing(spacing);  pXMLImageDataReader->GetOutput()->GetOrigin(origin);  // 计算中心位置。double center[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]);centers[0] = center[0];centers[1] = center[1];centers[2] = center[2];pWindowLevelLookupTable->SetWindow(200);  pWindowLevelLookupTable->SetLevel(100);pImageCast->SetInputConnection(pXMLImageDataReader->GetOutputPort());pImageCast->SetOutputScalarTypeToChar();pImageCast->ClampOverflowOn();pImageCast->Update();pImageCast->SetUpdateExtentToWholeExtent();//xpImageResliceX->SetInputConnection(pImageCast->GetOutputPort());pImageResliceX->SetOutputDimensionality(2);pImageResliceX->SetResliceAxesDirectionCosines(sagittalX, sagittalY, sagittalZ);pImageResliceX->SetResliceAxesOrigin(center);pImageResliceX->SetInterpolationModeToLinear();pImageResliceX->Update();//pImageMapToColorsX->SetLookupTable(pWindowLevelLookupTable);//pImageMapToColorsX->SetInputConnection(pImageResliceX->GetOutputPort());pImageActorX->SetInputData(pImageResliceX->GetOutput());pImageActorX->SetPosition(0,0,0);pImageActorX->Update();//ypImageResliceY->SetInputConnection(pImageCast->GetOutputPort());pImageResliceY->SetOutputDimensionality(2);pImageResliceY->SetResliceAxesDirectionCosines(coronalX, coronalY, coronalZ);pImageResliceY->SetResliceAxesOrigin(center);pImageResliceY->SetInterpolationModeToLinear();pImageResliceY->Update();pImageActorY->SetInputData(pImageResliceY->GetOutput());pImageActorY->SetPosition(0,0,0);pImageActorY->Update();//pImageMapToColorsX->SetLookupTable(pWindowLevelLookupTable);//pImageMapToColorsX->SetInputConnection(pImageResliceX->GetOutputPort());//zpImageResliceZ->SetInputConnection(pImageCast->GetOutputPort());pImageResliceZ->SetOutputDimensionality(2);pImageResliceZ->SetResliceAxesDirectionCosines(axialX, axialY, axialZ);pImageResliceZ->SetResliceAxesOrigin(center);pImageResliceZ->SetInterpolationModeToLinear();pImageResliceZ->Update();pImageActorZ->SetInputData(pImageResliceZ->GetOutput());pImageActorZ->SetPosition(0,0,0);pImageActorZ->Update();//pImageMapToColorsX->SetLookupTable(pWindowLevelLookupTable);//pImageMapToColorsX->SetInputConnection(pImageResliceX->GetOutputPort());pDataSetMapper->SetInputConnection(pXMLImageDataReader->GetOutputPort());pActor->SetMapper(pDataSetMapper);float fOpac = 0.5;pActor->GetProperty()->SetOpacity(fOpac);//绘制圆锥代表相机。vtkSmartPointer<vtkConeSource> pConeSource = vtkSmartPointer<vtkConeSource>::New();pConeSource->SetHeight(10.0);pConeSource->SetRadius(5.0);pConeSource->Update();vtkSmartPointer<vtkPolyDataMapper> mappers = vtkSmartPointer<vtkPolyDataMapper>::New();mappers->SetInputData(pConeSource->GetOutput());vtkSmartPointer<vtkActor> actors = vtkSmartPointer<vtkActor>::New();actors->SetMapper(mappers);actors->GetProperty()->SetColor(1,0,0);pRendererX->AddActor(pImageActorX);pRendererY->AddActor(pImageActorY);pRendererZ->AddActor(pImageActorZ);pRenderer->AddActor(pActor);pRenderer->AddActor(actors);vtkMyCallback *mo1 = vtkMyCallback::New();mo1->pImageReslicex = pImageResliceX;mo1->pImageReslicey = pImageResliceY;mo1->pImageReslicez = pImageResliceZ;mo1->rwin=pRenderWindow;mo1->fopac = fOpac;actors->AddObserver(vtkCommand::ModifiedEvent,mo1);pRenderer->SetBackground(1,1,1);pRendererX->SetBackground(0,0,0);pRendererY->SetBackground(0,0,0);pRendererZ->SetBackground(0,0,0);pRenderer->SetViewport( 0, 0 , 0.6, 1 );pRendererX->SetViewport( 0.6, 0.66, 1, 1 );pRendererY->SetViewport(0.6,0.33,1,0.66);pRendererZ->SetViewport(0.6,0,1,0.33);pRenderWindow->AddRenderer(pRendererX);pRenderWindow->AddRenderer(pRendererY);pRenderWindow->AddRenderer(pRendererZ);pRenderWindow->AddRenderer(pRenderer);pRenderWindowInteractor->SetRenderWindow(pRenderWindow);pRenderWindow->Render();for (int i=0;i<10;i++){center[0]++;                       center[1]++;center[2]++;actors->SetPosition(i*10,i*10,i*10);Sleep(1000);}pRenderWindowInteractor->Initialize();pRenderWindowInteractor->Start();
}

其中的回调函数是为了实现实时显示三视图的功能,只是一个demo。

回调函数:

static double centers[3]={0,0,0};
static int nCount = 0;
class vtkMyCallback : public vtkCommand
{
public:static vtkMyCallback *New(){return new vtkMyCallback;}virtual void Execute(vtkObject *caller, unsigned long, void*)  {//将传入参数强制转换成render类型  vtkActor *actor = reinterpret_cast<vtkActor*>(caller);//actor->GetProperty()->SetOpacity(fopac);//然后输出相机的位置信息nCount++;centers[0] += 10;centers[1] += 10;centers[2] += 10;pImageReslicex->SetResliceAxesOrigin(centers);pImageReslicey->SetResliceAxesOrigin(centers);pImageReslicez->SetResliceAxesOrigin(centers);pImageReslicex->Update();pImageReslicey->Update();pImageReslicez->Update();rwin->Render();}
public:vtkMyCallback():rwin(0){pImageReslicex=NULL;pImageReslicey=NULL;pImageReslicez=NULL;}vtkRenderWindow *rwin;float fopac;vtkImageReslice* pImageReslicex;vtkImageReslice* pImageReslicey;vtkImageReslice* pImageReslicez;
};

vtk 的vtkimagereslice实现三视图的显示相关推荐

  1. vue + vtk.js读取CT序列,显示3d影像(三个面显示)

    vtk.js官网示例中,显示CT序列,都是以vti文件格式为例进行读取.但是在实际项目中,一般都是以.dcm为后缀的dicom影像,目前在vtk.js官网中,没有找到直接读取dicom序列的API.故 ...

  2. VTK学习之路——读取并显示raw体数据文件

    数据比较难找,老板给了个网址,里面很多数据可以下载: https://klacansky.com/open-scivis-datasets/sorted-by-size.html 数据文件类型(raw ...

  3. VTK修炼之道57:图形基本操作进阶_点云配准技术(LandMark标记点算法和坐标系显示方法)

    1.点云配准 在计算机逆向工程中,通过三维扫描等实物数字化技术可以获取各种点云数据.但是受到测量环境和设备的影响,再一次测量的情况下,难以获取实物整体的点云数据,因此需要多次从不同角度进行测量.但不同 ...

  4. VTK教程系列:VTK基础及应用开发教程

    由于OpenCV不能使用,只能使用VTK库的图像处理库,暂时还没有找到其他可以全面替代的库: CSDN东灵工作室:http://blog.csdn.net/www_doling_net/article ...

  5. VTK修炼之道26:图像基本操作_三维图像切片提取

    1.三维图像切片提取 切片是指三维图像中的一个切面对应的图像.切面可以是过图像内部一点且平行于XY.YZ.XZ平面的平面,也可以是任意的过三维图像内部一点任意方向的平面.通过提取切片可以方便的浏览和分 ...

  6. VTK:可视化之HideActor

    VTK:可视化之HideActor VTK:可视化之HideActor 描述 代码 HideActor.cxx CMakeLists.txt VTK:可视化之HideActor 描述 显示两个球体,然 ...

  7. VTK:可视化之HideAllActors

    VTK:可视化之HideAllActors VTK:可视化之HideAllActors 描述 代码 HideAllActors.cxx CMakeLists.txt VTK:可视化之HideAllAc ...

  8. QT显示框架嵌入Vs控制台工程

      一.一些准备工作: 1.安装Qt for VS 的插件: 安装Qt for VS 的插件 下载地址:http://download.qt.io/official_releases/vsaddin/ ...

  9. VTK笔记-图形相关-圆锥体-vtkConeSoure类

    圆锥体 文章目录 圆锥体 前言 一.代码 1.1流程 二.遇到的问题 1.运行时异常 2.在ThinkPad E530C笔记本上出现的异常 3.运行结果 三.相机旋转 四.vtkConeSource ...

最新文章

  1. [剑指Offer]5.二维数组中的查找
  2. 计算硼原子的基态能级的java程序
  3. H.264学习历程(天之骄子)
  4. 中文python笔记_python 中文编码笔记
  5. Linux下使用wget下载FTP服务器文件
  6. 卡尔曼滤波器实例:进一步讨论自由落体运动
  7. 华为鸿蒙系统手机匹配,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  8. POJ-2528 Mayor's posters 线段树+离散化 或 DFS
  9. 自学java 第十章内部类(一)
  10. eclipse 安装python开发工具 PyDev
  11. 开启弹窗_PC端广告弹窗拦截
  12. Android 安全架构及权限控制机制剖析
  13. eclipse 安装 阿里代码规范检测插件
  14. 电子厂计算机维修周记,电子厂实习周记【三篇】【完整版】
  15. 善于学习——总结经验
  16. OpenWRT设置ADGuardHome+小喵咪
  17. 反向延长线段什么意思_《反向延长线》
  18. 网络协议丨FTP协议和P2P协议
  19. 10款PHP开源电子商务系统
  20. pta mysql训练题集(241-260)

热门文章

  1. oracle根据关键字搜索存储过程
  2. 通过access口加vlan标签吗_如何理解:“Access端口加入的VLAN必须已经存在并且不能是VLAN 1;Hybrid端口加入的VLAN必须已经存在;Trun...
  3. 兔子繁殖问题----Python
  4. 小程序获取用户头像、昵称
  5. 无线遥控开关 开关和遥控器配对学习
  6. 微信小程序中层叠轮播图(仿微信朋友圈swiper样式)
  7. the OCD JTAG adapter was detected ,but there is...
  8. php实现微信一键登录,PHP如何实现微信的授权登录
  9. 读书笔记004:《伤寒论》- 手阳明大肠经
  10. Python高级动态绘图系统:复杂曲线的轨迹演示