博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ubuntu14.04下ITK4.8,VTK6.2和Qt4整合笔记
阅读量:5862 次
发布时间:2019-06-19

本文共 11231 字,大约阅读时间需要 37 分钟。

hot3.png

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

一 整合

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

编辑.pro文件

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = vtkQtTestTEMPLATE = appSOURCES += main.cpp\        mainwindow.cppHEADERS  += mainwindow.hFORMS    += mainwindow.uiINCLUDEPATH += /usr/local/include/vtk-6.2INCLUDEPATH += /usr/local/include/ITK-4.8LIBS += -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 
#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
, 2> ImageType;    typedef itk::ImageFileReader
             ReaderType;    typedef itk::ImageToVTKImageFilter
       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
 actor =      vtkSmartPointer
::New();//一定要注意下面的代码,不然可能是一片黑  #if VTK_MAJOR_VERSION <= 5    actor->SetInput(connector->GetOutput());  #else    connector->Update();    actor->GetMapper()->SetInputData(connector->GetOutput());  #endif    vtkSmartPointer
 renderer =      vtkSmartPointer
::New();    renderer->AddActor(actor);    renderer->ResetCamera();    vtkSmartPointer
 renderWindow =      vtkSmartPointer
::New();    renderWindow->AddRenderer(renderer);    vtkSmartPointer
 renderWindowInteractor =      vtkSmartPointer
::New();    vtkSmartPointer
 style =      vtkSmartPointer
::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。

213827_6Q04_1046919.png

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

二 错误

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.

这里给出的解释是:

(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;    }

参考代码:

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 35Error: no override found for 'vtkImageSliceMapper'.Generic Warning: In /home/jason/program/VTK-6.2.0/Rendering/Core/vtkRenderWindow.cxx, line 40Error: no override found for 'vtkRenderWindow'.Generic Warning: In /home/jason/program/VTK-6.2.0/Rendering/Core/vtkRenderer.cxx, line 46Error: no override found for 'vtkRenderer'.

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

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

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

也可以使用代码

#include 
 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 43vtkInteractorStyleSwitchBase (0x1924210): Warning: Link to vtkInteractionStyle for default style selection.

原因还未分析。

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

转载于:https://my.oschina.net/u/1046919/blog/483789

你可能感兴趣的文章
nginx应用总结(2)--突破高并发的性能优化
查看>>
linux安装配置SVN并设置钩子
查看>>
Flyweight享元模式(结构型模式)
查看>>
Redis全方位详解--数据类型使用场景和redis分布式锁的正确姿势
查看>>
Linux DNS 查询剖析(第四部分) | Linux 中国
查看>>
(转)azkaban job参数说明
查看>>
BZOJ4698: Sdoi2008 Sandy的卡片(后缀数组 二分)
查看>>
解析Json
查看>>
Haskell 与范畴论-函子、态射、函数
查看>>
Flask核心机制--上下文源码剖析
查看>>
开源库Magicodes.Storage正式发布
查看>>
PHP检测及判断手机登录用户是安卓或爱疯(iPhone)客户端
查看>>
Java 在PDF中添加水印——文本/图片水印
查看>>
Linux curl 命令
查看>>
centOS
查看>>
Spring MVC controller间跳转 重定向 传参
查看>>
Last Day in Autodesk
查看>>
(原創) 變成吃素的體質了 (日記)
查看>>
(原創) 如何在Nios II顯示8位數的七段顯示器? (IC Design) (DE2) (Nios II)
查看>>
(原創) 04/11/1984 サザン・ウインド (中森明菜)
查看>>