Qcreator联合编译VTK8.1和ITK4.13
没想到困扰昨天晚上一晚上的问题,早上就突然就解决了。开心!继续上一篇的内容。
在参考之前的几篇文章,大家已经完成了基本ITK,VTK的独立安装了,现在我们开始联合编译一下。
本项目Github地址: Alxemade/VTK_ITK_SimpleTest/test_itk_vtk/ 欢迎Star和Fork。
1. 项目结构
还是建立类似的结构图:
这里我们参考的是如下文章: ITK的安装与测试。
但是由于版本的问题,我们需要对一些局部代码就行修改,才能得到我们期望的结果。
2. 编写代码
按照作者的文章,我们需要安装insightApplication, 但是我惊喜的发现我们安装ITK之后已经有了相关的模块了,所以就不需要安装了。主要是
#include <itkImageToVTKImageFilter.h>头文件,表示ITK和VTK的图形的转换,但是我们已经有了。就不需要继续安装了。
2.1 .pro文件编写
这里这个pro文件编写的思路还是很简单的,就是把itk和vtk相关的头文件和lib文件包含进去就行了。
其中需要注意一点就是, 我们需要额外添加几句代码:
win32: LIBS += "shell32.lib" win32: LIBS += "advapi32.lib" win32: LIBS += "rpcrt4.lib" win32: LIBS += "wsock32.lib "
不然后续会出现很多:
出现异常:error LNK2019: 无法解析的外部符号 _SnmpUtilVarBindFree@4的错误。
我们总体.pro文件代码如下:
QT -= gui CONFIG += c++11 console CONFIG -= app_bundle QT += widgets DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ main.cpp SysStatus = $$system(if exist %windir%/SysWOW64 echo x64) ## if contains SysWOW64 prove the windows is 64 bit win32 { ## Windows common build here !contains(SysStatus, x64) { message("x86 build ") ## Windows x86 (32bit) specific build here } else { message("x86_64 build") ## Windows x64 (64bit) specific build here LABMR_PREFIX = E:/XC/vtk/vtk-8.1.1/build/lib ## TOOLS_PREFIX = quote(C:/Program Files) } } ##VTK INCLUDEPATH Starts INCLUDEPATH += $$quote(C:/Program Files/VTK/include/vtk-8.1) ##VTK Ends ##ITK INCLUDEPATH Starts INCLUDEPATH += $$quote(E:/XC/itk/Bin/include/ITK-4.13) ##win32: LIBS += "snmpapi.lib" win32: LIBS += "shell32.lib" win32: LIBS += "advapi32.lib" win32: LIBS += "rpcrt4.lib" win32: LIBS += "wsock32.lib " ##ITK Ends CONFIG(debug, debug|release) { ## VTK Debug LIB Starts LIBS += $${LABMR_PREFIX}/Debug/vtk*.lib ## VTK Debug LIB Ends ## ITK Debug LIB Starts LIBS += $$quote(E:/XC/itk/Bin/lib/itk*.lib) LIBS += $$quote(E:/XC/itk/Bin/lib/ITK*.lib) ## ITK Debug LIB Ends } else { ## VTK Release LIB Starts LIBS += $${LABMR_PREFIX}/Release/vtk*.lib ## VTK Release LIB Ends ## ITK Release LIB Starts ## ITK Release LIB Starts }
2.2 cpp文件编写
如果直接拷贝之前的文章可能不能直接运行:我们需要进行修改。
2.2.1 错误1: 无法将C++ const char如何转换成char
这是我们在进行转换的时候出现的出现的问题,解决方法:C/C++ const char如何转换成char
2.2.2 错误2: 很多类没有SetInput函数了
参考:VTK学习(一)SetInputData和SetInputConnection替换SetInput
我们对相关的进行修改。作者的思路还是因为版本的问题。
2.2.3 错误3: Error: no override found for ‘vtkImageSliceMapper’.
参考: VTKError:no override found for ‘vtkImageMapper’ 和Link to vtkInteractionStyle
解决加上两句代码:
#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2)
注意因为我们的版本比较高,这里是vtkRenderingOpenGL2
而不是vtkRenderingOpenGL
一般来说,主要的问题就是这些,如果有其他问题,可以自行百度。 接下来我们贴一下我们的cpp代码:
#include <itkImage.h> #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2)#include <itkImageFileReader.h> #include <itkImageToVTKImageFilter.h> #include <itkGDCMImageIO.h> #include <vtkImageViewer.h> #include <vtkRenderWindowInteractor.h> #include <vtkSmartPointer.h> #include <vtkImageFlip.h> #include <vtkRenderer.h> #include <vtkImageActor.h> #include <vtkCamera.h> #include <vtkImageMapper.h> #include <string.h> using namespace std; int main() { typedef itk::Image<unsigned char,2> ImageType; typedef itk::ImageFileReader<ImageType> ReaderType; ReaderType::Pointer reader = ReaderType::New(); //获得DICOM文件读取对象 typedef itk::GDCMImageIO ImageIOType; ImageIOType::Pointer gdcmImageIO = ImageIOType::New(); //Filterofitkimagedatatovtkimagedata; typedef itk::ImageToVTKImageFilter<ImageType>FilterType; FilterType::Pointer connector = FilterType::New(); //获得DICOM文件名并读取DICOM文件; const char *temp = "G://qt_problem//test_itk_vtk//dcm//brain_001.dcm"; char *DICOMName =new char[strlen(temp)+1]; strcpy(DICOMName, temp); //const char* DICOMName = "G://qt_problem//test_itk_vtk//dcm//brain_001.dcm"; reader->SetFileName(DICOMName); reader->SetImageIO(gdcmImageIO); //ITK到VTK转化 connector->SetInput(reader->GetOutput()); connector->Update(); vtkSmartPointer<vtkImageFlip> flip = vtkSmartPointer<vtkImageFlip>::New(); //vtkSmartPointer<vtkImageMapper> flip->SetInputData(connector->GetOutput()); flip->SetFilteredAxis(1); //需要进行上下翻转才能正确显示; flip->Update(); vtkSmartPointer<vtkImageActor>actor = vtkSmartPointer<vtkImageActor>::New(); actor->SetInputData(flip->GetOutput()); actor->InterpolateOff(); vtkSmartPointer<vtkRenderer>renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New(); iren->SetRenderWindow(renderWindow); iren->Initialize(); iren->Start(); return 0; }
这里有一点就是我们显示的是一个dcm文件,百度了好多都是需要csdn金币的,但是没有真的无力吐槽开源多么重要 推荐一个一个博客,上面写了好多dicom图像网站,真心不错。收集了一些国外 DICOM 文件下载网站。
另外在我的项目里面我提供了20张dcm图像,感兴趣的同学可以自己下载:
Alxemade/VTK_ITK_SimpleTest/test_itk_vtk/dcm/
3. 显示
最后显示的图像大概是这样。
Over!
阅读更多因为ITK,VTK,QT这些也是第一次接触,其中好多原理性的东西也不是太明白。所以有错误的地方还是需要大家指出来。 接下来就是学习这些库的过程了…
- ITK、VTK、Qt安装与联合编译
- ITK VTK CTK QT 跨平台联合开发之 二 <Mac OS X篇>
- cmake编译 itk,vtk, igstk 的MinGW版本
- ITK+VTK+VS环境搭建.Q:vs编译出问题参见VTK(一)哈。
- ITK VTK CTK QT 跨平台联合开发之 四 <Mac OS X篇>
- centos7.3平台下 利用Cmake3.4.3源码编译安装 QT5.8.0 VTK7.1.1 ITK4.11.1
- ITK VTK CTK QT 跨平台联合开发之 一
- ITK VTK CTK QT 跨平台联合开发之 一 <Windows篇> .
- ITK VTK CTK QT 跨平台联合开发之 三 <Mac OS X篇>
- Unbuntu下编译ITK,VTK
- ITK VTK CTK QT 跨平台联合开发之 一 <Mac OS X篇>
- ITK3.2和VTK5.8的编译安装
- VTK .NET 正确的编译顺序
- Ubuntu下用gcc与nasm联合编译
- itk vtk in matlab
- 下载并编译android8.1工程
- vs2012 编译vtk5.8.0 win32
- VS2013 VTK8.1 安装配置
- ITK&&VTK读取DICOM数据并渲染
- VTK6.2&6.3+VS2013+QT5编译配置