《PCL点云库学习&VS2010(X64)》Part 5 VTK6.2+VS2013+Qt5.5 测试VTK基于VS2013的Qt程序

来源:互联网 发布:java cookie设置了没用 编辑:程序博客网 时间:2024/05/07 08:39

配置环境

win7 64bit

VS2013(这个是没有64&32之分的,只是编译器分而已,只管装VS2013就是)

PCL-1.7.2-AllInOne-msvc2013-win32.exe

qt-opensource-windows-x86-msvc2013-5.5.0.exe

qt-vs-addin-1.2.3-opensource.exe

cmake-3.4.3-win32-x86

VTK6.2.0


一、编译VTK6.3.0

cmake:

1、按步骤来

手动添加变量:

1)Add Entry ->VTK_DIR、PATH、D:\VTK\VTKbin(vtk的bin目录,自己新建的)

2)Add Entry -> CMAKE_PREFIX_PATH、PATH、D:\Qt\Qt5.5.0\5.5\msvc2013。

3)Add Entry ->CMAKE_DEBUG_POSTFIX、STRING,Value为-gd,点击确定。按Configure按钮,等待配置完成。设置该项保证debug版本的lib,dll和release版本lib,dll名字不同,以防止后面安装时,两者覆盖。


修改的变量:   

1)CMAKE_INSTALL_PREFIX:Install单独生成的文件夹路径,这个是重要的一步,建议和src.bin同一个目录下新建集成文件,会生成bin,include,lib,plugins,share文件夹;

2)VTK_DATA_ROOT:加载数据文件夹;


勾选的变量:   

VTK_GROUP_QT,VTK_QT_VERSION:选择5(勾选VTK_GROUP_QT后点configure后,会弹出红色错误警告,此时将Qt版本改为5),


修改的变量:

1)QT_QMAKE_EXECUTABLE:加载QT版本中的bin目录下D:\Qt\Qt5.5.0\5.5\msvc2013\bin;


注:需要手动添加的变量:

1、VTK_DIR(D:\VTK\VTKbin)(vtk的bin目录,自己新建的,是configure和generate后生成.sln文件的目录);

2、CMAKE_PREFIX_PATH(D:\Qt\Qt5.5.0\5.5\msvc2013);

3、CMAKE_DEBUG_POSTFIX(STRING,Value为-gd):添加后缀用来区分debug版本和release版本的lib、dll、exp;

4、在configure按了之后会出现Module这个总的目录树,在里面可以勾选Module_vtkGUISupportMFC,从而生产MFC的动态库和静态库文件文件。

5、在Module目录树中还可以选择Module_vtkRenderingTk、Module_vtkglew

调试程序Qt5.5+VTK6.3的程序:



用vs2013打开D:\VTK\vtk6.2.0\VTKbin目录下的VTK.sln文件,打开VTK工程。选择debug模式,生成菜单->生成解决方案,大概需要等半个小时左右。不过由于VTK的版本不同,可能会报错。


等生成完毕后,找到INSTALL工程,右键INSTALL ->仅用于项目->仅生成INSTALL。
直至结束,如果编译时选择了QT,则需要选择Release模式,

右键“QVTKWidgetPlugin”选择仅用于项目-》仅生成QVTKWidgetPlugin。等待完成。

完成后在D:\VTK\vtk6.2.0\VTKbin\bin\Release中找到qvtkwidgetplugin .lib和qvtkwidgetplugin .dll,并将这两个文件拷贝到QT安装目录下(C:\Qt\Qt5.5.0\5.5\msvc2013\plugins\designer)目录下。


注意:如果勾选了Module_vtkGUISupportMFC的下面几点需要注意:

1、打开 KTV.sln ,如果使用vs2010,在编译整个解决方案之前,需要注意(VS2013貌似没有问题):
(1)请先找到VTKSrc\GUISupport\MFC\vtkMFCWindow.cpp ,找到类似以下源码并修改数值如下:

#ifndef WINVER  #define WINVER 0x0501  #endif  #ifndef _WIN32_WINNT  #define _WIN32_WINNT 0x0501 // =_WIN32_WINNT_NT4  #endif  #ifndef _WIN32_IE  #define _WIN32_IE 0x0601 //=_WIN32_IE_IE60SP1  #endif  


(2)如果之前Cmake勾选了 build_examples,工程中含有VKT的examples,仅改上面代码还不够,还需要找到

VTKSrc\Examples\GUI\Win32\vtkMFC\vtkDLG\stdafx.h
VTKSrc\Examples\GUI\Win32\vtkMFC\vtkMDI\stdafx.h
VTKSrc\Examples\GUI\Win32\vtkMFC\vtkSDI\stdafx.h
VTKSrc\Examples\GUI\Win32\SampleMFC\stdafx.h
四个文件,每个文件下找到类似以下源码并修改数值如下:

#ifndef WINVER #define WINVER 0x0501 #endif #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0501 #endif #if _MSC_VER >= 1300 #ifndef _WIN32_WINDOWS #define _WIN32_WINDOWS 0x0501 #endif #endif #ifndef _WIN32_IE #define _WIN32_IE 0x0601 #endif 

(3)VS2013在编译的过程中,会提示出现非Unicode导致无法编译MFC的内容的相关提示,这时不要担心,只需要将vtkGUISupportMFC进行右键->属性->配置属性->常规->字符集:使用Unicode字符集(而不是使用多字符集或者从父类继承)。

(4)我编译MFC的库时并没有勾选CMakez中BUILD->BUILD_EXAMPLE,也就是没有编译例子。也没选择BUILD_TESTING。


编译结束。


提取.lib文件

分别粘贴复制静态链接库名到文本甚是麻烦,故通过批处理来完成

例如要获取目录中D:\VTK\VTKbin\VTKBuild\lib 下的所有静态链接库文件名并存储至文本.txt,方法如下:
1、win+r
2、输入:cmd回车
3、输入:cd /d D:\VTK\VTKbin\VTKBuild\lib  回车
4、输入:dir /b *.lib*>0.txt  回车 


注:在提取*-gd.lib这些debug类型的库时,同样也可以使用这些命令

1、win+r 
2、输入:cmd回车 
3、输入:cd /d D:\PCL1.7.2\3rdParty\VTK\lib  回车 
4、输入:dir /b *-gd.lib*>VTKgd.txt  回车 


现在开始测试VTK6.3.0+VS2013+Qt5.5.0的例程,看是否配置好,但是有点要注意,这个例子并没有测试PCL1.7.2这个库。


打开VS2013,新建QApplication,命名aa:

在main.cpp中添加如下代码:

//#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)  //#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)A  #include <vtkAutoInit.h>   VTK_MODULE_INIT(vtkRenderingOpenGL);VTK_MODULE_INIT(vtkInteractionStyle);VTK_MODULE_INIT(vtkRenderingFreeType);  //这三句不通过的话,就注释掉,换成最上面的两句调试//VTK_MODULE_INIT(vtkRenderingFreeTypeOpenGL);#include "aa.h"//这句是自己工程的头文件,如果名字不一样,就换成自己的**.h#include <QtWidgets/QApplication>#include<vtkSmartPointer.h>  #include<vtkSphereSource.h>  #include<vtkPolyDataMapper.h>  #include<vtkActor.h>  #include<vtkImageViewer.h>  #include<vtkRenderWindowInteractor.h>  #include<vtkInteractorStyleImage.h>  #include<vtkJPEGReader.h>  #include<vtkRenderer.h>  #include<QVTKWidget.h>int main(int argc, char *argv[]){//QApplication a(argc, argv);//aa w;//w.show();//return a.exec();QApplication app(argc, argv);QVTKWidget widget;widget.resize(256, 256);vtkSmartPointer<vtkSphereSource>sphereSource = vtkSmartPointer<vtkSphereSource>::New();sphereSource->Update();vtkSmartPointer<vtkPolyDataMapper>sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();sphereMapper->SetInputConnection(sphereSource->GetOutputPort());vtkSmartPointer<vtkActor>sphereActor = vtkSmartPointer<vtkActor>::New();sphereActor->SetMapper(sphereMapper);vtkSmartPointer<vtkRenderWindow>renderWindow = vtkSmartPointer<vtkRenderWindow>::New();vtkSmartPointer<vtkRenderer>renderer = vtkSmartPointer<vtkRenderer>::New();renderWindow->AddRenderer(renderer);renderer->AddActor(sphereActor);renderer->ResetCamera();widget.SetRenderWindow(renderWindow);widget.show();app.exec();return EXIT_SUCCESS;}


加入头文件、库文件路径和库文件

头文件:

.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;D:\Qt\Qt5.5.0\5.5\msvc2013\include;D:\VTK\VTKbin\VTKBuild\include\vtk-6.3;%(AdditionalIncludeDirectories)


库文件路径:

$(QTDIR)\lib;D:\VTK\VTKbin\VTKBuild\lib;%(AdditionalLibraryDirectories)


库文件(自动提取的lib文件,在0.txt中,复制粘贴过去)前面几个Qt的库是自动加的,其他是自己加的,供参考:

qtmaind.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5Widgetsd.lib;vtkalglib-6.3.lib;vtkChartsCore-6.3.lib;vtkCommonColor-6.3.lib;vtkCommonComputationalGeometry-6.3.lib;vtkCommonCore-6.3.lib;vtkCommonDataModel-6.3.lib;vtkCommonExecutionModel-6.3.lib;vtkCommonMath-6.3.lib;vtkCommonMisc-6.3.lib;vtkCommonSystem-6.3.lib;vtkCommonTransforms-6.3.lib;vtkDICOMParser-6.3.lib;vtkDomainsChemistry-6.3.lib;vtkexoIIc-6.3.lib;vtkexpat-6.3.lib;vtkFiltersAMR-6.3.lib;vtkFiltersCore-6.3.lib;vtkFiltersExtraction-6.3.lib;vtkFiltersFlowPaths-6.3.lib;vtkFiltersGeneral-6.3.lib;vtkFiltersGeneric-6.3.lib;vtkFiltersGeometry-6.3.lib;vtkFiltersHybrid-6.3.lib;vtkFiltersHyperTree-6.3.lib;vtkFiltersImaging-6.3.lib;vtkFiltersModeling-6.3.lib;vtkFiltersParallel-6.3.lib;vtkFiltersParallelImaging-6.3.lib;vtkFiltersProgrammable-6.3.lib;vtkFiltersSelection-6.3.lib;vtkFiltersSMP-6.3.lib;vtkFiltersSources-6.3.lib;vtkFiltersStatistics-6.3.lib;vtkFiltersTexture-6.3.lib;vtkFiltersVerdict-6.3.lib;vtkfreetype-6.3.lib;vtkftgl-6.3.lib;vtkGeovisCore-6.3.lib;vtkgl2ps-6.3.lib;vtkGUISupportQt-6.3.lib;vtkGUISupportQtOpenGL-6.3.lib;vtkGUISupportQtSQL-6.3.lib;vtkGUISupportQtWebkit-6.3.lib;vtkhdf5-6.3.lib;vtkhdf5_hl-6.3.lib;vtkImagingColor-6.3.lib;vtkImagingCore-6.3.lib;vtkImagingFourier-6.3.lib;vtkImagingGeneral-6.3.lib;vtkImagingHybrid-6.3.lib;vtkImagingMath-6.3.lib;vtkImagingMorphological-6.3.lib;vtkImagingSources-6.3.lib;vtkImagingStatistics-6.3.lib;vtkImagingStencil-6.3.lib;vtkInfovisCore-6.3.lib;vtkInfovisLayout-6.3.lib;vtkInteractionImage-6.3.lib;vtkInteractionStyle-6.3.lib;vtkInteractionWidgets-6.3.lib;vtkIOAMR-6.3.lib;vtkIOCore-6.3.lib;vtkIOEnSight-6.3.lib;vtkIOExodus-6.3.lib;vtkIOExport-6.3.lib;vtkIOGeometry-6.3.lib;vtkIOImage-6.3.lib;vtkIOImport-6.3.lib;vtkIOInfovis-6.3.lib;vtkIOLegacy-6.3.lib;vtkIOLSDyna-6.3.lib;vtkIOMINC-6.3.lib;vtkIOMovie-6.3.lib;vtkIONetCDF-6.3.lib;vtkIOParallel-6.3.lib;vtkIOParallelXML-6.3.lib;vtkIOPLY-6.3.lib;vtkIOSQL-6.3.lib;vtkIOVideo-6.3.lib;vtkIOXML-6.3.lib;vtkIOXMLParser-6.3.lib;vtkjpeg-6.3.lib;vtkjsoncpp-6.3.lib;vtklibxml2-6.3.lib;vtkLocalExample-6.3.lib;vtkmetaio-6.3.lib;vtkNetCDF-6.3.lib;vtkNetCDF_cxx-6.3.lib;vtkoggtheora-6.3.lib;vtkParallelCore-6.3.lib;vtkpng-6.3.lib;vtkproj4-6.3.lib;vtkRenderingAnnotation-6.3.lib;vtkRenderingContext2D-6.3.lib;vtkRenderingContextOpenGL-6.3.lib;vtkRenderingCore-6.3.lib;vtkRenderingFreeType-6.3.lib;vtkRenderingGL2PS-6.3.lib;vtkRenderingImage-6.3.lib;vtkRenderingLabel-6.3.lib;vtkRenderingLIC-6.3.lib;vtkRenderingLOD-6.3.lib;vtkRenderingOpenGL-6.3.lib;vtkRenderingQt-6.3.lib;vtkRenderingVolume-6.3.lib;vtkRenderingVolumeOpenGL-6.3.lib;vtksqlite-6.3.lib;vtksys-6.3.lib;vtkTestingGenericBridge-6.3.lib;vtkTestingIOSQL-6.3.lib;vtkTestingRendering-6.3.lib;vtktiff-6.3.lib;vtkverdict-6.3.lib;vtkViewsContext2D-6.3.lib;vtkViewsCore-6.3.lib;vtkViewsInfovis-6.3.lib;vtkViewsQt-6.3.lib;vtkzlib-6.3.lib;%(AdditionalDependencies)


编译运行:


说明配置好了VTK6.3.0+VS2013+QT5.5.0


二、测试PCL1.7.2与VS2013的配置是否融合

新建win32 控制台空项目,命名为example,然后在源文件中新建example.cpp文件,复制下面代码,这其实是实例代码,第一节中有:

#include <vtkAutoInit.h>   VTK_MODULE_INIT(vtkRenderingOpenGL);VTK_MODULE_INIT(vtkInteractionStyle);VTK_MODULE_INIT(vtkRenderingFreeType);//VTK_MODULE_INIT(vtkRenderingFreeTypeOpenGL);#include <pcl/visualization/cloud_viewer.h>#include <iostream>#include <pcl/io/io.h>#include <pcl/io/pcd_io.h>int user_data;void viewerOneOff(pcl::visualization::PCLVisualizer& viewer){viewer.setBackgroundColor(1.0, 0.5, 1.0);pcl::PointXYZ o;o.x = 1.0;o.y = 0;o.z = 0;viewer.addSphere(o, 0.25, "sphere", 0);std::cout << "i only run once" << std::endl;}void viewerPsycho(pcl::visualization::PCLVisualizer& viewer){static unsigned count = 0;std::stringstream ss;ss << "Once per viewer loop: " << count++;viewer.removeShape("text", 0);viewer.addText(ss.str(), 200, 300, "text", 0);//FIXME: possible race condition here:user_data++;}int main(){pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>);// 1.pcd路径为D:\\QtWorkspace\\example\\example\\1.pcd当然可以修改为自定义的地方///////////////////////////pcl::io::loadPCDFile("D:\\QtWorkspace\\example\\example\\1.pcd", *cloud);pcl::visualization::CloudViewer viewer("Cloud Viewer");//blocks until the cloud is actually renderedviewer.showCloud(cloud);//use the following functions to get access to the underlying more advanced/powerful//PCLVisualizer//This will only get called onceviewer.runOnVisualizationThreadOnce(viewerOneOff);//This will get called once per visualization iterationviewer.runOnVisualizationThread(viewerPsycho);while (!viewer.wasStopped()){//you can also do cool processing here//FIXME: Note that this is running in a separate thread from viewerPsycho//and you should guard against race conditions yourself...user_data++;}return 0;}



然后就是添加库、lib文件夹和lib文件


包含目录:

$(PCL_ROOT)\include\pcl-1.7;$(PCL_ROOT)\3rdParty\Boost\include\boost-1_57;$(PCL_ROOT)\3rdParty\Eigen\eigen3;$(PCL_ROOT)\3rdParty\FLANN\include;$(PCL_ROOT)\3rdParty\QHull\include;$(PCL_ROOT)\3rdParty\VTK\include\vtk-6.2;D:\OpenNI\Include;$(IncludePath)

库目录:

$(PCL_ROOT)\lib;$(PCL_ROOT)\3rdParty\Boost\lib;$(PCL_ROOT)\3rdParty\FLANN\lib;$(PCL_ROOT)\3rdParty\QHull\lib;$(PCL_ROOT)\3rdParty\VTK\lib;D:\OpenNI\Lib;D:\PCL 1.7.2\3rdParty\VTK\bin;$(LibraryPath)

属性-链接器-输入-附加依赖项:

pcl_common_debug.lib;pcl_features_debug.lib;pcl_filters_debug.lib;pcl_io_debug.lib;pcl_io_ply_debug.lib;pcl_kdtree_debug.lib;pcl_keypoints_debug.lib;pcl_octree_debug.lib;pcl_outofcore_debug.lib;pcl_people_debug.lib;pcl_recognition_debug.lib;pcl_registration_debug.lib;pcl_sample_consensus_debug.lib;pcl_search_debug.lib;pcl_segmentation_debug.lib;pcl_surface_debug.lib;pcl_tracking_debug.lib;pcl_visualization_debug.lib;libboost_atomic-vc120-mt-gd-1_57.lib;libboost_chrono-vc120-mt-gd-1_57.lib;libboost_container-vc120-mt-gd-1_57.lib;libboost_context-vc120-mt-gd-1_57.lib;libboost_coroutine-vc120-mt-gd-1_57.lib;libboost_date_time-vc120-mt-gd-1_57.lib;libboost_exception-vc120-mt-gd-1_57.lib;libboost_filesystem-vc120-mt-gd-1_57.lib;libboost_graph-vc120-mt-gd-1_57.lib;libboost_iostreams-vc120-mt-gd-1_57.lib;libboost_locale-vc120-mt-gd-1_57.lib;libboost_log-vc120-mt-gd-1_57.lib;libboost_log_setup-vc120-mt-gd-1_57.lib;libboost_math_c99-vc120-mt-gd-1_57.lib;libboost_math_c99f-vc120-mt-gd-1_57.lib;libboost_math_c99l-vc120-mt-gd-1_57.lib;libboost_math_tr1-vc120-mt-gd-1_57.lib;libboost_math_tr1f-vc120-mt-gd-1_57.lib;libboost_math_tr1l-vc120-mt-gd-1_57.lib;libboost_mpi-vc120-mt-gd-1_57.lib;libboost_prg_exec_monitor-vc120-mt-gd-1_57.lib;libboost_program_options-vc120-mt-gd-1_57.lib;libboost_random-vc120-mt-gd-1_57.lib;libboost_regex-vc120-mt-gd-1_57.lib;libboost_serialization-vc120-mt-gd-1_57.lib;libboost_signals-vc120-mt-gd-1_57.lib;libboost_system-vc120-mt-gd-1_57.lib;libboost_test_exec_monitor-vc120-mt-gd-1_57.lib;libboost_thread-vc120-mt-gd-1_57.lib;libboost_timer-vc120-mt-gd-1_57.lib;libboost_unit_test_framework-vc120-mt-gd-1_57.lib;libboost_wave-vc120-mt-gd-1_57.lib;libboost_wserialization-vc120-mt-gd-1_57.lib;flann_cpp_s-gd.lib;qhullstatic_d.lib;vtkalglib-6.2-gd.lib;vtkChartsCore-6.2-gd.lib;vtkCommonColor-6.2-gd.lib;vtkCommonComputationalGeometry-6.2-gd.lib;vtkCommonCore-6.2-gd.lib;vtkCommonDataModel-6.2-gd.lib;vtkCommonExecutionModel-6.2-gd.lib;vtkCommonMath-6.2-gd.lib;vtkCommonMisc-6.2-gd.lib;vtkCommonSystem-6.2-gd.lib;vtkCommonTransforms-6.2-gd.lib;vtkDICOMParser-6.2-gd.lib;vtkDomainsChemistry-6.2-gd.lib;vtkexoIIc-6.2-gd.lib;vtkexpat-6.2-gd.lib;vtkFiltersAMR-6.2-gd.lib;vtkFiltersCore-6.2-gd.lib;vtkFiltersExtraction-6.2-gd.lib;vtkFiltersFlowPaths-6.2-gd.lib;vtkFiltersGeneral-6.2-gd.lib;vtkFiltersGeneric-6.2-gd.lib;vtkFiltersGeometry-6.2-gd.lib;vtkFiltersHybrid-6.2-gd.lib;vtkFiltersHyperTree-6.2-gd.lib;vtkFiltersImaging-6.2-gd.lib;vtkFiltersModeling-6.2-gd.lib;vtkFiltersParallel-6.2-gd.lib;vtkFiltersParallelImaging-6.2-gd.lib;vtkFiltersProgrammable-6.2-gd.lib;vtkFiltersSelection-6.2-gd.lib;vtkFiltersSMP-6.2-gd.lib;vtkFiltersSources-6.2-gd.lib;vtkFiltersStatistics-6.2-gd.lib;vtkFiltersTexture-6.2-gd.lib;vtkFiltersVerdict-6.2-gd.lib;vtkfreetype-6.2-gd.lib;vtkftgl-6.2-gd.lib;vtkGeovisCore-6.2-gd.lib;vtkgl2ps-6.2-gd.lib;vtkhdf5-6.2-gd.lib;vtkhdf5_hl-6.2-gd.lib;vtkImagingColor-6.2-gd.lib;vtkImagingCore-6.2-gd.lib;vtkImagingFourier-6.2-gd.lib;vtkImagingGeneral-6.2-gd.lib;vtkImagingHybrid-6.2-gd.lib;vtkImagingMath-6.2-gd.lib;vtkImagingMorphological-6.2-gd.lib;vtkImagingSources-6.2-gd.lib;vtkImagingStatistics-6.2-gd.lib;vtkImagingStencil-6.2-gd.lib;vtkInfovisCore-6.2-gd.lib;vtkInfovisLayout-6.2-gd.lib;vtkInteractionImage-6.2-gd.lib;vtkInteractionStyle-6.2-gd.lib;vtkInteractionWidgets-6.2-gd.lib;vtkIOAMR-6.2-gd.lib;vtkIOCore-6.2-gd.lib;vtkIOEnSight-6.2-gd.lib;vtkIOExodus-6.2-gd.lib;vtkIOExport-6.2-gd.lib;vtkIOGeometry-6.2-gd.lib;vtkIOImage-6.2-gd.lib;vtkIOImport-6.2-gd.lib;vtkIOInfovis-6.2-gd.lib;vtkIOLegacy-6.2-gd.lib;vtkIOLSDyna-6.2-gd.lib;vtkIOMINC-6.2-gd.lib;vtkIOMovie-6.2-gd.lib;vtkIONetCDF-6.2-gd.lib;vtkIOParallel-6.2-gd.lib;vtkIOParallelXML-6.2-gd.lib;vtkIOPLY-6.2-gd.lib;vtkIOSQL-6.2-gd.lib;vtkIOVideo-6.2-gd.lib;vtkIOXML-6.2-gd.lib;vtkIOXMLParser-6.2-gd.lib;vtkjpeg-6.2-gd.lib;vtkjsoncpp-6.2-gd.lib;vtklibxml2-6.2-gd.lib;vtkmetaio-6.2-gd.lib;vtkNetCDF-6.2-gd.lib;vtkNetCDF_cxx-6.2-gd.lib;vtkoggtheora-6.2-gd.lib;vtkParallelCore-6.2-gd.lib;vtkpng-6.2-gd.lib;vtkproj4-6.2-gd.lib;vtkRenderingAnnotation-6.2-gd.lib;vtkRenderingContext2D-6.2-gd.lib;vtkRenderingContextOpenGL-6.2-gd.lib;vtkRenderingCore-6.2-gd.lib;vtkRenderingFreeType-6.2-gd.lib;vtkRenderingFreeTypeOpenGL-6.2-gd.lib;vtkRenderingGL2PS-6.2-gd.lib;vtkRenderingImage-6.2-gd.lib;vtkRenderingLabel-6.2-gd.lib;vtkRenderingLIC-6.2-gd.lib;vtkRenderingLOD-6.2-gd.lib;vtkRenderingOpenGL-6.2-gd.lib;vtkRenderingVolume-6.2-gd.lib;vtkRenderingVolumeOpenGL-6.2-gd.lib;vtksqlite-6.2-gd.lib;vtksys-6.2-gd.lib;vtktiff-6.2-gd.lib;vtkverdict-6.2-gd.lib;vtkViewsContext2D-6.2-gd.lib;vtkViewsCore-6.2-gd.lib;vtkViewsInfovis-6.2-gd.lib;vtkzlib-6.2-gd.lib;%(AdditionalDependencies)

然后就是运行:



问题:

1.运行项目时,弹出错误对话框,提示缺少XXX.dll没有被指环境变量

如:

%PCL_ROOT%\3rdParty\VTK\bin;这个环境变量没加,导致一直报错,没有找到vtkCommondDataModel-gd.dll


重新设置环境变量后,果然能够解决这个dll找不到的问题!

2.运行项目时,输出窗口显示,无法解析的外部符号:没有配置lib目录或没有把全部的lib加入项目依赖中;
3.运行项目时,提示无法找到文件XX.lib : 配置了项目依赖,但是没有配置“库文件”中的条目;

4.Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.这个错误很逆天啊,任你怎么搞都搞不出来。这个除了环境变量有关外(第一步中涉及),关键地方还是属性->链接器:常规->附加库目录  和 输入->附加依赖项,这两个地方一定要对应,用的都是PCL1.7.2自带的VTK库。

5.要注意运行时,是Debug还是release模式,因为项目依赖是两个分别配置的。所以如果你全部配置是正确的,但是用Release模式运行,就会出现3中的错误。
6.项目依赖需要每个项目都配置一次!
7.但是国内网站几乎找不到解决方案的问题 (使用CMAKE生成项目不存在此问题):

        “读取位置。。。发生访问冲突。。”

这个问题只需要,在你的每一个代码文件最前面两行添加如下代码(这个在前面配置VTK、Qt的时候也出现过,前面也给出了代码,这里再强调一次):
//VTK_MODULE_INIT(vtkRenderingFreeTypeOpenGL);//这几句代码可以解决build成功但是运行时报错的问题#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)


具体原因见:http://www.vtk.org/Wiki/VTK/VTK_6_Migration/Factories_now_require_defines

8.还是第七个问题的版本,错误如下:


这个问题解决方法:头文件的前面几句加上:

#include <vtkAutoInit.h>     VTK_MODULE_INIT(vtkRenderingOpenGL);VTK_MODULE_INIT(vtkInteractionStyle);VTK_MODULE_INIT(vtkRenderingFreeType);  //这三句不通过的话,就注释掉,换成最上面的两句调试  //VTK_MODULE_INIT(vtkRenderingFreeTypeOpenGL);  


9.通过cmake生成了解决方案,运行时如果说缺少QVTK.lib请替换这个项目中的附加依赖项(所有和vtk有关的项,还可能有Qt和opengl等是需要保留的。),见配置过程!

10、英文配置教程:http://www.vtk.org/Wiki/VTK/Configure_and_Build

三、测试VTK6.3.0+PCL1.7.2+VS2013+Qt5,5.0

在VS中新建QtApplication工程 ,命名为TestQTWithVTK,一路下一步下一步,直到出现界面参考博文:

1、界面部分就不介绍了,点链接,按步骤来。

2、testqtwithvtk.h:

<pre name="code" class="html">#ifndef TESTQTWITHVTK_H#define TESTQTWITHVTK_H#include <vtkAutoInit.h>     VTK_MODULE_INIT(vtkRenderingOpenGL);VTK_MODULE_INIT(vtkInteractionStyle);VTK_MODULE_INIT(vtkRenderingFreeType);  //这三句不通过的话,就注释掉,换成最上面的两句调试  //VTK_MODULE_INIT(vtkRenderingFreeTypeOpenGL);  #include <QtWidgets/QMainWindow>#include "ui_testqtwithvtk.h"#include "vtkSmartPointer.h"class vtkImageViewer2;class vtkRenderer;class vtkEventQtSlotConnect;class TestQTWithVTK : public QMainWindow{Q_OBJECTpublic:TestQTWithVTK(QWidget *parent = 0);~TestQTWithVTK();private:Ui::TestQTWithVTKClass ui;private slots://响应打开图像文件的槽函数void onOpenSlot();private:vtkSmartPointer< vtkImageViewer2 > m_pImageViewer;vtkSmartPointer< vtkRenderer > m_pRenderder;private slots://响应鼠标移动的消息,实时输出鼠标的当前位置void updateCoords(vtkObject* obj);private:vtkEventQtSlotConnect* m_Connections;};#endif // TESTQTWITHVTK_H

testqtwithvtk.cpp:

#include "testqtwithvtk.h"#include <QFileDialog>#include <QDir>#include <vtkRenderWindow.h>#include <vtkRenderer.h>#include <vtkImageViewer2.h>#include <QVTKWidget.h>#include <vtkBMPReader.h>#include <vtkImageActor.h>#include "vtkEventQtSlotConnect.h"#include "vtkCommand.h"TestQTWithVTK::TestQTWithVTK(QWidget *parent): QMainWindow(parent){ui.setupUi(this);m_pImageViewer = vtkSmartPointer< vtkImageViewer2 >::New();m_pRenderder = vtkSmartPointer< vtkRenderer >::New();m_Connections = vtkEventQtSlotConnect::New();// 设置m_QVTKWidget的渲染器ui.qvtkWidget->GetRenderWindow()->AddRenderer(m_pRenderder);//连接打开的信号与相应的槽  connect(ui.actionOpen, SIGNAL(triggered()), this, SLOT(onOpenSlot()));m_Connections->Connect(ui.qvtkWidget->GetRenderWindow()->GetInteractor(),vtkCommand::MouseMoveEvent,this,SLOT(updateCoords(vtkObject*)));}TestQTWithVTK::~TestQTWithVTK(){m_Connections->Delete();}void TestQTWithVTK::onOpenSlot(){QString filter;filter = "BMP image file (*.bmp)";//只能.bmp 格式QDir dir;QString fileName = QFileDialog::getOpenFileName(this,QString(tr("打开图像")), dir.absolutePath(), filter);if (fileName.isEmpty() == true) return;// 支持带中文路径的读取QByteArray ba = fileName.toLocal8Bit();const char *fileName_str = ba.data();// 用vtkJPEGReader读取JPG图像vtkSmartPointer<vtkBMPReader> reader = vtkSmartPointer<vtkBMPReader>::New();reader->SetFileName(fileName_str);// 将reader的输出作为m_pImageViewer的输入,并设置m_pImageViewer与渲染器m_pRenderer的关联m_pImageViewer->SetInputConnection(reader->GetOutputPort());//m_pImageViewer->UpdateDisplayExtent();m_pImageViewer->SetRenderWindow(ui.qvtkWidget->GetRenderWindow());m_pImageViewer->SetRenderer(m_pRenderder);m_pImageViewer->SetupInteractor(ui.qvtkWidget->GetRenderWindow()->GetInteractor());m_pImageViewer->SetSliceOrientationToXY(); //默认就是这个方向的m_pImageViewer->GetImageActor()->InterpolateOff();m_pRenderder->ResetCamera();m_pRenderder->DrawOn();ui.qvtkWidget->GetRenderWindow()->Render();}void TestQTWithVTK::updateCoords(vtkObject* obj){// 获取交互器vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::SafeDownCast(obj);// 获取鼠标的当前位置int event_pos[2];iren->GetEventPosition(event_pos);QString str;str.sprintf("x=%d : y=%d", event_pos[0], event_pos[1]);ui.statusBar->showMessage(str);}

main.cpp:

#include "testqtwithvtk.h"#include <QtWidgets/QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);TestQTWithVTK w;w.show();return a.exec();}

3、

配置属性->VC++目录->包含目录:

D:\VTK\VTKbin\VTKBuild\include\vtk-6.3;$(IncludePath)

配置属性->VC++目录->库目录:

$(PCL_ROOT)\lib;$(PCL_ROOT)\3rdParty\Boost\lib;$(PCL_ROOT)\3rdParty\FLANN\lib;$(PCL_ROOT)\3rdParty\QHull\lib;$(PCL_ROOT)\3rdParty\VTK\lib;D:\OpenNI\Lib;D:\VTK\VTKbin\lib\Debug;$(LibraryPath)

C++->包含目录:

.\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;%(AdditionalIncludeDirectories)

链接器->常规->附加库目录:

$(QTDIR)\lib;%(AdditionalLibraryDirectories)

链接器->常规->输入:

qtmaind.lib;Qt5Cored.lib;Qt5Guid.lib;Qt5Widgetsd.lib;QVTKWidgetPlugin.lib;vtkalglib-6.3.lib;vtkChartsCore-6.3.lib;vtkCommonColor-6.3.lib;vtkCommonComputationalGeometry-6.3.lib;vtkCommonCore-6.3.lib;vtkCommonCoreCxxTests.lib;vtkCommonDataModel-6.3.lib;vtkCommonExecutionModel-6.3.lib;vtkCommonMath-6.3.lib;vtkCommonMisc-6.3.lib;vtkCommonSystem-6.3.lib;vtkCommonTransforms-6.3.lib;vtkDICOMParser-6.3.lib;vtkDomainsChemistry-6.3.lib;vtkexoIIc-6.3.lib;vtkexpat-6.3.lib;vtkFiltersAMR-6.3.lib;vtkFiltersCore-6.3.lib;vtkFiltersExtraction-6.3.lib;vtkFiltersFlowPaths-6.3.lib;vtkFiltersGeneral-6.3.lib;vtkFiltersGeneric-6.3.lib;vtkFiltersGeometry-6.3.lib;vtkFiltersHybrid-6.3.lib;vtkFiltersHyperTree-6.3.lib;vtkFiltersImaging-6.3.lib;vtkFiltersModeling-6.3.lib;vtkFiltersParallel-6.3.lib;vtkFiltersParallelImaging-6.3.lib;vtkFiltersProgrammable-6.3.lib;vtkFiltersSelection-6.3.lib;vtkFiltersSMP-6.3.lib;vtkFiltersSources-6.3.lib;vtkFiltersStatistics-6.3.lib;vtkFiltersTexture-6.3.lib;vtkFiltersVerdict-6.3.lib;vtkfreetype-6.3.lib;vtkftgl-6.3.lib;vtkGeovisCore-6.3.lib;vtkgl2ps-6.3.lib;vtkGUISupportQt-6.3.lib;vtkGUISupportQtOpenGL-6.3.lib;vtkGUISupportQtSQL-6.3.lib;vtkGUISupportQtWebkit-6.3.lib;vtkhdf5-6.3.lib;vtkhdf5_hl-6.3.lib;vtkImagingColor-6.3.lib;vtkImagingCore-6.3.lib;vtkImagingFourier-6.3.lib;vtkImagingGeneral-6.3.lib;vtkImagingHybrid-6.3.lib;vtkImagingMath-6.3.lib;vtkImagingMorphological-6.3.lib;vtkImagingSources-6.3.lib;vtkImagingStatistics-6.3.lib;vtkImagingStencil-6.3.lib;vtkInfovisCore-6.3.lib;vtkInfovisLayout-6.3.lib;vtkInteractionImage-6.3.lib;vtkInteractionStyle-6.3.lib;vtkInteractionWidgets-6.3.lib;vtkIOAMR-6.3.lib;vtkIOCore-6.3.lib;vtkIOEnSight-6.3.lib;vtkIOExodus-6.3.lib;vtkIOExport-6.3.lib;vtkIOGeometry-6.3.lib;vtkIOImage-6.3.lib;vtkIOImport-6.3.lib;vtkIOInfovis-6.3.lib;vtkIOLegacy-6.3.lib;vtkIOLSDyna-6.3.lib;vtkIOMINC-6.3.lib;vtkIOMovie-6.3.lib;vtkIONetCDF-6.3.lib;vtkIOParallel-6.3.lib;vtkIOParallelXML-6.3.lib;vtkIOPLY-6.3.lib;vtkIOSQL-6.3.lib;vtkIOVideo-6.3.lib;vtkIOXML-6.3.lib;vtkIOXMLParser-6.3.lib;vtkjpeg-6.3.lib;vtkjsoncpp-6.3.lib;vtklibxml2-6.3.lib;vtkLocalExample-6.3.lib;vtkmetaio-6.3.lib;vtkmyCommon.lib;vtkmyImaging.lib;vtkmyUnsorted.lib;vtkNetCDF-6.3.lib;vtkNetCDF_cxx-6.3.lib;vtkoggtheora-6.3.lib;vtkParallelCore-6.3.lib;vtkpng-6.3.lib;vtkproj4-6.3.lib;vtkRenderingAnnotation-6.3.lib;vtkRenderingContext2D-6.3.lib;vtkRenderingContextOpenGL-6.3.lib;vtkRenderingCore-6.3.lib;vtkRenderingFreeType-6.3.lib;vtkRenderingGL2PS-6.3.lib;vtkRenderingImage-6.3.lib;vtkRenderingLabel-6.3.lib;vtkRenderingLIC-6.3.lib;vtkRenderingLOD-6.3.lib;vtkRenderingOpenGL-6.3.lib;vtkRenderingQt-6.3.lib;vtkRenderingVolume-6.3.lib;vtkRenderingVolumeOpenGL-6.3.lib;vtksqlite-6.3.lib;vtksys-6.3.lib;vtkTestingGenericBridge-6.3.lib;vtkTestingIOSQL-6.3.lib;vtkTestingRendering-6.3.lib;vtktiff-6.3.lib;vtkverdict-6.3.lib;vtkViewsContext2D-6.3.lib;vtkViewsCore-6.3.lib;vtkViewsInfovis-6.3.lib;vtkViewsQt-6.3.lib;vtkzlib-6.3.lib;%(AdditionalDependencies)

4、现在运行编译:


等生成完毕后,找到INSTALL工程,右键INSTALL -》仅用于项目-》仅生成INSTALL。

直至结束,如果编译时选择了QT,则需要选择Release模式,

右键“QVTKWidgetPlugin”选择仅用于项目-》仅生成QVTKWidgetPlugin。等待完成。

完成后在D:\VTK\vtk-5.8.0-bin\bin\Debug中找到qvtkwidgetplugin .lib和qvtkwidgetplugin .dll,并将这两个文件拷贝到QT安装目录下(C:\Qt\4.8.6\plugins\designer)目录下。

0 0
原创粉丝点击