使用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  见本文链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/83754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用vsftpd搭建FTP服务器(TLS/SSL显式加密)

安装vsftpd服务 使用vsftpd RPM安装包安装即可&#xff0c;如果可以访问YUM镜像源&#xff0c;通过dnf或者yum工具更加方便。 yum -y install vsftpd 启动vsftpd、查看服务状态 systemctl enable vsftpd systemctl start vsftpd systemctl status vsftpd 备份配置文件并进…

鸿蒙OSUniApp集成WebGL:打造跨平台3D视觉盛宴#三方框架 #Uniapp

UniApp集成WebGL&#xff1a;打造跨平台3D视觉盛宴 在移动应用开发日新月异的今天&#xff0c;3D视觉效果已经成为提升用户体验的重要手段。本文将深入探讨如何在UniApp中集成WebGL技术&#xff0c;实现炫酷的3D特效&#xff0c;并特别关注鸿蒙系统(HarmonyOS)的适配与优化。 …

前端文件下载常用方式详解

在前端开发中&#xff0c;实现文件下载是常见的需求。根据不同的场景&#xff0c;我们可以选择不同的方法来实现文件流的下载。本文介绍三种常用的文件下载方式&#xff1a; 使用 axios 发送 JSON 请求下载文件流使用 axios 发送 FormData 请求下载文件流使用原生 form 表单提…

MacOS解决局域网“没有到达主机的路由 no route to host“

可能原因&#xff1a;MacOS 15新增了"本地网络"访问权限&#xff0c;在 APP 第一次尝试访问本地网络的时候会请求权限&#xff0c;可能顺手选择了关闭。 解决办法&#xff1a;给想要访问本地网络的 APP &#xff08;例如 terminal、Navicat、Ftp&#xff09;添加访问…

中英文实习证明模板:一键生成标准化实习证明,助力实习生职场发展

中英文实习证明模板&#xff1a;一键生成标准化实习证明&#xff0c;助力实习生职场发展 【下载地址】中英文实习证明模板 这份中英文实习证明模板专为实习生设计&#xff0c;内容简洁专业&#xff0c;适用于多种场景。模板采用中英文对照格式&#xff0c;方便国际交流与使用。…

RocketMQ运行架构和消息模型

运⾏架构 nameServer 命名服务 NameServer 是 RocketMQ 的 轻量级注册中心&#xff0c;负责管理集群的路由信息&#xff08;Broker 地址、Topic 队列分布等&#xff09;&#xff0c;其核心作用是解耦 Broker 与客户端&#xff0c;实现动态服务发现。broker 核⼼服务 RocketMQ最…

C++学习-入门到精通【11】输入/输出流的深入剖析

C学习-入门到精通【11】输入/输出流的深入剖析 目录 C学习-入门到精通【11】输入/输出流的深入剖析一、流1.传统流和标准流2.iostream库的头文件3.输入/输出流的类的对象 二、输出流1.char* 变量的输出2.使用成员函数put进行字符输出 三、输入流1.get和getline成员函数2.istrea…

OpenCV 图像像素的逻辑操作

一、知识点 1、图像像素的逻辑操作&#xff0c;指的是位操作bitwise&#xff0c;与、或、非、异或等。 2、位操作简介: 位1 位2 与and 或or 异或xor0 0 0 0 00 1 0 1 11 0 0 …

【AAOS】【源码分析】用户管理(二)-- 整体架构

整体介绍 Android多用户功能作为 Android Automotive 的重要组成部分,为不同驾驶员和乘客提供了一个更加定制化、隐私保护的使用环境。Android 多用户的存在,它可以让多个用户使用同一台设备,同时保持彼此的数据、应用和设置分隔开来。 各用户类型的权限 能力SystemAdminS…

Redis最佳实践——电商应用的性能监控与告警体系设计详解

Redis 在电商应用的性能监控与告警体系设计 一、原子级监控指标深度拆解 1. 内存维度监控 核心指标&#xff1a; # 实时内存组成分析&#xff08;单位字节&#xff09; used_memory: 物理内存总量 used_memory_dataset: 数据集占用量 used_memory_overhead: 管理开销内存 us…

多模态大语言模型arxiv论文略读(109)

Math-PUMA: Progressive Upward Multimodal Alignment to Enhance Mathematical Reasoning ➡️ 论文标题&#xff1a;Math-PUMA: Progressive Upward Multimodal Alignment to Enhance Mathematical Reasoning ➡️ 论文作者&#xff1a;Wenwen Zhuang, Xin Huang, Xiantao Z…

web3-以太坊智能合约基础(理解智能合约Solidity)

以太坊智能合约基础&#xff08;理解智能合约/Solidity&#xff09; 无需编程经验&#xff0c;也可以帮助你了解Solidity独特的部分&#xff1b;如果本身就有相应的编程经验如java&#xff0c;python等那么学起来也会非常的轻松 一、Solidity和EVM字节码 实际上以太坊链上储存…

D2-基于本地Ollama模型的多轮问答系统

本程序是一个基于 Gradio 和 Ollama API 构建的支持多轮对话的写作助手。相较于上一版本&#xff0c;本版本新增了对话历史记录、Token 计数、参数调节和清空对话功能&#xff0c;显著提升了用户体验和交互灵活性。 程序通过抽象基类 LLMAgent 实现模块化设计&#xff0c;当前…

传统业务对接AI-AI编程框架-Rasa的业务应用实战(2)--选定Python环境 安装rasa并初始化工程

此篇接续上一篇 传统业务对接AI-AI编程框架-Rasa的业务应用实战&#xff08;1&#xff09;--项目背景即学习初衷 1、Python 环境版本的选择 我主机上默认的Python环境是3.12.3 &#xff08;我喜欢保持使用最新版本的工具或框架&#xff0c;当初装python时最新的稳定版本就是…

Ubuntu22.04安装MinkowskiEngine

MinkowskiEngine简介 Minkowski引擎是一个用于稀疏张量的自动微分库。它支持所有标准神经网络层&#xff0c;例如对稀疏张量的卷积、池化和广播操作。 MinkowskiEngine安装 官方源码链接&#xff1a;GitHub - NVIDIA/MinkowskiEngine: Minkowski Engine is an auto-diff neu…

高等数学基础(矩阵基本操作转置和逆矩阵)

矩阵是否相等 若 A A A和 B B B为同型矩阵且对应位置的各个元素相同, 则称矩阵 A A A和 B B B相等 在Numpy中, 可以根据np.allclose()来判断 import numpy as npA np.random.rand(4, 4) # 生成一个随机 n x n 矩阵B A A.Tprint("矩阵是否相等&#xff1a;", np…

网络爬虫一课一得

网页爬虫&#xff08;Web Crawler&#xff09;是一种自动化程序&#xff0c;通过模拟人类浏览行为&#xff0c;从互联网上抓取、解析和存储网页数据。其核心作用是高效获取并结构化网络信息&#xff0c;为后续分析和应用提供数据基础。以下是其详细作用和用途方向&#xff1a; …

MATLAB实现井字棋

一、智能决策系统与博弈游戏概述 &#xff08;一&#xff09;智能决策系统核心概念 智能决策系统&#xff08;Intelligent Decision System, IDS&#xff09;是通过数据驱动和算法模型模拟人类决策过程的计算机系统&#xff0c;核心目标是在复杂环境中自动生成最优策略&#…

解决el-select选择框右侧下拉箭头遮挡文字问题

如图所示&#xff1a; el-select长度较短的时候&#xff0c;选择框右侧下拉箭头会遮挡选中的数据 选中数据被遮挡 解决办法&#xff1a; 组件如下&#xff1a; <td class"fmtd" :colspan"col.ptproCupNum" v-for"col in row" :key"…

【Linux】pthread多线程同步

参考文章&#xff1a;https://blog.csdn.net/Alkaid2000/article/details/128121066 一、线程同步 线程的主要优势在于&#xff0c;能够通过全局变量来共享信息。不过&#xff0c;这种便携的共享是有代价的&#xff1b;必须确保多个线程不会同时修改同一变量&#xff0c;或者某…