小结
仅以此博文纪念这段时间糟心的环境配置,高手请略过......
最近在接触医疗软件这个新领域,接触到的第三方库比我之前用过的所有还要多,多以被搞的有点头大。现在搜集到的资料整理如下,希望能帮助到需要的朋友!
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;
}