Qt5.15+VS2019+vtk9.0.3+itk5.2.0环境搭建

小结

           仅以此博文纪念这段时间糟心的环境配置,高手请略过......

           最近在接触医疗软件这个新领域,接触到的第三方库比我之前用过的所有还要多,多以被搞的有点头大。现在搜集到的资料整理如下,希望能帮助到需要的朋友!

PS:本人极懒,非必要不关注系统及软件的发展动态,嘿嘿......

Qt

Qt也用了有两年的时间了,之前都是同事下载好了帮我装好,我只负责使用(请羡慕下我有这样的一位同事)。现在没人帮我,只能自己硬着头皮上了。Qt的安装真是害人不浅,从离线到在线,从5.12到5.15,再加上公司的龟速网,真是前前后后折腾了两天。

先说离线安装,现在Qt从5.15之后就只提供在线安装,所以我就下载了5.12.11(为了下载它,我电脑扛回了家,公司的网和手机的热点都太慢了,反馈了问题,还被领导来了句要学会自力更生,让我哭一会儿)。5.12安装的时候居然不支持MSVC2019的编译器。无奈的我只好选择了5.15,个人觉得5.15的版本相对比较稳定。

在线安装,选择了5.15.2。由于选择了安装源码,我又开始了漫长的等待过程,从公司安装到家,总算安装好了。建议:大家在Qt安装时可以选择不安装源码,在后面直接下载更快。

附上Qt下载地址(每次都要去官网找半天):Index of /official_releases/qt/5.15/5.15.0

Qt安装好后,记得添加环境变量,否则有可能出现工程无法编译的问题。Qt的安装没什么特别的,按照提示进行安装即可。

VS2019

VS2019的安装相对来说顺利多了。微软提供了离线安装的方法,即打包离线安装包。

VTK

CMake编译请参考:

VS2019+cmake(3.15.3)+VTK(8.2.0)+配置完成后的demo演示_Pure_vv的博客-CSDN博客_vs2019 vtk

VTK笔记-Qt5.12.11编译VTK9.0.3-QVTKOpenGLNativeWidget_liushao1031177的博客-CSDN博客_vtk支持qt

注意点:

1. 文件放置路径

 将下载的VTK源码(VTK-9.0.3.zip)解压到VTK-9.0.3文件夹下,将Data.解压到Data文件夹下。

2. 注意CMAKE_INSTALL_PREFIX选项,选择新建的install文件夹,编译后的文件均放置在此。

VTK-9.0.3编译文件(没有VTK——QT的库):

链接:https://pan.baidu.com/s/1eZzbU-8yz1V3YXse-mk8mg 
提取码:kbzm

VTK-8.2.0编译文件:

链接:https://pan.baidu.com/s/14KablBKGEV5mFxaPWLC_EQ 
提取码:5eeh

ITK

CMake编译参考:https://blog.csdn.net/wae42675/article/details/71922529

编译文件:

链接:https://pan.baidu.com/s/1H1wOEiRvsEcF9iJ6tU5I4Q 
提取码:vpr0

测试

参考:VS2019+Qt5.14.2+VTK8.2.0+ITK5.1.0环境配置_Jinxing_Gao的博客-CSDN博客

//设置读取图像类型
    using PixelType = signed short;
    const unsigned int  Dimension = 2;
    typedef itk::Image<PixelType, Dimension> ImageType;
    typedef itk::ImageFileReader<ImageType> ReaderType;
    //读取指针
    ReaderType::Pointer reader = ReaderType::New();
    //设置读取文件
    reader->SetFileName("D:\\CTData\\CASEhz001\\01-CT\\CT.1.JCT-266144.2.28.dcm");

    //创建读取DCM的GDCMIOImage类
    using ImageIOType = itk::GDCMImageIO;
    ImageIOType::Pointer gdcmImageIO = ImageIOType::New();
    reader->SetImageIO(gdcmImageIO);
    try
    {
        reader->Update();
    }
    catch (itk::ExceptionObject& e)
    {
        std::cerr << "exception in file reader" << std::endl;
        std::cerr << e << std::endl;
        return EXIT_FAILURE;
    }

    //连接滤波器,转换为VTK类型
    typedef itk::ImageToVTKImageFilter<ImageType> FilterType;
    FilterType::Pointer filter = FilterType::New();
    filter->SetInput(reader->GetOutput());
    try
    {
        filter->Update();
    }
    catch (itk::ExceptionObject& e)
    {
        std::cerr << "exception in file reader" << std::endl;
        std::cerr << e << std::endl;
        return EXIT_FAILURE;
    }

    vtkSmartPointer<vtkImageData> image = filter->GetOutput();

    //由于ITK格式与VTK格式图片Y轴相反,因此要进行翻转
    vtkSmartPointer<vtkImageFlip> imageflip = vtkSmartPointer<vtkImageFlip>::New();
    imageflip->SetInputData(filter->GetOutput());
    imageflip->SetFilteredAxes(1);//Y轴
    imageflip->Update();

    /* vtkImageActor在3D场景下渲染图像 */
    vtkSmartPointer<vtkImageActor> actor = vtkImageActor::New();
    actor->SetInputData(imageflip->GetOutput());

    vtkSmartPointer<vtkRenderer> render = vtkRenderer::New();
    render->AddActor(actor);
    render->SetBackground(255, 1, 1);//设置窗口背景颜色

    vtkSmartPointer<vtkRenderWindow> window = vtkRenderWindow::New();
    window->SetSize(600, 600);       //设置窗口大小
    window->AddRenderer(render);
    window->SetWindowName("the CT picture ");//设置窗口名称

    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkRenderWindowInteractor::New();
    interactor->SetRenderWindow(window);

    vtkSmartPointer<vtkInteractorStyleImage> style = vtkSmartPointer<vtkInteractorStyleImage>::New();
    interactor->SetInteractorStyle(style);

    interactor->Initialize();
    interactor->Start();

VTK验证实例

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QSurfaceFormat>
#include <QVTKOpenGLNativeWidget.h>
#include <vtkSphereSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include <vtkNamedColors.h>
#include <vtkProperty.h>
#include <vtkSmartPointer.h>
#include <vtkRenderingVolumeModule.h>

#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
//VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
//VTK_MODULE_INIT(vtkRenderingFreeType);

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());
    vtkNew<vtkNamedColors> colors;
    vtkNew<vtkSphereSource> sphereSource;
    vtkNew<vtkPolyDataMapper> sphereMapper;
    sphereMapper->SetInputConnection(sphereSource->GetOutputPort());
    vtkNew<vtkActor> sphereActor;
    sphereActor->SetMapper(sphereMapper);
    sphereActor->GetProperty()->SetColor(colors->GetColor4d("Tomato").GetData());
    vtkNew<vtkRenderer> renderer;
    renderer->AddActor(sphereActor);
    renderer->SetBackground(colors->GetColor3d("SteelBlue").GetData());
    vtkNew<vtkGenericOpenGLRenderWindow> renderWindow;
    renderWindow->AddRenderer(renderer);
    renderWindow->SetWindowName("RenderWindowNoUIFile");
    setCentralWidget(ui->openGLWidget);
    ui->openGLWidget->SetRenderWindow(renderWindow);
}

MainWindow::~MainWindow()
{
    delete ui;
}


版权声明:本文为qq_40041064原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。