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

使用vtk8.2.0加载dicom图像

1 上一篇文章我们已经编译好了VTK的dll,下面我们就来加载他。

2 在Pro里面加载dll

#-------------------------------------------------
#
# Project created by QtCreator 2024-02-04T14:39:07
#
#-------------------------------------------------QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = 123
TEMPLATE = app# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0CONFIG += c++11SOURCES += \     form1.cpp \   main.cpp HEADERS += \      form1.hFORMS += \     form1.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
INCLUDEPATH+=E:/VTK/VTK-8.2.0-install/include/vtk-8.2
LIBS+=-LE:/VTK/VTK-8.2.0-install/bin \-lvtkFiltersSources-8.2 \-lvtkCommonColor-8.2 \-lvtkCommonCore-8.2 \-lvtkCommonExecutionModel-8.2 \-lvtkFiltersSources-8.2 \-lvtkInteractionStyle-8.2 \-lvtkRenderingContextOpenGL2-8.2 \-lvtkRenderingCore-8.2\-lvtkRenderingFreeType-8.2 \-lvtkRenderingGL2PSOpenGL2-8.2 \-lvtkRenderingOpenGL2-8.2 \-lvtkGUISupportQt-8.2\-lvtkDICOMParser-8.2\-lvtkIOImage-8.2\-lvtkInteractionImage-8.2

3 在form1 这个ui里面创建4个水平layout,等会用于加载图形窗口。栅格布局。

4 创建.h

#ifndef FORM1_H
#define FORM1_H#include <QWidget>
#include <QVTKOpenGLWidget.h>
#include "QVTKOpenGLNativeWidget.h"namespace Ui {
class Form1;
}class Form1 : public QWidget
{Q_OBJECTpublic:explicit Form1(QWidget *parent = nullptr);Form1(QWidget *parent,int  type);~Form1();private:Ui::Form1 *ui;QVTKOpenGLWidget *qvtkWidget;
};#endif // FORM1_H

5 .cpp文件

#include "form1.h"
#include "ui_form1.h"
#include "vtkActor.h"
#include "vtkCamera.h"
#include "vtkCylinderSource.h"
#include "vtkNamedColors.h"
#include "vtkNew.h"
#include "vtkPolyDataMapper.h"
#include "vtkProperty.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkGenericOpenGLRenderWindow.h"#include "vtkCellArray.h"
#include "vtkFloatArray.h"
#include "vtkPointData.h"
#include "vtkPoints.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkInteractorStyleImage.h"#include "vtkAutoInit.h"
#include <QDebug>
#include "vtkImageViewer2.h"
#include "vtkSmartPointer.h"
#include "vtkDICOMImageReader.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderWindow.h"
#include "vtkImageSlice.h"
#include "vtkImageResliceMapper.h"
#include <QGridLayout>
#include "QVTKOpenGLNativeWidget.h"
#include "QVTKOpenGLWidget.h"Form1::Form1(QWidget *parent,int  type) :QWidget(parent),ui(new Ui::Form1)
{ui->setupUi(this);QVTKOpenGLNativeWidget* vtkWidget  = new QVTKOpenGLNativeWidget(this);QVTKOpenGLWidget* vtkWidget2  = new QVTKOpenGLWidget(this);QVTKOpenGLWidget* vtkWidget3  = new QVTKOpenGLWidget(this);QVTKOpenGLWidget* vtkWidget4  = new QVTKOpenGLWidget(this);ui->horizontalLayout->addWidget(qobject_cast<QWidget*>(vtkWidget));ui->horizontalLayout_2->addWidget(qobject_cast<QWidget*>(vtkWidget2));ui->horizontalLayout_3->addWidget(qobject_cast<QWidget*>(vtkWidget3));ui->horizontalLayout_4->addWidget(qobject_cast<QWidget*>(vtkWidget4));//读取Dicom文件vtkSmartPointer<vtkDICOMImageReader> dcmReader = vtkSmartPointer<vtkDICOMImageReader>::New();dcmReader->SetFileName("E:/VTK/DicomFiles/1.2.840.113704.1.111.3352.1107859679.1269.dcm");//读单张切片dcmReader->Update();// 4. 检查是否加载成功if (!dcmReader->GetOutput()){qDebug()<<"无法读取DICOM文件!,EXIT_FAILURE" ;}//实例化一个对象dcmViewervtkSmartPointer<vtkImageViewer2> imageViewer = vtkSmartPointer<vtkImageViewer2>::New();imageViewer->SetInputConnection(dcmReader->GetOutputPort());imageViewer->SetRenderWindow(vtkWidget->GetRenderWindow());imageViewer->SetSlice(0);// 显示第一张切片(如果是多切片数据)imageViewer->Render();imageViewer->GetRenderer()->ResetCamera();//实例化一个对象readervtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();// 2. 设置 DICOM 文件路径(单个文件)//reader->SetFileName("E:/VTK/DicomFiles/1.2.840.113704.1.111.3352.1107859681.1270.dcm");reader->SetDirectoryName("E:/VTK/DicomFiles");reader->Update();// 4. 检查是否加载成功if (!reader->GetOutput()){qDebug()<<"无法读取DICOM文件!,EXIT_FAILURE" ;}vtkSmartPointer<vtkImageViewer2> imageViewer2 = vtkSmartPointer<vtkImageViewer2>::New();imageViewer2->SetInputConnection(reader->GetOutputPort());imageViewer2->SetRenderWindow(vtkWidget2->GetRenderWindow());imageViewer2->SetSlice(0);// 显示第一张切片(如果是多切片数据)imageViewer2->Render();imageViewer2->GetRenderer()->ResetCamera();//实例化一个对象readervtkSmartPointer<vtkDICOMImageReader> reader3 = vtkSmartPointer<vtkDICOMImageReader>::New();// 2. 设置 DICOM 文件路径(单个文件)reader3->SetFileName("E:/VTK/DicomFiles/1.2.840.113704.1.111.3352.1107859681.1271.dcm");reader3->Update();// 4. 检查是否加载成功if (!reader3->GetOutput()){qDebug()<<"无法读取DICOM文件!,EXIT_FAILURE" ;}vtkSmartPointer<vtkImageViewer2> imageViewer3 = vtkSmartPointer<vtkImageViewer2>::New();imageViewer3->SetInputConnection(reader3->GetOutputPort());imageViewer3->SetRenderWindow(vtkWidget3->GetRenderWindow());imageViewer3->SetSlice(0);// 显示第一张切片(如果是多切片数据)imageViewer3->Render();imageViewer3->GetRenderer()->ResetCamera();//实例化一个对象readervtkSmartPointer<vtkDICOMImageReader> reader4 = vtkSmartPointer<vtkDICOMImageReader>::New();// 2. 设置 DICOM 文件路径(单个文件)reader4->SetFileName("E:/VTK/DicomFiles/1.2.840.113704.1.111.3352.1107859682.1272.dcm");reader4->Update();// 4. 检查是否加载成功if (!reader4->GetOutput()){qDebug()<<"无法读取DICOM文件!,EXIT_FAILURE" ;}vtkSmartPointer<vtkImageViewer2> imageViewer4 = vtkSmartPointer<vtkImageViewer2>::New();imageViewer4->SetInputConnection(reader4->GetOutputPort());imageViewer4->SetRenderWindow(vtkWidget4->GetRenderWindow());imageViewer4->SetSlice(0);// 显示第一张切片(如果是多切片数据)imageViewer4->Render();imageViewer4->GetRenderer()->ResetCamera();}Form1::Form1(QWidget *parent) :QWidget(parent),ui(new Ui::Form1)
{ui->setupUi(this);vtkNew<vtkNamedColors> colors;// Set the background color.std::array<unsigned char, 4> bkg{{26, 51, 102, 255}};colors->SetColor("BkgColor", bkg.data());// This creates a polygonal cylinder model with eight circumferential facets// (i.e, in practice an octagonal prism).vtkNew<vtkCylinderSource> cylinder;cylinder->SetResolution(8);// The mapper is responsible for pushing the geometry into the graphics// library. It may also do color mapping, if scalars or other attributes are// defined.vtkNew<vtkPolyDataMapper> cylinderMapper;cylinderMapper->SetInputConnection(cylinder->GetOutputPort());// The actor is a grouping mechanism: besides the geometry (mapper), it// also has a property, transformation matrix, and/or texture map.// Here we set its color and rotate it around the X and Y axes.vtkNew<vtkActor> cylinderActor;cylinderActor->SetMapper(cylinderMapper);cylinderActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());cylinderActor->RotateX(30.0);cylinderActor->RotateY(-45.0);// The renderer generates the image// which is then displayed on the render window.// It can be thought of as a scene to which the actor is addedvtkNew<vtkRenderer> renderer;renderer->AddActor(cylinderActor);renderer->SetBackground(colors->GetColor3d("BkgColor").GetData());// Zoom in a little by accessing the camera and invoking its "Zoom" method.renderer->ResetCamera();renderer->GetActiveCamera()->Zoom(1.5);vtkSmartPointer<vtkGenericOpenGLRenderWindow> window = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();window->AddRenderer(renderer);}Form1::~Form1()
{delete ui;
}

6  编译运行 

7 dicom文件和VTK dll  见本文链接

相关文章:

  • 离散傅里叶级数(DFS)的用途
  • 深入了解JavaScript当中如何确定值的类型
  • 几何引擎对比:OpenCasCade、ACIS、Parasolid和CGM
  • 讲解:Java I/O 流体系,并举例每个类的使用
  • 一站式万能邮箱:如何实现多平台邮件管理?
  • 使用绑定参数以防止SQL注入攻击
  • SpringBoot自动配置原理深度解析
  • Flutter:下拉框选择
  • 【Linux 学习计划】-- 进程程序替换
  • 硅基计划2.0 学习总结 陆 抽象类与接口
  • JavaWeb笔记
  • MySQL查询语句
  • pikachu靶场通关笔记17 CSRF关卡03-CSRF(Token)
  • [蓝桥杯]矩阵翻硬币
  • maven微服务${revision}依赖打包无法识别
  • 王自如走上了罗永浩的老路
  • 使用VTK还是OpenGL集成到qt程序里哪个好?
  • 马氏链(Markov Chain Model)模型知识详解(1)
  • 使用 espeak-ng 实现文本转语音
  • 基于 Vue 和 Spring Boot 实现滑块验证码的机器验证
  • z怎么做优惠券网站/国家重大新闻
  • 免费做代理的网站/齐三seo顾问
  • 北京网站建设与维护/seo课程哪个好
  • 静态网站开发项目实验报告/怎么开网站平台
  • 东莞网站制作公/今日最新消息
  • 中山做网站排名/中国新闻最新消息今天