ubuntu14.04下ITK4.8,VTK6.2和Qt4整合笔记

比较好的ubantu14.04的博客,ITK/VTK的安装等

http://my.oschina.net/u/1046919/blog/483789

ubuntu14.04下ITK4.8,VTK6.2和Qt4整合笔记

整合这三个,对于刚接触的新手我来说是一件很复杂的玩意,根本无从下手,网络整合的资源也不多,而且大部分是用cmake来管理项目,直接用过Qt的.pro文件来管理项目还是很少的,因此通过这次整合经历,记录出现问题,以便翻阅。

一 整合

通过Qtcreator创建Qt项目,会出现带有.pro文件的项目。

编辑.pro文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
QT       += core gui
 
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
TARGET = vtkQtTest
TEMPLATE = app
 
 
SOURCES += main.cpp\
         mainwindow.cpp
 
HEADERS  += mainwindow.h
 
FORMS    += mainwindow.ui
 
 
INCLUDEPATH += /usr/local/include/vtk-6.2
INCLUDEPATH += /usr/local/include/ITK-4.8
 
LIBS += -lvtkalglib-6.2\
  -lvtkChartsCore-6.2\
  -lvtkCommonColor-6.2\
  -lvtkCommonComputationalGeometry-6.2\
  -lvtkCommonCore-6.2\
  -lvtkCommonDataModel-6.2\
  -lvtkCommonExecutionModel-6.2\
  -lvtkCommonMath-6.2\
  -lvtkCommonMisc-6.2\
  -lvtkCommonSystem-6.2\
  -lvtkCommonTransforms-6.2\
  -lvtkDICOMParser-6.2\
  -lvtkDomainsChemistry-6.2\
  -lvtkexoIIc-6.2\
  -lvtkexpat-6.2\
  -lvtkFiltersAMR-6.2\
  -lvtkFiltersCore-6.2\
  -lvtkFiltersExtraction-6.2\
  -lvtkFiltersFlowPaths-6.2\
  -lvtkFiltersGeneral-6.2\
  -lvtkFiltersGeneric-6.2\
  -lvtkFiltersGeometry-6.2\
  -lvtkFiltersHybrid-6.2\
  -lvtkFiltersHyperTree-6.2\
  -lvtkFiltersImaging-6.2\
  -lvtkFiltersModeling-6.2\
  -lvtkFiltersParallel-6.2\
  -lvtkFiltersParallelImaging-6.2\
  -lvtkFiltersProgrammable-6.2\
  -lvtkFiltersSelection-6.2\
  -lvtkFiltersSMP-6.2\
  -lvtkFiltersSources-6.2\
  -lvtkFiltersStatistics-6.2\
  -lvtkFiltersTexture-6.2\
  -lvtkFiltersVerdict-6.2\
  -lvtkfreetype-6.2\
  -lvtkftgl-6.2\
  -lvtkGeovisCore-6.2\
  -lvtkgl2ps-6.2\
  -lvtkGUISupportQt-6.2\
  -lvtkGUISupportQtOpenGL-6.2\
  -lvtkGUISupportQtSQL-6.2\
  -lvtkGUISupportQtWebkit-6.2\
  -lvtkhdf5-6.2\
  -lvtkhdf5_hl-6.2\
  -lvtkImagingColor-6.2\
  -lvtkImagingCore-6.2\
  -lvtkImagingFourier-6.2\
  -lvtkImagingGeneral-6.2\
  -lvtkImagingHybrid-6.2\
  -lvtkImagingMath-6.2\
  -lvtkImagingMorphological-6.2\
  -lvtkImagingSources-6.2\
  -lvtkImagingStatistics-6.2\
  -lvtkImagingStencil-6.2\
  -lvtkInfovisCore-6.2\
  -lvtkInfovisLayout-6.2\
  -lvtkInteractionImage-6.2\
  -lvtkInteractionStyle-6.2\
  -lvtkInteractionWidgets-6.2\
  -lvtkIOAMR-6.2\
  -lvtkIOCore-6.2\
  -lvtkIOEnSight-6.2\
  -lvtkIOExodus-6.2\
  -lvtkIOExport-6.2\
  -lvtkIOGeometry-6.2\
  -lvtkIOImage-6.2\
  -lvtkIOImport-6.2\
  -lvtkIOInfovis-6.2\
  -lvtkIOLegacy-6.2\
  -lvtkIOLSDyna-6.2\
  -lvtkIOMINC-6.2\
  -lvtkIOMovie-6.2\
  -lvtkIONetCDF-6.2\
  -lvtkIOParallel-6.2\
  -lvtkIOParallelXML-6.2\
  -lvtkIOPLY-6.2\
  -lvtkIOSQL-6.2\
  -lvtkIOVideo-6.2\
  -lvtkIOXML-6.2\
  -lvtkIOXMLParser-6.2\
  -lvtkjpeg-6.2\
  -lvtkjsoncpp-6.2\
  -lvtklibxml2-6.2\
  -lvtkmetaio-6.2\
  -lvtkNetCDF-6.2\
  -lvtkNetCDF_cxx-6.2\
  -lvtkoggtheora-6.2\
  -lvtkParallelCore-6.2\
  -lvtkpng-6.2\
  -lvtkproj4-6.2\
  -lvtkRenderingAnnotation-6.2\
  -lvtkRenderingContext2D-6.2\
  -lvtkRenderingContextOpenGL-6.2\
  -lvtkRenderingCore-6.2\
  -lvtkRenderingFreeType-6.2\
  -lvtkRenderingFreeTypeOpenGL-6.2\
  -lvtkRenderingGL2PS-6.2\
  -lvtkRenderingImage-6.2\
  -lvtkRenderingLabel-6.2\
  -lvtkRenderingLIC-6.2\
  -lvtkRenderingLOD-6.2\
  -lvtkRenderingOpenGL-6.2\
  -lvtkRenderingQt-6.2\
  -lvtkRenderingVolume-6.2\
  -lvtkRenderingVolumeOpenGL-6.2\
  -lvtksqlite-6.2\
  -lvtksys-6.2\
  -lvtktiff-6.2\
  -lvtkverdict-6.2\
  -lvtkViewsContext2D-6.2\
  -lvtkViewsCore-6.2\
  -lvtkViewsInfovis-6.2\
  -lvtkViewsQt-6.2\
  -lvtkzlib-6.2\
 
 
 
 
LIBS+=-lITKBiasCorrection-4.8\
  -lITKBioCell-4.8\
  -lITKCommon-4.8\
  -lITKDICOMParser-4.8\
  -lITKEXPAT-4.8\
  -lITKFEM-4.8\
  -lITKgiftiio-4.8\
  -lITKIOBioRad-4.8\
  -lITKIOBMP-4.8\
  -lITKIOCSV-4.8\
  -lITKIOGDCM-4.8\
  -lITKIOGE-4.8\
  -lITKIOGIPL-4.8\
  -lITKIOHDF5-4.8\
  -lITKIOImageBase-4.8\
  -lITKIOIPL-4.8\
  -lITKIOJPEG-4.8\
  -lITKIOLSM-4.8\
  -lITKIOMesh-4.8\
  -lITKIOMeta-4.8\
  -lITKIOMRC-4.8\
  -lITKIONIFTI-4.8\
  -lITKIONRRD-4.8\
  -lITKIOPNG-4.8\
  -lITKIOSiemens-4.8\
  -lITKIOSpatialObjects-4.8\
  -lITKIOStimulate-4.8\
  -lITKIOTIFF-4.8\
  -lITKIOTransformBase-4.8\
  -lITKIOTransformHDF5-4.8\
  -lITKIOTransformInsightLegacy-4.8\
  -lITKIOTransformMatlab-4.8\
  -lITKIOVTK-4.8\
  -lITKIOXML-4.8\
  -lITKKLMRegionGrowing-4.8\
  -lITKLabelMap-4.8\
  -lITKMesh-4.8\
  -lITKMetaIO-4.8\
  -lITKniftiio-4.8\
  -lITKNrrdIO-4.8\
  -lITKOptimizers-4.8\
  -lITKOptimizersv4-4.8\
  -lITKPath-4.8\
  -lITKPolynomials-4.8\
  -lITKQuadEdgeMesh-4.8\
  -lITKSpatialObjects-4.8\
  -lITKStatistics-4.8\
  -lITKVideoCore-4.8\
  -lITKVideoIO-4.8\
  -lITKVNLInstantiation-4.8\
  -lITKVTK-4.8\
  -lITKVtkGlue-4.8\
  -lITKWatersheds-4.8\
  -lITKznz-4.8\
  -litksys-4.8\
  -litkvnl-4.8 \
  -litkvnl_algo-4.8

对于INCLUDE代码后面要加上自己的ITK和VTK的include文件夹,注意自己的在哪里,写正确位置,后面的LIBS一般在/usr/local/lib/目录下,注意把原来前面的lib换成-l,最前面要有空格,最后的.so要删除,连接用"\"符号。

test.cxx文件,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include "itkImageFileReader.h"
#include "itkImageToVTKImageFilter.h"
 
#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)
//注意以上两句 cmake管理可以不用
#include <vtkSmartPointer.h>
#include "vtkImageViewer2.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkInteractorStyleImage.h"
#include "itkJPEGImageIOFactory.h"
#include "vtkImageMapper3D.h"
#include "vtkImageActor.h"
 
//#include "vtkJPEGReader.h"
#define JPEG_IMAGE_FILE_PATH "/home/jason/123.jpg"
//#include "itkRescaleIntensityImageFilter.h"
 
 
using  namespace  itk;
 
int  main( int  argc,  char  *argv[])
{
     typedef  itk::Image<itk::RGBPixel<unsigned  char >, 2> ImageType;
     typedef  itk::ImageFileReader<ImageType>             ReaderType;
     typedef  itk::ImageToVTKImageFilter<ImageType>       ConnectorType;
     itk::JPEGImageIOFactory::RegisterOneFactory();     //注意这里的注册,用cmake管理可以不用
     ReaderType::Pointer reader = ReaderType::New();
     ConnectorType::Pointer connector = ConnectorType::New();
 
     reader->SetFileName(JPEG_IMAGE_FILE_PATH);
     connector->SetInput(reader->GetOutput());
 
     vtkSmartPointer<vtkImageActor> actor =
       vtkSmartPointer<vtkImageActor>::New();
//一定要注意下面的代码,不然可能是一片黑
   # if  VTK_MAJOR_VERSION <= 5
     actor->SetInput(connector->GetOutput());
   # else
     connector->Update();
     actor->GetMapper()->SetInputData(connector->GetOutput());
   #endif
     vtkSmartPointer<vtkRenderer> renderer =
       vtkSmartPointer<vtkRenderer>::New();
     renderer->AddActor(actor);
     renderer->ResetCamera();
 
     vtkSmartPointer<vtkRenderWindow> renderWindow =
       vtkSmartPointer<vtkRenderWindow>::New();
     renderWindow->AddRenderer(renderer);
 
     vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
       vtkSmartPointer<vtkRenderWindowInteractor>::New();
     vtkSmartPointer<vtkInteractorStyleImage> style =
       vtkSmartPointer<vtkInteractorStyleImage>::New();
 
     renderWindowInteractor->SetInteractorStyle(style);
 
     renderWindowInteractor->SetRenderWindow(renderWindow);
     renderWindowInteractor->Initialize();
 
     renderWindowInteractor->Start();
 
     return  EXIT_SUCCESS;
}


如果使用cmake管理项目,只要在CMakeLists.txt写上

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
cmake_minimum_required(VERSION 2.4)
project(test)
find_package(ITK REQUIRED)
include(${ITK_USE_FILE})
     if  (ITKVtkGlue_LOADED)
         find_package(VTK REQUIRED) 
         include(${VTK_USE_FILE})
     else ()
         find_package(ItkVtkGlue REQUIRED)
         include(${ItkVtkGlue_USE_FILE})
         set(Glue ItkVtkGlue)
     endif() 
add_executable(test MACOSX_BUNDLE test.cxx)
target_link_libraries(test  ${Glue}  ${VTK_LIBRARIES} ${ITK_LIBRARIES})

就可以了,记得改文件的名字,我的是test.cpp。

如果还有疑问可以上一下两个网站参考:

http://www.itk.org/Wiki/ITK/Examples

http://www.vtk.org/Wiki/VTK/Examples


二 错误

1.之前除了两个与vnl有关的错误,具体报错忘记了,可以在.pro中添加

?
1
2
  -litkvnl-4.8 \
  -litkvnl_algo-4.8

之前的文件已经添加了可以在最后面找到。


2.用一般的cmake管理项目时,ITK读取文件可以直接用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const  char  * ImageFileName =  "" ;
const  unsigned  int  Dimension = 2;
     
typedef  unsigned  char  PixelType;
typedef  itk::Image< PixelType, Dimension > ImageType;
     
typedef  itk::ImageFileReader< ImageType >  ReaderType;
ReaderType::Pointer reader = ReaderType::New();
 
reader->SetFileName(ImageFileName );
try
{
     reader->Update();
     return  EXIT_FAILURE;
}
catch ( itk::ImageFileReaderException & )
{
     std::cout <<  "fail.\n"  << std::endl;
}

直接用采用Qt项目,用ITK来读取图片的时候,直接这样写会报错误

?
1
2
3
4
5
terminate called after throwing an instance of  'itk::ImageFileReaderException'
   what():  /usr/local/include/ITK-4.8/itkImageFileReader.hxx:143:
  Could not create IO object  for  reading file /home/jason/program/ITK-4/Examples/Data/BrainT1Slice.png
   There are no registered IO factories.
   Please visit http: //www.itk.org/Wiki/ITK/FAQ#NoFactoryException to diagnose the problem.

http://www.itk.org/Wiki/ITK/FAQ#NoFactoryException这里给出的解释是:

(1)如果是用cmake,需要在add_executable 或者 add_library之前添加

        include( ${ITK_USE_FILE} )

(2)如果没有使用cmake,必须对factories进行注册,可以使用

        XXXImageIOFactory::RegisterOneFactory(),XXX是类型

具体的代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
     const  char  * metaImageFileName =  "" ;
     const  char  * pngFileName =  "" ;
     
     const  unsigned  int  Dimension = 2;
     
     typedef  unsigned  char  PixelType;
     typedef  itk::Image< PixelType, Dimension > ImageType;
     
     typedef  itk::ImageFileReader< ImageType >  ReaderType;
     ReaderType::Pointer reader = ReaderType::New();
     
     typedef  std::list< itk::LightObject::Pointer > RegisteredObjectsContainerType;
     
     
     RegisteredObjectsContainerType registeredIOs =
     itk::ObjectFactoryBase::CreateAllInstance(  "itkImageIOBase"  );
     std::cout <<  "When CMake is not used to register the IO classes, there are\n"
                 << registeredIOs.size()
                 <<  " IO objects available to the ImageFileReader.\n"  << std::endl;
     
     
     std::cout <<  "When we try to read a MetaImage, we will " ;
     reader->SetFileName( metaImageFileName );
     try
     {
         reader->Update();
         return  EXIT_FAILURE;
     }
     catch ( itk::ImageFileReaderException & )
     {
         std::cout <<  "fail.\n"  << std::endl;
     }
     
     
     std::cout <<  "After registering the MetaImageIO object, " ;
     itk::MetaImageIOFactory::RegisterOneFactory();
     
     std::cout <<  "there are\n" ;
     registeredIOs = itk::ObjectFactoryBase::CreateAllInstance(  "itkImageIOBase"  );
     std::cout << registeredIOs.size()
                 <<  " IO objects available to the ImageFileReader.\n"  << std::endl;
     
     std::cout <<  "Now, when we try to read a MetaImage, we will " ;
     try
     {
         reader->Update();
         std::cout <<  "succeed.\n"  << std::endl;
     }
     catch ( itk::ImageFileReaderException & error )
     {
         std::cerr <<  "Error: "  << error << std::endl;
         return  EXIT_FAILURE;
     }
     
     
     std::cout <<  "Every format desired to be supported by the reader\n"
                 <<  "must be registered."  << std::endl;
     itk::PNGImageIOFactory::RegisterOneFactory();
     reader->SetFileName( pngFileName );
     try
     {
         reader->Update();
     }
     catch ( itk::ExceptionObject & error )
     {
         std::cerr <<  "Error: "  << error << std::endl;
         return  EXIT_FAILURE;
     }

参考代码:http://itk.org/ITKExamples/src/IO/ImageBase/RegisterIOFactories/Documentation.html


3.如果出现一下错误,找不到vtkImageSliceMapper,

?
1
2
3
4
5
6
7
8
9
Starting /home/jason/QtProjects/build-vtkQtTest-unknown-Debug/vtkQtTest...
Generic Warning: In /home/jason/program/VTK-6.2.0/Rendering/Core/vtkImageSliceMapper.cxx, line 35
Error: no override found  for  'vtkImageSliceMapper' .
 
Generic Warning: In /home/jason/program/VTK-6.2.0/Rendering/Core/vtkRenderWindow.cxx, line 40
Error: no override found  for  'vtkRenderWindow' .
 
Generic Warning: In /home/jason/program/VTK-6.2.0/Rendering/Core/vtkRenderer.cxx, line 46
Error: no override found  for  'vtkRenderer' .

需要在#include任何有关vtk的头文件之前添加

?
1
2
#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)

这两句,具体为什么还没有搞懂,如果有人知道希望能告知。

也可以使用代码

?
1
2
#include <vtkAutoInit.h>
  VTK_MODULE_INIT(vtkRenderingOpenGL);

但是会出现其它警告

?
1
2
3
Starting /home/jason/QtProjects/build-vtkQtTest-unknown-Debug/vtkQtTest...
Warning: In /home/jason/program/VTK-6.2.0/Rendering/Core/vtkInteractorStyleSwitchBase.cxx, line 43
vtkInteractorStyleSwitchBase (0x1924210): Warning: Link to vtkInteractionStyle  for  default  style selection.

原因还未分析。

如果是使用cmake管理,那么就不会有这个错误,在CMakeLists.txt里都定义好了,不会有问题。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值