版本:vtk9.2.0+vs2022

主要功能如下:根据三正交切片的位置联动显示其他窗口切片,在三正交切片调整窗宽窗位后其他三视图同步窗宽窗位,并显示切片序号

#include <vtkActor.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkObjectFactory.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
// headers needed for this example
#include <vtkActor2D.h>
#include <vtkDICOMImageReader.h>
#include <vtkImageViewer2.h>
#include <vtkInteractorStyleImage.h>
#include <vtkTextMapper.h>
#include <vtkTextProperty.h>
#include<vtkSmartPointer.h>
#include <vtkLookupTable.h>
#include <vtkImageMapToColors.h>
#include <vtkImageActor.h>
#include<vtkScalarBarWidget.h>
#include<vtkScalarBarActor.h>
#include <vtkAxesActor.h>
#include <vtkImageData.h>
#include <vtkImagePlaneWidget.h>
#include <vtkCellPicker.h>
#include <vtkProperty.h>
#include <vtkCamera.h>
#include <vtkActor.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkObjectFactory.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
// headers needed for this example
#include <vtkOrientationMarkerWidget.h>
#include <vtkDICOMImageReader.h>
#include <vtkImageReader2.h>
#include <vtkImageViewer2.h>
#include <vtkInteractorStyleImage.h>
#include <vtkTextMapper.h>
#include<vtkImageFlip.h>
#include<vtkImageMapper3D.h>
#include<vtkTextActor.h>
// needed to easily convert int to std::string
#include <sstream>
#include<vtkImageMapToWindowLevelColors.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)
#include<vtkCommand.h>
#include <vtkImagePlaneWidget.h>
#include<vtkImageMapToWindowLevelColors.h>
class vtkMyCall : public vtkCommand  //更新三视图中的x,y,z标签显示并使三视图的窗宽窗位同三正交切片保持一致
{
public:static vtkMyCall* New(){return new vtkMyCall;}void Execute(vtkObject* caller, unsigned long vtkNotUsed(event), void* callData){vtkImagePlaneWidget* self = reinterpret_cast<vtkImagePlaneWidget*>(caller);pos[0] = WidgetX->GetSliceIndex();//获取三正交切片序号pos[1] = WidgetY->GetSliceIndex();pos[2] = WidgetZ->GetSliceIndex();std::string strx = "x:" + std::to_string(pos[0]);std::string stry = "y:" + std::to_string(pos[1]);std::string strz = "z:" + std::to_string(pos[2]);textActorx->SetInput(strx.c_str());      //显示序号文本在三视图窗口上textActory->SetInput(stry.c_str());textActorz->SetInput(strz.c_str());}vtkMyCall() :WidgetX(0), WidgetY(0), WidgetZ(0) {}vtkImagePlaneWidget* WidgetX;vtkImagePlaneWidget* WidgetY;vtkImagePlaneWidget* WidgetZ;int* pos;vtkSmartPointer<vtkTextActor> textActorx;vtkSmartPointer<vtkTextActor> textActory;vtkSmartPointer<vtkTextActor> textActorz;};
#include <vtkImagePlaneWidget.h>
#include<vtkImageMapToWindowLevelColors.h>
class vtkMyCallback : public vtkCommand //在三正交切片中同步三个切片的窗宽窗位
{
public:static vtkMyCallback* New(){return new vtkMyCallback;}void Execute(vtkObject* caller, unsigned long vtkNotUsed(event), void* callData){vtkImagePlaneWidget* self = reinterpret_cast<vtkImagePlaneWidget*>(caller);if (!self) return;double* wl = static_cast<double*>(callData);if (self == this->WidgetX){this->WidgetY->SetWindowLevel(wl[0], wl[1]);this->WidgetZ->SetWindowLevel(wl[0], wl[1]);}else if (self == this->WidgetY){this->WidgetX->SetWindowLevel(wl[0], wl[1]);this->WidgetZ->SetWindowLevel(wl[0], wl[1]);}else if (self == this->WidgetZ){this->WidgetX->SetWindowLevel(wl[0], wl[1]);this->WidgetY->SetWindowLevel(wl[0], wl[1]);}windowLevelx->SetWindow(wl[0]);windowLevelx->SetLevel(wl[1]);windowLevely->SetWindow(wl[0]);windowLevely->SetLevel(wl[1]);windowLevelz->SetWindow(wl[0]);windowLevelz->SetLevel(wl[1]);windowLevelx->Update();windowLevely->Update();windowLevelz->Update();}vtkMyCallback() :WidgetX(0), WidgetY(0), WidgetZ(0) {}vtkImagePlaneWidget* WidgetX;vtkImagePlaneWidget* WidgetY;vtkImagePlaneWidget* WidgetZ;vtkImageMapToWindowLevelColors* windowLevelx;vtkImageMapToWindowLevelColors* windowLevely;vtkImageMapToWindowLevelColors* windowLevelz;};
int main(int argc, char* argv[]){vtkNew<vtkNamedColors> colors;vtkSmartPointer <vtkDICOMImageReader> reader1 = vtkSmartPointer <vtkDICOMImageReader>::New();// Verify input argumentsvtkSmartPointer<vtkImageFlip> reader;vtkSmartPointer <vtkImagePlaneWidget> imagePlaneX;vtkSmartPointer <vtkImagePlaneWidget> imagePlaneY;vtkSmartPointer <vtkImagePlaneWidget> imagePlaneZ;vtkSmartPointer <vtkOrientationMarkerWidget> orientationWidget;reader1->SetDirectoryName("D:\\Final_HW\\MainWidget\\CorCTA  0.75  B25f  Diastole 65%-unzip");//dicom序列文件夹位置reader1->Update();//std::string folder = path;// Read all the DICOM files in the specified directory.reader = vtkSmartPointer<vtkImageFlip>::New();;reader->SetInputData(reader1->GetOutput());reader->Update();// Get the dimensions of the image.int dimensions[3] = { 0,0,0 };reader->GetOutput()->GetDimensions(dimensions);//三正交切片的初始化//Init the vtkImagePlaneWidget for the x、y、z orientation.imagePlaneX = vtkSmartPointer<vtkImagePlaneWidget>::New();imagePlaneY = vtkSmartPointer<vtkImagePlaneWidget>::New();imagePlaneZ = vtkSmartPointer<vtkImagePlaneWidget>::New();orientationWidget = vtkSmartPointer<vtkOrientationMarkerWidget>::New();//Init the picker for the vtkImagePlaneWidget.vtkNew<vtkCellPicker> picker;//Set the property of the imagePlane.imagePlaneX->SetInputConnection(reader->GetOutputPort());//this->imagePlaneX->SetInputData(reader->GetOutput());imagePlaneX->SetPicker(picker);imagePlaneX->RestrictPlaneToVolumeOn();imagePlaneX->GetMarginProperty()->SetOpacity(0);imagePlaneX->SetMarginSizeX(0);imagePlaneX->SetMarginSizeY(0);imagePlaneX->DisplayTextOn();imagePlaneX->SetResliceInterpolateToLinear();imagePlaneX->SetPlaneOrientationToXAxes();imagePlaneX->SetWindowLevel(800, 400, 0);//设置窗宽窗位imagePlaneX->SetSliceIndex(dimensions[0] / 2);//初始化切片位置imagePlaneX->SetLeftButtonAction(1);imagePlaneX->SetMiddleButtonAction(0);imagePlaneX->GetTexturePlaneProperty()->SetOpacity(1);imagePlaneY->SetInputConnection(reader->GetOutputPort());//this->imagePlaneY->SetInputData(reader->GetOutput());imagePlaneY->SetPicker(picker);imagePlaneY->RestrictPlaneToVolumeOn();imagePlaneY->GetMarginProperty()->SetOpacity(0);imagePlaneY->SetMarginSizeX(0);imagePlaneY->SetMarginSizeY(0);imagePlaneY->DisplayTextOn();imagePlaneY->SetResliceInterpolateToLinear();imagePlaneY->SetPlaneOrientationToYAxes();imagePlaneY->SetWindowLevel(800, 400, 0);imagePlaneY->SetSliceIndex(dimensions[1] / 2);//初始化切片位置imagePlaneY->SetLeftButtonAction(1);imagePlaneY->SetMiddleButtonAction(0);imagePlaneY->GetTexturePlaneProperty()->SetOpacity(1);imagePlaneZ->SetInputConnection(reader->GetOutputPort());//this->imagePlaneZ->SetInputData(reader->GetOutput());imagePlaneZ->SetPicker(picker);imagePlaneZ->RestrictPlaneToVolumeOn();imagePlaneZ->GetMarginProperty()->SetOpacity(0);imagePlaneZ->SetMarginSizeX(0);imagePlaneZ->SetMarginSizeY(0);imagePlaneZ->DisplayTextOn();imagePlaneZ->SetResliceInterpolateToLinear();imagePlaneZ->SetPlaneOrientationToZAxes();imagePlaneZ->SetWindowLevel(800, 400, 0);imagePlaneZ->SetSliceIndex(dimensions[2] / 2);//初始化切片位置imagePlaneZ->SetLeftButtonAction(1);imagePlaneZ->SetMiddleButtonAction(0);imagePlaneZ->GetTexturePlaneProperty()->SetOpacity(1);// initialize rendering and interactionvtkNew<vtkRenderer> renderer;vtkNew<vtkRenderWindow> renderWindow;renderWindow->AddRenderer(renderer);renderWindow->SetSize(800, 800);renderWindow->SetWindowName("3D");vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;renderWindowInteractor->SetRenderWindow(renderWindow);vtkNew<vtkInteractorStyleTrackballCamera> style;renderWindowInteractor->SetInteractorStyle(style);// vtkOrientationMarkerWidgetvtkNew<vtkAxesActor> iconActor;//xyz轴标orientationWidget->SetOutlineColor(0.9300, 0.5700, 0.1300);//设置rgb颜色orientationWidget->SetOrientationMarker(iconActor);orientationWidget->SetInteractor(renderWindowInteractor);orientationWidget->SetViewport(0.0, 0.0, 0.1, 0.1);orientationWidget->SetEnabled(1);orientationWidget->InteractiveOn();imagePlaneX->SetDefaultRenderer(renderer);//三正交切片,其他三视图分别设置四个renderer 以显示在四个位置imagePlaneY->SetDefaultRenderer(renderer);imagePlaneZ->SetDefaultRenderer(renderer);vtkNew<vtkRenderer> rendererx;vtkNew<vtkRenderer> renderery;vtkNew<vtkRenderer> rendererz;vtkSmartPointer<vtkImageActor> ImageActorX = vtkSmartPointer<vtkImageActor>::New();vtkSmartPointer<vtkImageActor> ImageActorY = vtkSmartPointer<vtkImageActor>::New();vtkSmartPointer<vtkImageActor> ImageActorZ = vtkSmartPointer<vtkImageActor>::New();vtkImageMapToWindowLevelColors* windowLevelx = vtkImageMapToWindowLevelColors::New();vtkImageMapToWindowLevelColors* windowLevely = vtkImageMapToWindowLevelColors::New();vtkImageMapToWindowLevelColors* windowLevelz = vtkImageMapToWindowLevelColors::New();vtkSmartPointer<vtkTextActor> textActorx = vtkSmartPointer<vtkTextActor>::New();vtkSmartPointer<vtkTextActor> textActory = vtkSmartPointer<vtkTextActor>::New();vtkSmartPointer<vtkTextActor> textActorz = vtkSmartPointer<vtkTextActor>::New();std::string strx = "x:" + std::to_string(imagePlaneX->GetSliceIndex());std::string stry = "y:" + std::to_string(imagePlaneY->GetSliceIndex());std::string strz = "z:" + std::to_string(imagePlaneZ->GetSliceIndex());textActorx->SetInput(strx.c_str());textActorx->GetTextProperty()->SetFontSize(24);textActorx->GetTextProperty()->SetColor(1, 1, 1);rendererx->AddActor(textActorx);textActory->SetInput(stry.c_str());textActory->GetTextProperty()->SetFontSize(24);textActory->GetTextProperty()->SetColor(1, 1, 1);renderery->AddActor(textActory);textActorz->SetInput(strx.c_str());textActorz->GetTextProperty()->SetFontSize(24);textActorz->GetTextProperty()->SetColor(1, 1, 1);rendererz->AddActor(textActorz);windowLevelx->SetInputConnection(imagePlaneX->GetReslice()->GetOutputPort());windowLevelx->SetLevel(100);//初始化窗位windowLevelx->SetWindow(200);//窗宽windowLevely->SetInputConnection(imagePlaneY->GetReslice()->GetOutputPort());windowLevely->SetLevel(100);windowLevely->SetWindow(200);windowLevelz->SetInputConnection(imagePlaneZ->GetReslice()->GetOutputPort());windowLevelz->SetLevel(100);windowLevelz->SetWindow(200);ImageActorX->GetMapper()->SetInputConnection(windowLevelx->GetOutputPort());ImageActorY->GetMapper()->SetInputConnection(windowLevely->GetOutputPort());ImageActorZ->GetMapper()->SetInputConnection(windowLevelz->GetOutputPort());rendererx->AddActor(ImageActorX);renderery->AddActor(ImageActorY);rendererz->AddActor(ImageActorZ);renderWindow->AddRenderer(renderer);rendererx->SetBackground(0.1, 0.2, 0.4);//背景RGB颜色、、renderery->SetBackground(0.2, 0.4, 0.1);rendererz->SetBackground(0.4, 0.2, 0.1);//rendererx->SetViewPort();rendererx->SetViewport(0, 0, 0.5, 0.5);//四个 renderer显示在四个角renderery->SetViewport(0.5, 0, 1, 0.5);rendererz->SetViewport(0.5, 0.5, 1, 1);renderer->SetViewport(0, 0.5, 0.5, 1);renderWindow->AddRenderer(rendererx);renderWindow->AddRenderer(renderery);renderWindow->AddRenderer(rendererz);//Renderint pos[3];pos[0] = imagePlaneX->GetSliceIndex();//获取三正交切片的切片序号pos[1] = imagePlaneY->GetSliceIndex();pos[2] = imagePlaneZ->GetSliceIndex();vtkSmartPointer< vtkMyCall > mycall = vtkSmartPointer< vtkMyCall>::New();mycall->pos = pos;mycall->WidgetX = imagePlaneX;mycall->WidgetY = imagePlaneY;mycall->WidgetZ = imagePlaneZ;mycall->textActorx = textActorx;mycall->textActory = textActory;mycall->textActorz = textActorz;renderWindowInteractor->AddObserver(vtkCommand::MouseMoveEvent, mycall);renderWindow->Render();imagePlaneX->SetInteractor(renderWindowInteractor);imagePlaneY->SetInteractor(renderWindowInteractor);imagePlaneZ->SetInteractor(renderWindowInteractor);vtkSmartPointer< vtkMyCallback > cbk = vtkSmartPointer< vtkMyCallback>::New();cbk->windowLevelx = windowLevelx;cbk->windowLevely = windowLevely;cbk->windowLevelz = windowLevelz;cbk->WidgetX = imagePlaneX;cbk->WidgetY = imagePlaneY;cbk->WidgetZ = imagePlaneZ;// rendererx->AddObserver(vtkCommand::MouseMoveEvent, cbk);// renderery->AddObserver(vtkCommand::MouseMoveEvent, cbk);// rendererz->AddObserver(vtkCommand::MouseMoveEvent, cbk);imagePlaneX->AddObserver(vtkCommand::EndWindowLevelEvent, cbk);imagePlaneY->AddObserver(vtkCommand::EndWindowLevelEvent, cbk);imagePlaneZ->AddObserver(vtkCommand::EndWindowLevelEvent, cbk);renderWindowInteractor->Initialize();imagePlaneX->On();imagePlaneY->On();imagePlaneZ->On();renderer->ResetCamera();// Begin mouse interactionrenderWindowInteractor->Start();}

效果如下:

拖动切片,改变窗宽窗位:

练习:VTK 四视图显示(三视图+三正交切片)相关推荐

  1. VTK-医学三维图像四视图显示以及鼠标滑轮控制切片交互

    VTK-医学三维图像四视图显示以及鼠标滑轮控制切片交互 一.四视图介绍 vs直接创建Qt Widgets Application项目 四视图界面,采用vtk和QVTKOpenGLNativeWidge ...

  2. 三维重建 医学图像的可视化 PyQt Python VTK 四视图(横断面,冠状面,矢状面,3D)

    本文实现了 Python C++ 版本 的 四视图,横断面,冠状面,矢状面,3D 主要功能: 1:可以通过进度条换层       2:鼠标双击放大/缩小窗口 3:按住鼠标中键拖动图像 4:鼠标右键滑动 ...

  3. VTK CT重建(一) MPR 多层面重建 四视图

    目录 概述: MPR,全称是multi-planar reformation / reconstruction,是常用的医学图像后处理技术 优化后的视频: vtkImageReslice 参考资料 概 ...

  4. vtk 的vtkimagereslice实现三视图的显示

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

  5. 医学四视图-004-四视图增加文字显示

    ​ 这篇文章中就要给我的四视图增加文字显示了,这个东西就是在我摄像机上面的,不会随着图像变化而变化,感觉这个是不是就是在3D中的那种HUD呢. 电梯 1 效果展示 2 vtkTextActor 3 实 ...

  6. MFC开发IM-第三篇、资源视图--显示在另一个编辑器中打开

    VS2013 MFC对话框编程,资源视图--显示在另一个编辑器中打开 原创 2017年03月26日 22:47:24 标签: visual studio 3512 问题如下图:  解决办法:  一般这 ...

  7. 医学四视图-007-增加按钮,增加文档提示

    ​ 本文将记录实现给每个视图增加按钮和文字提示. 文章目录 1 增加按钮.增打开文档提示 2 自定义模块"VTKRenderWidget" 2.1 vtkrenderwidget. ...

  8. MVG学习笔记(5) --四视图几何和n视图重建

    四视图几何和n视图重建   可以使用基于张量的方法再进行一步,并定义四个视图中可见的四焦点张量相关实体. 然而这种方法很少使用,因为计算符合其内部约束的四焦点张量的相对困难.   然而,它确实提供了基 ...

  9. 医学四视图-003-解决图像反转(失败)

    ​ 先说结论,本文最终也没有解决图像反转问题,仅仅是过程记录.咨询了老大,老大说以我的能力,暂时还搞不定,所以就暂时先搁置. 电梯 1 都是演示的错 2 编译MITK2.21.2 3 找问题原因 3. ...

最新文章

  1. Zend Framework数据库操作
  2. 解决protobuf import路径的问题
  3. hibernate中List一对多映射关系详解
  4. 8086CPU汇编:一般的标号与直接定址标号
  5. CSS3实战开发: 纯CSS实现图片过滤分类显示特效
  6. hdu1054(最小顶点覆盖)
  7. LIBUV学习笔记(三)libuv中pipe/tty相关操作以及一个简单的unix域回射服务器/客户端例子...
  8. VisualStudio quick tips -- 快速在多个打开的代码文件间切换
  9. rocketmq mysql_聊聊rocketmq-mysql的BinlogPositionManager
  10. CVPR2017-图像特征匹配-GMS:基于网格的运动统计的快速且极度鲁棒的图像特征匹配算法
  11. Android的 线性布局,Android布局之LinearLayout线性布局
  12. H3C交换机做DHCP
  13. NEXTCHIP图像品牌ISP和AHD都是有哪些功能?型号有多少型号?
  14. 学3D建模的电脑配置
  15. CSS 框架 Bulma 教程
  16. 传奇服务器如何修改地图和刷怪,传奇如何将怪物刷在指定地图?
  17. 前度监控(埋点)设计方案
  18. 卡尔曼滤波器(2) -- α−β−γ滤波器(例1)
  19. git版本回退命令_git 版本回退 撤销 删除
  20. Bootstrap4使用教程

热门文章

  1. html图片多热点怎么弄,CSS学习笔记(十五) 使用map标签实现单图多热点
  2. 计算机excel求某班英语成绩单领取,EXCEL:计算各校各班学生成绩平均分,用AVERAGEIFS函数就挺好的...
  3. 设计模式-Visitor模式(访问者模式)
  4. 朱啸虎看好的ofo连续三月涨215% 共享单车竞争取得领先
  5. 如何科学地利用MTTR优化软件交付流程?
  6. 移动计算比移动数据更核算
  7. IIS中应用程序池中的高级设置分析
  8. 嵌入式系统半实物仿真测试平台总体介绍
  9. Android进阶课学习收获(31~33)
  10. FileWriter的换行和追加