Qt VTK显示单张DICOM图像并调节窗宽窗位

开发环境:

  • Qt 5.12.7( & Visual Studio 2017)
  • VTK 8.2.0

源代码:

#include <QtWidgets/QApplication>

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)

#include <QVTKOpenGLNativeWidget.h>
#include <vtkDICOMImageReader.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkImageSlice.h>
#include <vtkImageResliceMapper.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleImage.h>
#include <vtkNew.h>

const char* dcmFileName = "G:/DICOM/DCM/009/I1270.dcm";

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QVTKOpenGLNativeWidget w;

    vtkNew<vtkDICOMImageReader> reader;
    vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
    vtkNew<vtkRenderer> renderer;
    vtkNew<vtkImageSlice> imageSlice;
    vtkNew<vtkImageResliceMapper> mapper;
    vtkNew<vtkInteractorStyleImage> interactorStyle;    // 用于响应鼠标事件以调节窗宽窗位

    reader->SetFileName(dcmFileName);
    reader->Update();
    vtkImageData* imageData = reader->GetOutput();

    mapper->SetInputData(imageData);
    imageSlice->SetMapper(mapper);
    renderer->AddViewProp(imageSlice);
    renderWindow->AddRenderer(renderer);
    w.SetRenderWindow(renderWindow);
    w.GetInteractor()->SetInteractorStyle(interactorStyle);

    renderer->ResetCamera();
    w.show();

    return a.exec();
}

运行效果:

鼠标左键按住不放,上下移动调整窗位,左右移动调整窗宽

鼠标右键按住不放,上下移动放大缩小,或者使用鼠标滚轮

 
 
扩展:如果不想使用上述VTK默认方式调节调节窗位,同时也不想让图像显示成三维模式(可以旋转),那么需要继承vtkInteractorStyleImage类,将虚函数virtual void WindowLevel()重写,如下代码所示:
//
// QVtkInteractorStyleImage.h
//
#pragma once

#include <vtkInteractorStyleImage.h>

class QVtkInteractorStyleImage : public vtkInteractorStyleImage
{
public:
    static QVtkInteractorStyleImage *New();
    vtkTypeMacro(QVtkInteractorStyleImage, QVtkInteractorStyleImage);

    virtual void WindowLevel() override;

protected:
    QVtkInteractorStyleImage() = default;
    ~QVtkInteractorStyleImage() = default;

};
//
// QVtkInteractorStyleImage.cpp
//
#include "QVtkInteractorStyleImage.h"
#include <vtkObjectFactory.h>

vtkStandardNewMacro(QVtkInteractorStyleImage);

void QVtkInteractorStyleImage::WindowLevel()
{

}

设置窗宽窗位接口:

imageSlice->GetProperty()->SetColorLevel(/*double*/val);   // 窗位
imageSlice->GetProperty()->SetColorWindow(/*double*/val);  // 窗宽

 

好的,以下是一个简单的Qt使用VTK显示DICOM格式图像的代码示例: ```cpp #include <vtkSmartPointer.h> #include <vtkDICOMImageReader.h> #include <vtkImageViewer2.h> #include <QVTKWidget.h> void showDicomImage(QVTKWidget *vtkWidget, const char* dicomPath) { // Create a DICOM image reader vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New(); reader->SetDirectoryName(dicomPath); reader->Update(); // Create an image viewer vtkSmartPointer<vtkImageViewer2> viewer = vtkSmartPointer<vtkImageViewer2>::New(); viewer->SetInputConnection(reader->GetOutputPort()); viewer->SetupInteractor(vtkWidget->GetRenderWindow()->GetInteractor()); viewer->SetRenderWindow(vtkWidget->GetRenderWindow()); viewer->SetSliceOrientationToXY(); viewer->SetSlice(0); viewer->Render(); } ``` 在这个例子中,我们创建了一个名为 `showDicomImage` 的函数,该函数接受一个 `QVTKWidget` 和一个 `const char*` 类型的 DICOM 文件路径作为参数,用于显示DICOM格式的图像。 我们首先创建了一个 `vtkDICOMImageReader` 对象,并将 DICOM 文件路径设置为其目录名称,然后调用 `Update()` 方法读取 DICOM 文件。 接下来,我们创建了一个 `vtkImageViewer2` 对象并将其输入连接到 `vtkDICOMImageReader` 的输出端口。我们还将 `QVTKWidget` 的渲染窗口和交互器设置为图像查看器的渲染窗口和交互器。最后,我们将切片的方向设置为 XY,并将第一个切片设置为当前切片。 最后,我们调用 `Render()` 方法更新图像查看器并在 `QVTKWidget` 中显示图像。 希望这可以帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值