翻车加修车

​ 翻车了,亲人们,家人们,我翻车了,欢迎大家来看我翻车修车。

​ 事情是这样的,上篇咱不是搬运人家官方的vtkImageViewer2的代码了,但是呢,忘记之前的踩过的坑了,医学四视图-003-解决图像反转(失败)在这里的坑再次出现在我的代码里,但是呢,我TM早就忘记了。看看这次的教训

​ 不过好在咱运气好,遇到了黑山老妖大神不厌其烦的知道,现在终于修车完成,不过已经不是使用vtkImageViewer2,更换了vtkImageReslice;来看看效果吧


文章目录

  • 翻车加修车
    • vtkImageReslice实现MPR
      • MyImageResliceWindow.h
      • MyImageResliceWindow.cpp
    • 心得
    • ☞ 源码

关键字: vtkImageResliceMPRVTKvtkImageViewer2vtkMatrix4x4

vtkImageReslice实现MPR

这里就直接上贴上代码吧,目前的能力还没有啥资格来搞这个问题,还是上大神代码

基于VTK的MPR实现

VTK笔记-计算MPR切面-vtkImageReslice类

MyImageResliceWindow.h

#ifndef MYIMAGERESLICEWINDOW_H
#define MYIMAGERESLICEWINDOW_H#include <QWidget>
#include "QVTKOpenGLNativeWidget.h"
#include "vtkSmartPointer.h"
#include "vtkMetaImageReader.h"
#include "vtkImageData.h"
#include "vtkMatrix4x4.h"
#include "vtkImageReslice.h"
#include "vtkLookupTable.h"
#include "vtkImageMapToColors.h"
#include "vtkImageActor.h"
#include "vtkImageMapper3D.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkInteractorStyleImage.h"
#include "vtkDICOMImageReader.h"
#include "vtkCamera.h"
namespace Ui {
class MyImageResliceWindow;
}class MyImageResliceWindow : public QWidget
{Q_OBJECTpublic:explicit MyImageResliceWindow(QWidget *parent = nullptr);~MyImageResliceWindow();/*** @brief readDicom* @param temp 文件路径* 设置读取文件夹*/void readDicom(QString temp);/*** @brief initImageForm* 初始化流水线*/void initImageForm();private slots:/*** @brief on_pushButton_reader_clicked* 选择读取Dicom文件夹按钮槽函数*/void on_pushButton_reader_clicked();/*** @brief on_pushButton_reader_2_clicked* 直接测试按钮槽函数*/void on_pushButton_reader_2_clicked();/*** @brief on_pushButton_SetDirection_clicked* 切换切面显示槽函数*/void on_pushButton_SetDirection_clicked();private:Ui::MyImageResliceWindow *ui;int extent[6];          //序列范围double spacing[3];      //图像切片间距double origin[3];       //图像原点double center[3];       //物体中心点//轴状矩阵double axialElements[16] = {1, 0, 0, 0,0, 1, 0, 0,0, 0, 1, 0,0, 0, 0, 1};//矢状矩阵double sagittalElements [16] = {0, 0, -1, 0,1, 0, 0, 0,0, 1, 0, 0,0, 0, 0, 1 };//冠状矩阵double coronalElements [16] = {1, 0, 0, 0,0, 0, -1, 0,0, -1, 0, 0,0, 0, 0, 1 };vtkSmartPointer<vtkDICOMImageReader> reader = nullptr;      //Dicom文件读取器vtkSmartPointer<vtkMatrix4x4> resliceAxes[3];               //vtk 4×4矩阵vtkSmartPointer<vtkImageReslice> reslice[3];                //vtkImageReslice切片类vtkSmartPointer<vtkLookupTable> colorTable[3];              //颜色映射表vtkSmartPointer<vtkImageMapToColors> colorMap[3];           //图像彩色映射vtkSmartPointer<vtkImageActor> imgActor[3];                 //图像ActorvtkSmartPointer<vtkRenderer> renderer[3];                   //图像渲染器
};#endif // MYIMAGERESLICEWINDOW_H

MyImageResliceWindow.cpp

#include "myimagereslicewindow.h"
#include "ui_myimagereslicewindow.h"
#include <QFileDialog>
#include <QtDebug>
MyImageResliceWindow::MyImageResliceWindow(QWidget *parent) :QWidget(parent),ui(new Ui::MyImageResliceWindow)
{ui->setupUi(this);this->setWindowTitle("MPR Demo And Test");reader = vtkDICOMImageReader::New();reader->SetDirectoryName("D:\\00_Code\\ST0\\SE2");for(int i = 0;i<3;i++){reslice[i] = vtkSmartPointer<vtkImageReslice>::New();resliceAxes[i] = vtkSmartPointer<vtkMatrix4x4>::New();colorTable[i] = vtkSmartPointer<vtkLookupTable>::New();colorMap[i] = vtkSmartPointer<vtkImageMapToColors>::New();imgActor[i] = vtkSmartPointer<vtkImageActor>::New();renderer[i] = vtkSmartPointer<vtkRenderer>::New();}
}MyImageResliceWindow::~MyImageResliceWindow()
{delete ui;
}void MyImageResliceWindow::readDicom(QString temp)
{reader->SetDirectoryName(temp.toLocal8Bit().data());                    //设置文件夹路径reader->Update();                                                       //更新reader->GetOutput()->GetExtent(this->extent);                           //获取图像序列范围reader->GetOutput()->GetSpacing(this->spacing);                         //获取数据间距reader->GetOutput()->GetOrigin(this->origin);                           //获取原点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]);     //获取中心点
}void MyImageResliceWindow::initImageForm()
{resliceAxes[0]->DeepCopy(axialElements);resliceAxes[1]->DeepCopy(sagittalElements);resliceAxes[2]->DeepCopy(coronalElements);for (int i = 0; i< 3; i++ ) {reslice[i]->SetInputConnection(reader->GetOutputPort());                    //设置数据输入源reslice[i]->SetOutputDimensionality(2);                                     //设置输出为一个切片,而不是一个卷reslice[i]->SetResliceAxes(resliceAxes[i]);                                 //设置矩阵reslice[i]->SetResliceAxesOrigin(center[0],center[1],center[2]);            //设置切片中心点reslice[i]->SetInterpolationModeToLinear();                                 //设置切面算法的插值方式线性插值colorTable[i]->SetRange(0, 1000);                                           //设置颜色表范围colorTable[i]->SetValueRange(0.0, 1.0);                                     //设置颜色表精度colorTable[i]->SetSaturationRange(0.0, 0.0);                                //设置曝光范围 ?colorTable[i]->SetRampToLinear();                                           //设置颜色表为线性colorTable[i]->Build();                                                     //构建colorMap[i]->SetLookupTable(colorTable[i]);                                 //设置颜色表colorMap[i]->SetInputConnection(reslice[i]->GetOutputPort());               //设置图像数据imgActor[i]->GetMapper()->SetInputConnection(colorMap[i]->GetOutputPort()); //添加映射器renderer[i]->AddActor(imgActor[i]);                                         //添加演员renderer[i]->SetBackground(0.0, 0.0, 0.0);                                  //设置背景}ui->openGLWidget_1->renderWindow()->AddRenderer(renderer[0]);                   //UI渲染窗口添加渲染器ui->openGLWidget_1->renderWindow()->Render();                                   //开始渲染ui->openGLWidget_2->renderWindow()->AddRenderer(renderer[1]);                   //UI渲染窗口添加渲染器ui->openGLWidget_2->renderWindow()->Render();                                   //开始渲染ui->openGLWidget_3->renderWindow()->AddRenderer(renderer[2]);                   //UI渲染窗口添加渲染器ui->openGLWidget_3->renderWindow()->Render();                                   //开始渲染}/*** @brief MyImageResliceWindow::on_pushButton_reader_clicked* 读取Dicom文件*/
void MyImageResliceWindow::on_pushButton_reader_clicked()
{QString dir = QFileDialog::getExistingDirectory(this, tr("Open Folder"),"D:\\00_Code\\ST0\\SE2",QFileDialog::ShowDirsOnly| QFileDialog::DontResolveSymlinks);if(!dir.isEmpty()){readDicom(dir);initImageForm();}
}void MyImageResliceWindow::on_pushButton_reader_2_clicked()
{readDicom(QString("D:\\00_Code\\ST0\\SE2"));initImageForm();update();
}/*** @brief MyImageResliceWindow::on_pushButton_SetDirection_clicked* 切换切面*/
void MyImageResliceWindow::on_pushButton_SetDirection_clicked()
{}

心得

​ 这几天就这一个图像方向问题,折腾了好久了,其实还是心态的问题,开始我真的是火急火燎,想在几分钟内解决问题,但是呢,到头来,还是没有解决,感谢黑山老妖,让我还是回到了开发软件的感觉上来,软件开发就是一个耐心吃错,找BUG过程,如果每次都一下就过,那估计离离开也不远了,因为只有写1+1=2 才不会有问题。所以遇到问题还是要耐心,稳定情绪,遇到问题,有一个好的心态,问题已经解决80% 剩下的20%交给时间。

​ 已经2021年12月,这一年眼看就要过完了,话说,大家都挣到钱了吗,咋感觉2021 钱更难挣,更容易花了呢。最后的最后,有人帮我还一点吗?

☞ 源码

源码链接:GitHub仓库自取

使用方法:☟☟☟


BestMPRBaseVtk-005-翻车加修车相关推荐

  1. Interview Project50 50/11

    实践是检验真理的唯一标准 002后都进行录音记录后回来分析,最后找相关答案,查漏补缺. 一些没怎么问技术的公司就不记录了 ----2021年3月30日更新 目前面的时候,基本都能回答上来,后面一些重复 ...

  2. 005:vue+openlayers加载Mapbox地图示例

    第005个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中加载Mapbox地图. 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 示例效果 ...

  3. 【案例集】直播间“长高产品”翻车了,120升油箱加了161升?

    [说案例6]直播间"长高产品"翻车了 商业真的是无孔不入,有人坐在店里,有人上门推销,朋友圈火的时候微商刷屏,现在播商又火起来了,直播间卖东西这是好事啊,你像新东方不就成功转型了嘛 ...

  4. 【MATLAB统计分析与应用100例】案例005:matlab调用medfilt1函数对加噪正弦波信号进行平滑处理

    平滑效果预览: 文章目录 1. 产生加噪正弦波信号,绘制加噪波形图 2. 调用medfilt1对加噪正弦波信号y进行中值滤波,并绘制波形图 1. 产生加噪正弦波信号,绘制加噪波形图 t = linsp ...

  5. mysql datetime month不走索引_like百分号加前面一定不走索引吗?一不小心就翻车,关于mysql索引那些容易错的点...

    like百分号加前面一定不走索引吗? 正常来讲,我们都知道在mysql的like查询中,百分号加在关键词后面是走索引的,比如 select * like "张三%",而百分号在前面 ...

  6. 005.给女士包包加充电宝功能

    背景: .鉴于一般女性出门都会带包包,但又很容易将充电宝拉下,现如今出门必备三件套(身份证.手机.充电宝) 灵感来源: 带电的衣服 转载于:https://www.cnblogs.com/ydvely ...

  7. 行车记+翻车记:.NET Core 新车改造,C# 节能降耗,docker swarm 重回赛道

    非常抱歉,10:00~10:30 左右博客站点出现故障,给您带来麻烦了,请您谅解. 故障原因与博文中谈到的部署变更有关,但背后的问题变得非常复杂,复杂到我们都在怀疑与阿里云服务器 CPU 特性有关. ...

  8. 当OpenCV遇到VS2019时,以前的配置方式翻车了….

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|AI算法与图像处理 翻车原因 前几天有个哥们看了我的Op ...

  9. FGMap学习之--加载百度地图

    今天我们用FGMap来加载百度地图数据. 从目前国内的地图服务商提供的地图来看,地图瓦片切图规则只少分为三种.其中Google Map.Bing地图.MapABC.QQ地图是一类,而百度地图.搜狗地图 ...

最新文章

  1. Suse es 11sp2 双网卡冗余
  2. Window.resizeTo()
  3. Phoenix二级索引(Secondary Indexing)的使用(转:https://www.cnblogs.com/MOBIN/p/5467284.html)
  4. 身份令牌toKen Vuex + localStorage结合存储
  5. Android之如何成为Android高手
  6. sdut 最少拦截系统
  7. easyui关于dialog弹出位置的问题记录
  8. DCMTK的Lib 引用顺序
  9. JavaMail回复
  10. 关于rstudio的一些快捷键
  11. 5.go 代码包 package
  12. 制造业ERP项目设计摘录
  13. 电子海图制作中坐标转换的应用与实现
  14. 迅为iTOP-IMX6ULL开发板Pinctrl和GPIO子系统实验-修改设备树文件
  15. python算方差_python 算方差
  16. [转][酷酷的滕]我爱你语录
  17. DELL服务器 一般内存模块安装原则
  18. UESTC ACM训练题二
  19. React 环境搭建以及创建项目工程(一)
  20. channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no

热门文章

  1. PyQt5 - 获取鼠标坐标并且绘制点
  2. Android OpenGLES2.0(九)——利用OpenGL进行图片处理
  3. 100个人围成一个圈(编号从1到100),然后报数,报到3的下去,然后从4开始继续从1开始报数,报到3的下去,依此类推,最后剩下人的编号是?
  4. Mybatis配置及动态SQL语句标签
  5. 计算机网络实验报告西南科技大学,西南科技大学计算机网络-实验一
  6. 我的相册网免费洗50张照片优惠码
  7. filter用于js数组删除指定数据
  8. 2012年第15周国内Android应用下载排名
  9. 耿明雨调研生态漓江宜居凤凰.山水尚境
  10. 执行tail –f 输出nginx实时日志,回车时无反应