文档章节

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

KyJason
 KyJason
发布于 2015/07/26 09:23
字数 1578
阅读 226
收藏 1

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

一 整合

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

编辑.pro文件

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文件,代码如下:

#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写上

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中添加

 -litkvnl-4.8 \
 -litkvnl_algo-4.8

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


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

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来读取图片的时候,直接这样写会报错误

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是类型

具体的代码:

    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,

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的头文件之前添加

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

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

也可以使用代码

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

但是会出现其它警告

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里都定义好了,不会有问题。






© 著作权归作者所有

上一篇: vim配置
KyJason
粉丝 11
博文 67
码字总数 46303
作品 0
杭州
程序员
私信 提问
Ubuntu14.04下安装VTK6.2

VTK是一个基于面向对象的开源三维绘图软件包,安装过程并不复杂,简单的cmake就可以编译安装,具体过程还是要记录一下,以便翻看。 一 安装 1.下载VTK6,可以上官网自行下载http://www.vtk....

KyJason
2015/07/18
1K
0
DrWindays/PyNote

#PyNote 使用PYTHON QT4开发的便笺小工具(高仿Windows7 StikyNot) 平台:Ubuntu14.04 (开发者使用平台 理论上讲适用于存在PyQt4的 一切Linux平台 Windows平台暂不支持) 硬件:未知 开发语言:...

DrWindays
2015/02/08
0
0
Debian7 编译WizNote Qt Project(为知笔记)

Debian7 编译WizNote Qt Project(为知笔记) Debian 编译为知笔记, 中间的心酸过程我就不吐槽了。 作为一名不会c++ & QT 的,编译 为知笔记 ,的确不是个容易的事啊。。 编译步骤: git chec...

首席安全砖家
2014/03/07
1K
4
ubuntu14.04怎么给无线网卡配置静态IP

我在笔记本上安装了ubuntu14.04 32位版,网卡是一个无线网卡。安装的可以自动找到家的的无线路由器,输入密码后可联网。但每一次重启系统后,IP不一样,本人想为此网卡配置一个静态IP。方法是...

好学者01
2015/04/05
3.9K
5
Ubuntu 14.04下搭建Python3.4 + PyQt5.4.0 + Eric6.0开发平台

简要说明:QT是一个跨平台界面库和开发工具集,PyQt是其Python封装模块,其封装采用Sip完成(可以让C++库直接在Python中调用),Eric是基于Python的一个代码编辑器。 引言 找了很多Python GU...

openthings
2015/01/22
3.1K
3

没有更多内容

加载失败,请刷新页面

加载更多

关于运维,该怎么决定它的方向,这个似工作又似兴趣的存在

我之前主要从事网络、桌面、机房管理等相关工作,这些工作使我迷惘,这应该是大多数运维人都经历过的过程; 18年国庆,我从国内前三的消费金融公司裸辞,下海创业,就是想要摆脱这样的困境。...

网络小虾米
22分钟前
5
0
Java Timer的用法

Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { System.out.println("11232"); } }, 200000 , 1000); public void schedule(TimerTask task, long delay......

林词
26分钟前
4
0
使用js动态加载外部js文件以及动态创建script脚本

动态脚本指的是在页面加载时不存在,但将来的某一时刻通过修改该DOM动态添加的脚本。和操作HTML元素一样,创建动态脚本也有两种方式:插入外部文件和直接插入JavaScript代码。 动态加载外的外...

Bing309
33分钟前
3
0
从零开始入门 K8s | Kubernetes 网络概念及策略控制

作者 | 阿里巴巴高级技术专家 叶磊 一、Kubernetes 基本网络模型 本文来介绍一下 Kubernetes 对网络模型的一些想法。大家知道 Kubernetes 对于网络具体实现方案,没有什么限制,也没有给出特...

阿里巴巴云原生
37分钟前
3
0
天气获取

本文转载于:专业的前端网站➨天气获取 $.get("http://wthrcdn.etouch.cn/WeatherApi", { citykey: cityCode }, function (d) { //创建文档对象 var parser = new ......

前端老手
37分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部