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

整合这三个,对于刚接触的新手我来说是一件很复杂的玩意,根本无从下手,网络整合的资源也不多,而且大部分是用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。

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

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

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






你可能感兴趣的:(ubuntu14.04下ITK4.8,VTK6.2和Qt4整合笔记)