使用vtk8.2.0加载dicom图像

发布于:2025-06-07 ⋅ 阅读:(18) ⋅ 点赞:(0)

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

2 在Pro里面加载dll

#-------------------------------------------------
#
# Project created by QtCreator 2024-02-04T14:39:07
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = 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.0

CONFIG += c++11

SOURCES += \     
        form1.cpp \   
        main.cpp 


HEADERS += \      
        form1.h
  

FORMS += \     
        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_OBJECT

public:
    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" ;
    }

    //实例化一个对象dcmViewer
    vtkSmartPointer<vtkImageViewer2> imageViewer = vtkSmartPointer<vtkImageViewer2>::New();
    imageViewer->SetInputConnection(dcmReader->GetOutputPort());
    imageViewer->SetRenderWindow(vtkWidget->GetRenderWindow());
    imageViewer->SetSlice(0);// 显示第一张切片(如果是多切片数据)
    imageViewer->Render();
    imageViewer->GetRenderer()->ResetCamera();




     //实例化一个对象reader
    vtkSmartPointer<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();




    //实例化一个对象reader
    vtkSmartPointer<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();



    //实例化一个对象reader
    vtkSmartPointer<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 added
    vtkNew<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  见本文链接