vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示

VTK是一套进行数据可视化但通用开发工具包,提供了一个用于三维计算机图形、图像处理及可视化的开放源码的软件类库。它在科学计算可视化,尤其是三维重建方面具有强大的功能,使其在医学图像领域得到广泛应用。VTK提供了多种用于读取各种数据格式文件的类。

ITK主要提供医学图像的分割与配准功能,是专门针对医学影像领域开发的。ITK提供了完整的读取DICOM图像的方法,包括读取单张二维DICOM图片,读取二维序列图片并存储为体数据,读取文件头信息的方法等等。对于需要进行图像后处理的情况,使用ITK读取DICOM图像更为方便,便于读取图像后直接对图像使用ITK的其他类进行分割、配准等处理。

对于需要进行图像后处理的情况,使用ITK来读取DICOM图像更为方便,便于读取图像后直接对图像使用ITK的其他类进行分割、配准等处理。但因为ITK并不具备可视化方面的功能,所以在应用ITK进行图像读取和处理后,往往再利用VTK进行可视化,以便观察结果及进行交互显示。

如果不想花太多时间可以直接下我编译好的库:
ITK-5.0.1编译好的库
VTK-8.2.0编译好的库

一、编译安装ITK-5.0.1

1.准备工作

  • 下载ITK-5.0.1:https://itk.org/ITK/resources/software.html
    推荐下载第三个压缩文件。

vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第1张图片

  • 下载cmake:https://cmake.org/download/

在这里插入图片描述

  • 创建ITKlib文件夹,在该文件夹下面创建三个文件夹:Bin,Build,Source
    Bin:后续VS2017编译的文件路径;
    Build:cmake编译后的文件路径;
    Source:将ITK-5.0.1解压到该目录下。

2.编译cmake

  • 打开下载的cmake文件夹,在bin目录下找到cmake-gui.exe文件

vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第2张图片

  • 编译ITK-5.0.1
    source code路径选择创建的Source路径,即下载的ITK-5.0.1目录;
    编译路径选择创建的Build目录。 vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第3张图片
  • 点击configure
    选择vs 2017,默认是win32平台,如果是64位选择x64。如果选择错误,选择file-delete cache
    vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第4张图片
  • 更改选项
    configure完后,会有很多红色。这时我们要
    1)打开Advanced选项;
    2)将CMAKE_INSTALL_PREFIX选项设置到我们之前创建的 \ITKlib\Bin文件夹,这个选项不更改的话,后续在VS进行编译的时候就会报错;
    3)勾选BUILD_SHARED_LIBS选项,勾选该选项会生成动态链接库dll文件。
    4)勾选Module_ITKVtkGlue项(如果只需安装ITK不需要勾选,否则要先安装VTK再来编译ITK),否则后面混合编程时会出现Error:cannot open source file “itkImageToVTKImageFilter.h”
    继续configure,直到没有出现红色,configure done,然后点击generate,generate done。
  • VS 2017编译
    成功生成完后,点击旁边的open project。
    打开工程后,选择debug、x64,右键ALL_BULID,重新生成。

时间很长,耐心等待,如果没有错误,右键INSTALL,仅用于项目,仅生成INSTALL。
vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第5张图片
等待一会,编译完成。

  • 配置环境
    这个时候Bin文件夹里会生成四个文件夹bin include lib share
    vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第6张图片
    1)配置环境变量
    在path中添加Bin中的bin路径
    vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第7张图片
    2)复制dll文件
    将bin文件夹下的所有dll文件复制到C:\Windows\System32和C:\Windows\SysWOW64中。
    vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第8张图片
  • 测试
    ITK5.0.1源码中有测试例子。
    vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第9张图片
    1)新建两个文件夹,Hello和Hello_bin;
    2)打开cmake;
    3)源码路径为Hello,编译路径为Hello_bin;
    4)configure和generate;
    5)生成完后打开Hello_bin中的HelloWorld.sln,设为启动项目。
    vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第10张图片
    6)结果
    如果闪退,加个system("pause);
    vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第11张图片

这种方法通过用cmake进行编译,就不需要设置vs 2017,但个人觉得较为麻烦,后面每个工程都要重新cmake。
和opencv类似,可通过设置vs 2017实现配置,该方法可参照下面VTK。

二、编译安装VTK-8.2.0

VTK安装跟ITK类似。
1.首先创建VTK-8.2.0lib文件夹,该文件夹下创建Bin,Build,Source文件夹。将VTK-8.2.0解压到Source中。
VTK下载地址:https://vtk.org/download/
vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第12张图片
2.cmake编译
vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第13张图片
3.修改选项
勾选BUILD_SHARED_LIBS;
修改CMAKE_INSTALL_PREFIX路径为C:\lib\VTK-8.2.0lib\Bin,即刚刚创建的Bin目录。
4.点击configure,点击generate,点击open project打开工程
5.VS2017 编译
选择Debug、x64,右键ALL_BUILD,点击重新生成。
vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第14张图片
右键INSTALL,点击仅用于项目,仅生成INSTALL。
vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第15张图片
要等好久,无错误则编译成功。如果想要发布版,就选择Release、x64,重复以上两步。
6.环境配置
1)配置环境变量
path添加C:\lib\VTK-8.2.0lib\Bin\bin
vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第16张图片
2)将bin文件夹下的所有dll文件复制到C:\Windows\System32和C:\Windows\SysWOW64中
3) VS 2017配置

  • 打开VS 2017,新建工程vtktest
  • 点击左侧底部属性管理器,双击Debug中的Microsoft.Cpp.x64.user
    vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第17张图片
  • 点击VC++目录,编辑包含目录,添加include路径
    C:\lib\VTK-8.2.0lib\Bin\include\vtk-8.2和C:\lib\VTK-8.2.0lib\Bin\include
    vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第18张图片
    编辑库目录,添加lib路径
    C:\lib\VTK-8.2.0lib\Bin\lib
    vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第19张图片
  • 打开链接器->输入,添加附加依赖项。
    vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第20张图片
    由于库比较多,先在lib文件夹下创建一个lib.txt文件,输入
    DIR *.lib /B >lib.TXT
    然后把lib.txt修改为.bat格式,运行,会生成一个lib.TXT文件,发现已将所有.lib文件写入,复制到附加依赖项。
    vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第21张图片
    7.测试
    在创建到vtktest中输入测试代码
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
VTK_MODULE_INIT(vtkRenderingOpenGL2);//和官方的例子有些不同,下面解释
VTK_MODULE_INIT(vtkInteractionStyle);
int main(int, char *[]) {
  vtkSmartPointer colors =
      vtkSmartPointer::New();

  // Set the background color.
  std::array 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).
  vtkSmartPointer cylinder =
      vtkSmartPointer::New();
  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.
  vtkSmartPointer cylinderMapper =
      vtkSmartPointer::New();
  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.
  vtkSmartPointer cylinderActor = vtkSmartPointer::New();
  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
  vtkSmartPointer renderer = vtkSmartPointer::New();
  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);

  // The render window is the actual GUI window
  // that appears on the computer screen
  vtkSmartPointer renderWindow =
      vtkSmartPointer::New();
  renderWindow->SetSize(300, 300);
  renderWindow->AddRenderer(renderer);
  renderWindow->SetWindowName("Cylinder");

  // The render window interactor captures mouse events
  // and will perform appropriate camera or actor manipulation
  // depending on the nature of the events.
  vtkSmartPointer renderWindowInteractor =
      vtkSmartPointer::New();
  renderWindowInteractor->SetRenderWindow(renderWindow);

  // This starts the event loop and as a side effect causes an initial render.
  renderWindowInteractor->Start();

  return EXIT_SUCCESS;
}

运行结果:
vs2017编译安装ITK-5.0.1+VTK-8.2.0,混合编程,读取图像并显示_第22张图片

三、ITK和VTK联合测试,用ITK读取图像,VTK显示

两个库都编译安装好后,混合编程时发现会出现以下错误:
Error:cannot open source file “itkImageToVTKImageFilter.h”
用CMake编译ITK时,选中Module_ITKVtkGlue项,重新编译。
测试:

#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageToVTKImageFilter.h"
#include "itkJPEGImageIOFactory.h"

#include "vtkSmartPointer.h"
#include "vtkImageViewer.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);
#include "vtkImageFlip.h"
//ITK and VTK to show picture test
int main(int argc, char **argv)
{
	typedef itk::Image ImageType;//the type of pic
	typedef itk::ImageFileReader ReaderType;   //the class of read pic
	typedef itk::ImageToVTKImageFilter ConnectorType;  //connenct itk and vtk

	ReaderType::Pointer reader = ReaderType::New();
	ConnectorType::Pointer connector = ConnectorType::New();
	reader->SetFileName("C:/input/1.jpg");

	itk::JPEGImageIOFactory::RegisterOneFactory();

	connector->SetInput(reader->GetOutput());
	connector->Update();

	vtkSmartPointer imageflip = vtkSmartPointer::New();
	imageflip->SetInputData(connector->GetOutput());
	imageflip->SetFilteredAxes(1);//Y轴
	imageflip->Update();

	vtkSmartPointer viewer = vtkSmartPointer::New();
	vtkSmartPointer interactor = vtkSmartPointer::New();
	viewer->SetInputData(imageflip->GetOutput());
	viewer->SetupInteractor(interactor);
	viewer->GetRenderWindow()->SetSize(484, 300);//set window size
	viewer->SetColorWindow(255); //set window color
	viewer->SetColorLevel(128);   //set the level of window
	viewer->Render();

	interactor->Initialize();
	interactor->Start();
	return EXIT_SUCCESS;
}

你可能感兴趣的:(医学图像,ITK学习笔记)