使用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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83754.shtml
英文地址,請注明出處:http://en.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;或者某…