栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

BestMPRBaseVtk-005-翻车加修车

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

BestMPRBaseVtk-005-翻车加修车

翻车加修车

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

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

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


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

关键字: vtkImageReslice、MPR、VTK、vtkImageViewer2、vtkMatrix4x4

vtkImageReslice实现MPR

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

基于VTK的MPR实现

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

MyImageResliceWindow.h
#ifndef MYIMAGERESLICEWINDOW_H
#define MYIMAGERESLICEWINDOW_H

#include 
#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_OBJECT

public:
    explicit MyImageResliceWindow(QWidget *parent = nullptr);
    ~MyImageResliceWindow();


    
    void readDicom(QString temp);
    
    void initImageForm();

private slots:
    
    void on_pushButton_reader_clicked();
    
    void on_pushButton_reader_2_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 reader = nullptr;      //Dicom文件读取器
    vtkSmartPointer resliceAxes[3];               //vtk 4×4矩阵
    vtkSmartPointer reslice[3];                //vtkImageReslice切片类
    vtkSmartPointer colorTable[3];              //颜色映射表
    vtkSmartPointer colorMap[3];           //图像彩色映射
    vtkSmartPointer imgActor[3];                 //图像Actor
    vtkSmartPointer renderer[3];                   //图像渲染器
};

#endif // MYIMAGERESLICEWINDOW_H

MyImageResliceWindow.cpp
#include "myimagereslicewindow.h"
#include "ui_myimagereslicewindow.h"
#include 
#include 
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::New();
        resliceAxes[i] = vtkSmartPointer::New();
        colorTable[i] = vtkSmartPointer::New();
        colorMap[i] = vtkSmartPointer::New();
        imgActor[i] = vtkSmartPointer::New();
        renderer[i] = vtkSmartPointer::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();                                   //开始渲染

}


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();
}


void MyImageResliceWindow::on_pushButton_SetDirection_clicked()
{

}


心得

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

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

☞ 源码

源码链接:GitHub仓库自取

使用方法:☟☟☟


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/648417.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号