当前位置: 首页 > ai >正文

MPR多平面重建一:初步实现

MPR多平面重建的初步实现

一、功能概述

  • 用三个窗口分别显示冠状位、矢状位、横断位的切面图像;
  • 左键按住调节窗宽;
  • 右键按住缩放;
  • 中键按住平移;
  • 滚轮滚动时翻页;

二、代码实现

class mprVtkInteractorStyleImage : public vtkInteractorStyleImage
{
public:static mprVtkInteractorStyleImage* New();vtkTypeMacro(mprVtkInteractorStyleImage, vtkInteractorStyleImage);protected:vtkImageViewer2* _imageViewer;int _slice;int _minSlice;int _maxSlice;public:void SetImageViewer(vtkImageViewer2* imageViewer){_imageViewer = imageViewer;_minSlice = imageViewer->GetSliceMin();_maxSlice = imageViewer->GetSliceMax();_slice = imageViewer->GetSlice();}void MoveSliceForward(){if(_slice < _maxSlice){_slice += 1;_imageViewer->SetSlice(_slice);_imageViewer->Render();}}void MoveSliceBackward(){if(_slice > _minSlice){_slice -= 1;_imageViewer->SetSlice(_slice);_imageViewer->Render();}}virtual void OnKeyDown() override{string key = this->GetInteractor()->GetKeySym();if(key.compare("Up") == 0){MoveSliceForward();}else if(key.compare("Down") == 0){MoveSliceBackward();}//vtkInteractorStyleImage::OnKeyDown();//删除默认父类调用}virtual void OnMouseWheelForward() override{MoveSliceForward();}virtual void OnMouseWheelBackward() override{if(_slice > _minSlice){MoveSliceBackward();}}
};vtkStandardNewMacro(mprVtkInteractorStyleImage);
//一定要是全局变量,不能是局部变量;
//局部变量在函数结束后销毁,在mprVtkInteractorStyleImage访问时会报错;
vtkSmartPointer<vtkImageViewer2> viewX;
vtkSmartPointer<vtkImageViewer2> viewY;
vtkSmartPointer<vtkImageViewer2> viewZ;
vtkSmartPointer<mprVtkInteractorStyleImage> mprInteractorStyleX;
vtkSmartPointer<mprVtkInteractorStyleImage> mprInteractorStyleY;
vtkSmartPointer<mprVtkInteractorStyleImage> mprInteractorStyleZ;
void MainWindow::on_dataLoad_pB_clicked()
{QString path = QFileDialog::getExistingDirectory(this,"请选择文件夹路径...","D:/S100/");//1、读取Dicom文件vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();reader->SetDirectoryName(path.toStdString().c_str());reader->Update();vtkSmartPointer<vtkImageData> imageData = reader->GetOutput();//冠状位viewX = vtkSmartPointer<vtkImageViewer2>::New();viewX->SetInputData(imageData);viewX->SetSliceOrientation(0);//设置切面vtkSmartPointer<vtkRenderWindow> renderWindowX = this->ui->openGLWidget_MPR_X->renderWindow();viewX->SetRenderWindow(renderWindowX);viewX->SetColorLevel(25);viewX->SetColorWindow(3000);//创建交互器样式mprInteractorStyleX = vtkSmartPointer<mprVtkInteractorStyleImage>::New();//把imageView传进去mprInteractorStyleX->SetImageViewer(viewX);//创建交互器vtkSmartPointer<vtkRenderWindowInteractor> interactorX = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactorX->SetRenderWindow(renderWindowX);//一定是先设置;如果后设置,会覆盖之前的设置,style就会失效viewX->SetupInteractor(interactorX);//再设置样式interactorX->SetInteractorStyle(mprInteractorStyleX);//再初始化interactorX->Initialize();viewX->Render();viewX->GetRenderer()->ResetCamera();//矢状位viewY = vtkSmartPointer<vtkImageViewer2>::New();viewY->SetInputData(imageData);viewY->SetSliceOrientation(1);//设置切面vtkSmartPointer<vtkRenderWindow> renderWindowY = this->ui->openGLWidget_MPR_Y->renderWindow();viewY->SetRenderWindow(renderWindowY);viewY->SetColorLevel(25);viewY->SetColorWindow(3000);//创建交互器样式mprInteractorStyleY = vtkSmartPointer<mprVtkInteractorStyleImage>::New();//把imageView传进去mprInteractorStyleY->SetImageViewer(viewY);//创建交互器vtkSmartPointer<vtkRenderWindowInteractor> interactorY = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactorY->SetRenderWindow(renderWindowY);//一定是先设置;如果后设置,会覆盖之前的设置,style就会失效viewY->SetupInteractor(interactorY);//再设置样式interactorY->SetInteractorStyle(mprInteractorStyleY);//再初始化interactorY->Initialize();viewY->Render();viewY->GetRenderer()->ResetCamera();//横断位viewZ = vtkSmartPointer<vtkImageViewer2>::New();viewZ->SetInputData(imageData);viewZ->SetSliceOrientation(2);//设置切面vtkSmartPointer<vtkRenderWindow> renderWindowZ = this->ui->openGLWidget_MPR_Z->renderWindow();viewZ->SetRenderWindow(renderWindowZ);viewZ->SetColorLevel(25);viewZ->SetColorWindow(3000);//创建交互器样式mprInteractorStyleZ = vtkSmartPointer<mprVtkInteractorStyleImage>::New();//把imageView传进去mprInteractorStyleZ->SetImageViewer(viewZ);//创建交互器vtkSmartPointer<vtkRenderWindowInteractor> interactorZ = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactorZ->SetRenderWindow(renderWindowZ);//一定是先设置;如果后设置,会覆盖之前的设置,style就会失效viewZ->SetupInteractor(interactorZ);//再设置样式interactorZ->SetInteractorStyle(mprInteractorStyleZ);//再初始化interactorZ->Initialize();viewZ->Render();viewZ->GetRenderer()->ResetCamera();
}

三、显示结果

在这里插入图片描述

四、遗留问题

  • 先在外面创建窗口,再嵌入到QT渲染窗口中,过程一闪而过,很明显;
  • 滚轮向上滚动时,先放大,然后才翻页;
  • 没有铺满整个窗口;
  • 没有十字标线;
http://www.xdnf.cn/news/18194.html

相关文章:

  • linux报permission denied问题
  • 【C语言16天强化训练】从基础入门到进阶:Day 4
  • 创建Vue项目的不同方式及项目规范化配置
  • 大数据常见问题分析与解决方案
  • 《SQLAlchemy 2 In Practice》读后感
  • C++开发/Qt开发:单例模式介绍与应用
  • IDEA:控制台中文乱码
  • Redis知识总结
  • 【机器学习深度学习】Ollama、vLLM、LMDeploy对比:选择适合你的 LLM 推理框架
  • MySQL高阶篇-数据库优化
  • 计算机网络模型
  • 企业通讯软件保证内部通讯安全,搭建数字安全体系
  • 建筑行业变革:用Three.js构建BIM数据可视化孪生平台
  • 代码管理平台Gitlab如何通过 ZeroNews 实现远程访问?
  • AI时代SEO关键词优化新策略
  • Redis-缓存-雪崩-持久化、集群、灾备
  • 大数据毕业设计选题推荐-基于Hadoop的电信客服数据处理与分析系统-Spark-HDFS-Pandas
  • Windows 上用 pyenv-win 玩转多版本 Python:安装、国内源、常用命令与版本切换
  • 代码随想录Day57:图论(寻宝prim算法精讲kruskal算法精讲)
  • HT6881:重塑便携式音频体验的高效能功率放大器
  • Paraformer实时语音识别中的碎碎念
  • 将SSL配置迁移到Nacos的步骤
  • HarmonyOS 中的 setInterval的基本使用
  • 分布式机器学习之流水线并行GPipe:借助数据并行来实现模型并行计算
  • 矿物分类系统开发笔记(二):模型训练[删除空缺行]
  • ZooKeeper 一致性模型解析:线性一致性与顺序一致性的平衡
  • VScode ROS文件相关配置
  • 【habitat学习一】Habitat-Lab 配置键文档详解(CONFIG_KEYS.md)
  • 嵌入式开发学习———Linux环境下网络编程学习(三)
  • RAG 面试题(实时更新补充)