VTK、ITK安装及ITK读取图片、VTK显示示例

文章目录

  • 前言
  • 一、配置
  • 二、混合编程实例
    • 1.创建工程
    • 2.修改CMakeLists.txt
    • 3.画界面mainwidow.ui
    • 3.编程(~ 1 ~)
    • 4.运行
  • 反思
  • 总结

前言

本文将简要回顾VTK、ITK安装过程中遇到的坑,便于排雷。详细说明如何使用ITK和VTK在QT中混合编程。 你可能会有疑问为啥要使用QT呢,使用VS不香吗?其实在我看来QT的界面做出来的比较漂亮,而且就IDE的界面和舒适感来说,QT都要比VS看起来炫酷,鉴于装x和将来的实用,选择QT来编程。VTK的使用也会让自己的界面看起来非常炫酷(带3D旋转的那种),重点是项目需求。至于使用ITK,主要是它里面有很多算法,特别是对于我这种菜菜来说,可以偷懒用他们现成的程序,但是不得不说,别人的东西使用起来还是需要学习下怎么使用的,我将会在ITK读取图片的过程中说明自己的辛酸过程

一、配置

1.vs2017安装:可以参照这个地址安装,安装这个的目的主要是后面安装VTK和ITK时候Build要用,而且有别的需要编译的东西也会用到它。不过我没有按照这个安装,因为我的电脑安装有这个,不过以我的经验来看,安装这个很简单,除了耗费点时间。

2.CMake安装: 参考安装链接

我安装的版本是3.20.1

**注意:**安装完成要记得添加环境变量,一定记得,一定记得,一定记得,在使用QT的CMake模式的时候要用到。

3.QT安装: 参考安装[链接](https://blog.csdn.net/weixin_41656968/article/details/80369576)

我安装的版本是QT5.9.9
在这里遇到这一步


记得勾选MSVC 2017 64-bit,其他的可以不选,因为我们在上一步已经配置安装了VS 2017。
安装完成后,打开QT选择工具->选项就可以看到CMake了

4.VTK安装 参考链接
我安装的版本是VTK8.2.0
在CMake的过程中注意下面参数的设置。

另外需要注意的是在使用VS2017进行BUILD文件ALL_BUILD和INSTALL的时候 ,记得检查VS2017的这个地方选择的是Debug还是Release。

要记清楚自己所选的模式,不然在之后QT中的编译会出现很多问题。

最后插一句,如果根据网上的教程发现在相应的文件夹下找不到对应的文件,不要慌,不要怀疑自己,记得在VTK安装的大目录下搜素就好了,可能它出现在别的文件夹下。

4.ITK安装 参考安装[教程](https://blog.csdn.net/webzhuce/article/details/70494822) 我安装的版本是ITK4.13.3,需要注意的地方和VTK一样,记得选Module_ITKVtkGlue,不选这个不能itk和vtk一块使用,甚至读入的图片想显示都费劲

使用VS2017的时候注意Debug和Release,最后测试的时候,用CMake生成.sln文件,能在VS2017中运行即可。

二、混合编程实例

1.创建工程

打开QT新建工程,按下面的参数进行

接下来这一步非常关键,记得勾选CMake,别用QMake。

ITK的头文件啊库啊什么的一大堆都需要用CMake进行管理。用QMake的话,我暂时不会搞,include ITK的头文件的时候就会报错,所以我用了CMake的模式。

接下来的过程就是一顿默认下一步,直到这里记得选MSVC 2017。
接下来的过程就是一顿默认下一步,直至生成文件系统如下。

2.修改CMakeLists.txt

千万!千万!!千万!!!别抖机灵改这个文件名,改改里面的内容就行了
里面的内容如下:

cmake_minimum_required(VERSION 3.5)project(itktest LANGUAGES CXX)set(CMAKE_INCLUDE_CURRENT_DIR ON)set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)find_package(Qt5 COMPONENTS Widgets REQUIRED)
find_package(ITK REQUIRED)
find_package(VTK REQUIRED)if(ITK_FOUND)include(${ITK_USE_FILE})
ELSE(ITK_FOUND)MESSAGE(FATAL_ERROR"ITK not found. Please set ITK_DIR.")
endif()if(ITK_FOUND)include(${VTK_USE_FILE})
ELSE(ITK_FOUND)MESSAGE(FATAL_ERROR"VTK not found. Please set VTK_DIR.")
endif()if(ANDROID)add_library(itktest SHAREDmain.cppmainwindow.cppmainwindow.hmainwindow.ui)
else()add_executable(itktestmain.cppmainwindow.cppmainwindow.hmainwindow.ui)
endif()target_link_libraries(itktest PRIVATE Qt5::Widgets)
target_link_libraries(itktest PRIVATE ${ITK_LIBRARIES} ${VTK_LIBRARIES})

这里面的大致意思是要包含ITK和VTK的库,还要和QT结合起来,具体的内容也非常好懂,可以参考这篇博客,实在看不懂也没关系,以后都这么写就好了。
干到这里,就可以先构建一下看有啥问题没了,记得选 Debug模式去运行。(这是写给自己的,我的用Release不能关联ITK库)

3.画界面mainwidow.ui

除了默认的一些类,还用到了两个QPushbutten,一个QTextBrowser,和一个QWidget,还需要将其提升为QVTKWidget,用来显示图片,右键点击该部件,出现如下图所示:

画好后的界面如下图所示
创建好之后的类如下

整完界面以后,开心的运行一下,看一下自己画的炫(chou)酷(lou)的界面。

3.编程(~ 1 ~)

编写mainwindow.h,包含类的定义和一些头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "QVTKWidget.h"
#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageToVTKImageFilter.h"
#include "itkJPEGImageIOFactory.h"#include "itkBMPImageIOFactory.h"
#include "itkImageFileReader.h"
#include "vtkImageViewer.h"
#include "itkCenteredRigid2DTransform.h"
#include "itkResampleImageFilter.h"
#include <vtkOutputWindow.h>
#include "vtkImageActor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include  <vtkSmartPointer.h>typedef itk::RGBPixel< unsigned char >   PixelType;
typedef itk::Image< PixelType, 2 >       ImageType;
typedef itk::ImageFileReader<ImageType> ReaderType;
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void display(ImageType::Pointer image);ImageType::Pointer imread(std::string Filename);ImageType::Pointer rotage(ImageType::Pointer image,double angle);private slots:void on_ori_clicked();void on_pushButton_2_clicked();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{vtkOutputWindow::SetGlobalWarningDisplay(0);   //不想看到那个丑陋的VTKOUTPUT窗口QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

mainwindow.cpp 对mainwindow.h中定义的方法进行实现。

#include "mainwindow.h"
#include "./ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::display(ImageType::Pointer image)
{//显示图片typedef itk::ImageToVTKImageFilter< ImageType > itkTovtkFilterType;itkTovtkFilterType::Pointer itkTovtkImageFilter = itkTovtkFilterType::New();itkTovtkImageFilter->Update();itkTovtkImageFilter->SetInput(image);//设置图像数据从ITK转向VTKitkTovtkImageFilter->Update();// vtkImageActor在3D场景下渲染图像vtkSmartPointer<vtkImageActor> actor = vtkImageActor::New();actor->SetInputData(itkTovtkImageFilter->GetOutput());//VTK渲染的一般步骤vtkSmartPointer<vtkRenderer> render = vtkRenderer::New();render->AddActor(actor);vtkSmartPointer<vtkRenderWindow> window = vtkRenderWindow::New();window->ClearInRenderStatus();window->SetSize(800, 600);window->AddRenderer(render);this->ui->widget->SetRenderWindow(window);this->ui->widget->GetRenderWindow()->Render();
}ImageType::Pointer MainWindow::imread(std::string Filename)
{//读入图像itk::JPEGImageIOFactory::RegisterOneFactory();ReaderType::Pointer reader = ReaderType::New();reader->SetFileName(Filename);reader->Update();return reader->GetOutput();}ImageType::Pointer MainWindow::rotage(ImageType::Pointer image,double angle)
{//实现对图像的旋转using TransformType = itk::CenteredRigid2DTransform<double>;using RescaleImageType = itk::ResampleImageFilter<ImageType, ImageType>;TransformType::Pointer transform = TransformType::New();RescaleImageType::Pointer rescale = RescaleImageType::New();const ImageType::SpacingType& spacing = image->GetSpacing();const ImageType::PointType& origin = image->GetOrigin();const ImageType::SizeType size = image->GetLargestPossibleRegion().GetSize();const double imageCenterx = origin[0] + spacing[0] * size[0] / 2.0;const double imageCenterY = origin[1] + spacing[1] * size[1] / 2.0;transform->SetAngle(angle);TransformType::OutputPointType Center;Center[0] = imageCenterx;Center[1] = imageCenterY;transform->SetCenter(Center);rescale->SetDefaultPixelValue(100);rescale->SetTransform(transform);rescale->SetSize(image->GetLargestPossibleRegion().GetSize());rescale->SetOutputOrigin(image->GetOrigin());rescale->SetOutputSpacing(image->GetSpacing());rescale->SetOutputDirection(image->GetDirection());rescale->SetInput(image);rescale->Update();ImageType::Pointer res = rescale->GetOutput();return res;}void MainWindow::on_ori_clicked()
{//如果不对图像进行反转180度,图像将是倒着的,这与itk和vtk的坐标定义有关ImageType::Pointer image = imread("F:/itktest/s.jpeg");   //尽量不要有中文路径,我有的时候好像啥也读不进去this->ui->textBrowser->clear();this->ui->textBrowser->append("This is original image");display(image);
}void MainWindow::on_pushButton_2_clicked()
{ImageType::Pointer image = imread("F:/itktest/s.jpeg");ImageType::Pointer result = rotage(image,3.14);this->ui->textBrowser->clear();this->ui->textBrowser->append("This is rotaged image");display(result);
}

4.运行

累半天,终于搞定了,接着就是运行下,欣赏下自己的作品,自信按下运行键,结果报了一万个错,甚至不想百度的那种错,又不想从头来了,想了想,忽然想到自己用的模式是Release,深恶痛绝,赶紧换成Debug模式,满怀期待的点了运行键,他就完美的出来了。

反思

这个程序只能显示,不能交互进行,一交互就显示灰色图片-乱码,运气不好还会崩。总之革命尚未成功,同志仍需努力。

总结

安装不好别怀疑自己,遵守职业操守,怀疑软件;遇事不决调参数。加油啥也不是的自己

VTK、ITK安装及ITK读取图片、VTK显示示例(CMake)相关推荐

  1. Unity读取图片并显示到UI中

    Unity读取图片并显示到UI中 方法一:将图片转换成字符串 代码 解释 效果图 方法二:将图片转换成字节数组 代码 解释 效果图 对比 在进行Unity开发时,经常会遇到将读取磁盘中图片显示到UI上 ...

  2. C++ opencv 4.5 imread() 读取图片,显示为空的解决办法

    C++ opencv 4.5 imread() 读取图片,显示为空的解决办法 一.路径问题 先查看下路径问题,如果使用的是相对路径,先查看下当前路径,判断输入的路径是否有错: #include < ...

  3. PyQt5(一) PyQt5安装及配置,从文件夹读取图片并显示,模拟生成素描图像

    目录 一.环境配置 1.1 安装PyQt5 1.2 安装Qt工具包 1.3 配置环境变量 ?1.4 测试PyQt5 ?1.5?配置PyCharm 二.QtDesigner 窗口简单介绍 2.1 初始界 ...

  4. python读取图片文件显示_Python—图像基本操作以及图像格式转换

    关于图像处理的模块常用的有 PIL,openCV等,不过应为要处理 tif 格式的图片,故特来写下这篇博客. 关于安装模块 libtiff 直接pip install libtiff 安装模块,发现无 ...

  5. python读取图片并且显示

    使用python-opencv读取图片,利用opencv或matplotlib显示图片. # -*- coding: utf-8 -*-import numpy as np from matplotl ...

  6. MVC中根据后台绝对路径读取图片并显示在IMG中

    数据库存取图片并在MVC3中显示在View中 根据路径读取图片: byte[] img = System.IO.File.ReadAllBytes(@"d:\xxxx.jpg"); ...

  7. 图片保存到数据库和从数据库读取图片并显示(C#)

    图片保存到数据库的方法: public void imgToDB(string sql) {   //参数sql中要求保存的imge变量名称为@images //调用方法如:imgToDB(" ...

  8. img src请求后台值值能判断_MVC中根据后台绝对路径读取图片并显示在IMG中

    简介:在有些情况下需要将图片转换为二进制流存放在数据库中,当显示时再从数据库中读出来显示在界面上. 本文简单介绍数据库中图片的存取方法,并在MVC3中显示在Razor视图中.仅供初学者参考学习. 1. ...

  9. java生成点阵图_Android从SD卡读取图片并显示为点阵图

    之前做一个项目的时候需要1.从SD卡读取图片转为预览图(点阵图,类似马赛克),2.保存当前预览图到特定文件夹,保存为一个txt,txt里存的是像素矩阵.3.从那个特定文件夹里读取像素矩阵,显示为预览图 ...

最新文章

  1. vc6.0注释功能的脚本快捷键设置代码
  2. 2008年12月答疑贴
  3. form表单属性名相同java_form表单提交 list对象给Java 后台结合
  4. nginx配置后重启无效与重启失败
  5. Educational Codeforces Round 41 (Rated for Div. 2)
  6. 我的Oracle 9i学习日志(11)--重做日志文件及练习
  7. python100例详解-Python 经典算法100及解析(小结)
  8. 经纬度距离、范围、方位角计算、坐标转换
  9. java wps haspassword,#在WPS表格里面设置了密码怎么取消#excel解除密码保护
  10. Fast is better than free: Revisiting adversarial training
  11. 《东周列国志》第六回 卫石碏大义灭亲 郑庄公假命伐宋
  12. 银海系统服务器登录不上,解决登录问题 - Skype for Business | Microsoft Docs
  13. 前端验证码与后端验证码
  14. Jeecg Boot 2.2 首个里程碑版本发布,基于SpringBoot的低代码平台
  15. krpano 小行星开场和自动旋转
  16. signal 阻塞与屏蔽
  17. comsol纳米光学案例分析
  18. 打印机连供加墨的新方式
  19. 主权财富基金刺痛发达国家神经
  20. 北京林业大学计算机网络期末考试,北京林业大学2006《计算机网络》考试大纲...

热门文章

  1. 为知笔记MathJax公式对齐
  2. CCF计算机软件能力认证 C++ 集合竞价
  3. Lucene随笔-Lucene的索引文件格式
  4. designate原理及自动化部署
  5. 【迷人的爪哇】——Java继承
  6. 解读本世纪最成功的天才——埃隆·马斯克
  7. java imageicon大小_自动缩放ImageIcon以标注大小
  8. 根据在同一时间使用计算机用户的多少,2016年职称计算机WindowsXP考前冲刺试题1...
  9. 进程切换及一些常见概念(面试必问)
  10. 国企单位软考高级是否值得备考?