Qt 5.9使用VTK顯示點雲


注意:

1.以下第一部分PCL安裝使用教程可供參考,第二部分在VS中使用Qt親測有效;第三第四部分有問題,希望通過這個教程了解如何使用Qt可視化點雲的可能要失望了,如果你實現了還請不吝賜教。

2.目前我自己對於既使用Qt設計界面又能使用PCL庫的做法是在VS中使用PCL庫和Qt庫,如果想可視化點雲可能需要自己定義可視化類和控件了,最后我做到的話再補個教程。

3.基於VS中使用Qt庫和PCL庫生成的文件想要發布也跟一般的Qt程序相似,使用Qt自帶的Qt命令行在exe文件目錄下執行windeployqt *.exe命令即可配置好所需dll;也可以自己運行exe看缺什么dll並找到復制到當前文件夾下也一樣。如果想進一步做成安裝包,可使用setupfactory打包你的exe生成安裝包,這個以后我熟悉了也加個教程。

1.PCL安裝及在VS2013中使用PCL

  (1)下載PCL,下載地址鏈接:https://pan.baidu.com/s/123QD1iKa5tfLPTwquP3j7Q 密碼:v5q6。點擊PCL-1.8.0-AllInOne-msvc2015-win32.exe安裝即可。

 

  (2)環境變量的配置。添加環境變量名稱為:

  PCL_ROOT,路徑設為PCL的安裝根目錄。

  path環境變量添加 %PCL_ROOT%\bin;%PCL_ROOT%\3rdParty\FLANN\bin;%PCL_ROOT%\3rdParty\Qhull\bin;%PCL_ROOT%\3rdParty\VTK\bin;%PCL_ROOT%\3rdParty\OpenNI2\Tools。

 

  (3)項目屬性配置。原本可以在項目-屬性中設置屬性,但是每一次都要設置未免太麻煩,所以這里打開安裝包附帶的PCLdebug.props和PCLrelease.props文件直接導入設置(如果沒有的話新建項目屬性表也可),打開方法為打開屬性管理器,右鍵對應的解決方案平台添加現有屬性表,然后Debug|Win32添加PCLdebug.props,Release|Win32添加PCLrelease.props即可。如下

                     

  這里添加的屬性表並沒有進行設置,所以其實自己新建屬性表也是一樣的,之后我們要雙擊添加的debug,release屬性表分別進行設置最后進行保存即可在下一次直接添加這個屬性表就可以,不必多次設置。雙擊屬性表后在屬性設置中點擊配置屬性-VC++目錄,在包含目錄與庫目錄中分別添加如下目錄,

  

  在屬性表-鏈接器-輸入中的附加依賴項添加如下依賴項,如果為其他版本的只需把對應文件夾里的lib文件添加到依賴項即可,為快速導出這些lib文件名,可使用批處理命令導出,參考https://www.cnblogs.com/blog-vincent-0x1F7/p/9646358.html

//debug模式下添加的附加依賴項:

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_ml_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_stereo_debug.lib
pcl_surface_debug.lib
pcl_tracking_debug.lib
pcl_visualization_debug.lib
libboost_atomic-vc120-mt-gd-1_59.lib
libboost_chrono-vc120-mt-gd-1_59.lib
libboost_container-vc120-mt-gd-1_59.lib
libboost_context-vc120-mt-gd-1_59.lib
libboost_coroutine-vc120-mt-gd-1_59.lib
libboost_date_time-vc120-mt-gd-1_59.lib
libboost_exception-vc120-mt-gd-1_59.lib
libboost_filesystem-vc120-mt-gd-1_59.lib
libboost_graph-vc120-mt-gd-1_59.lib
libboost_iostreams-vc120-mt-gd-1_59.lib
libboost_locale-vc120-mt-gd-1_59.lib
libboost_log-vc120-mt-gd-1_59.lib
libboost_log_setup-vc120-mt-gd-1_59.lib
libboost_math_c99-vc120-mt-gd-1_59.lib
libboost_math_c99f-vc120-mt-gd-1_59.lib
libboost_math_c99l-vc120-mt-gd-1_59.lib
libboost_math_tr1-vc120-mt-gd-1_59.lib
libboost_math_tr1f-vc120-mt-gd-1_59.lib
libboost_math_tr1l-vc120-mt-gd-1_59.lib
libboost_mpi-vc120-mt-gd-1_59.lib
libboost_prg_exec_monitor-vc120-mt-gd-1_59.lib
libboost_program_options-vc120-mt-gd-1_59.lib
libboost_random-vc120-mt-gd-1_59.lib
libboost_regex-vc120-mt-gd-1_59.lib
libboost_serialization-vc120-mt-gd-1_59.lib
libboost_signals-vc120-mt-gd-1_59.lib
libboost_system-vc120-mt-gd-1_59.lib
libboost_test_exec_monitor-vc120-mt-gd-1_59.lib
libboost_thread-vc120-mt-gd-1_59.lib
libboost_timer-vc120-mt-gd-1_59.lib
libboost_unit_test_framework-vc120-mt-gd-1_59.lib
libboost_wave-vc120-mt-gd-1_59.lib
libboost_wserialization-vc120-mt-gd-1_59.lib
vtkalglib-7.0-gd.lib
vtkChartsCore-7.0-gd.lib
vtkCommonCore-7.0-gd.lib
vtkCommonColor-7.0-gd.lib
vtkCommonComputationalGeometry-7.0-gd.lib
vtkCommonDataModel-7.0-gd.lib
vtkCommonExecutionModel-7.0-gd.lib
vtkCommonMath-7.0-gd.lib
vtkCommonMisc-7.0-gd.lib
vtkCommonSystem-7.0-gd.lib
vtkCommonTransforms-7.0-gd.lib
vtkDICOMParser-7.0-gd.lib
vtkDomainsChemistry-7.0-gd.lib
vtkexoIIc-7.0-gd.lib
vtkexpat-7.0-gd.lib
vtkFiltersAMR-7.0-gd.lib
vtkFiltersCore-7.0-gd.lib
vtkFiltersExtraction-7.0-gd.lib
vtkFiltersFlowPaths-7.0-gd.lib
vtkFiltersGeneral-7.0-gd.lib
vtkFiltersGeneric-7.0-gd.lib
vtkFiltersGeometry-7.0-gd.lib
vtkFiltersHybrid-7.0-gd.lib
vtkFiltersHyperTree-7.0-gd.lib
vtkFiltersImaging-7.0-gd.lib
vtkFiltersModeling-7.0-gd.lib
vtkFiltersParallel-7.0-gd.lib
vtkFiltersParallelImaging-7.0-gd.lib
vtkFiltersProgrammable-7.0-gd.lib
vtkFiltersSelection-7.0-gd.lib
vtkFiltersSMP-7.0-gd.lib
vtkFiltersSources-7.0-gd.lib
vtkFiltersStatistics-7.0-gd.lib
vtkFiltersTexture-7.0-gd.lib
vtkFiltersVerdict-7.0-gd.lib
vtkfreetype-7.0-gd.lib
vtkGeovisCore-7.0-gd.lib
vtkhdf5-7.0-gd.lib
vtkhdf5_hl-7.0-gd.lib
vtkImagingColor-7.0-gd.lib
vtkImagingCore-7.0-gd.lib
vtkImagingFourier-7.0-gd.lib
vtkImagingGeneral-7.0-gd.lib
vtkImagingHybrid-7.0-gd.lib
vtkImagingMath-7.0-gd.lib
vtkImagingMorphological-7.0-gd.lib
vtkImagingSources-7.0-gd.lib
vtkImagingStatistics-7.0-gd.lib
vtkImagingStencil-7.0-gd.lib
vtkInfovisCore-7.0-gd.lib
vtkInfovisLayout-7.0-gd.lib
vtkInteractionImage-7.0-gd.lib
vtkInteractionStyle-7.0-gd.lib
vtkInteractionWidgets-7.0-gd.lib
vtkIOAMR-7.0-gd.lib
vtkIOCore-7.0-gd.lib
vtkIOEnSight-7.0-gd.lib
vtkIOExodus-7.0-gd.lib
vtkIOExport-7.0-gd.lib
vtkIOGeometry-7.0-gd.lib
vtkIOImage-7.0-gd.lib
vtkIOImport-7.0-gd.lib
vtkIOInfovis-7.0-gd.lib
vtkIOLegacy-7.0-gd.lib
vtkIOLSDyna-7.0-gd.lib
vtkIOMINC-7.0-gd.lib
vtkIOMovie-7.0-gd.lib
vtkIONetCDF-7.0-gd.lib
vtkIOParallel-7.0-gd.lib
vtkIOParallelXML-7.0-gd.lib
vtkIOPLY-7.0-gd.lib
vtkIOSQL-7.0-gd.lib
vtkIOVideo-7.0-gd.lib
vtkIOXML-7.0-gd.lib
vtkIOXMLParser-7.0-gd.lib
vtkjpeg-7.0-gd.lib
vtkjsoncpp-7.0-gd.lib
vtklibxml2-7.0-gd.lib
vtkmetaio-7.0-gd.lib
vtkNetCDF-7.0-gd.lib
vtkNetCDF_cxx-7.0-gd.lib
vtkoggtheora-7.0-gd.lib
vtkParallelCore-7.0-gd.lib
vtkpng-7.0-gd.lib
vtkproj4-7.0-gd.lib
vtkRenderingAnnotation-7.0-gd.lib
vtkRenderingContext2D-7.0-gd.lib
vtkRenderingContextOpenGL2-7.0-gd.lib
vtkRenderingCore-7.0-gd.lib
vtkRenderingFreeType-7.0-gd.lib
vtkRenderingImage-7.0-gd.lib
vtkRenderingLabel-7.0-gd.lib
vtkRenderingLOD-7.0-gd.lib
vtkRenderingOpenGL2-7.0-gd.lib
vtkRenderingVolume-7.0-gd.lib
vtkRenderingVolumeOpenGL2-7.0-gd.lib
vtksqlite-7.0-gd.lib
vtksys-7.0-gd.lib
vtktiff-7.0-gd.lib
vtkverdict-7.0-gd.lib
vtkViewsContext2D-7.0-gd.lib
vtkViewsCore-7.0-gd.lib
vtkViewsInfovis-7.0-gd.lib
vtkzlib-7.0-gd.lib
vtkGUISupportQt-7.0-gd.lib
vtkRenderingQt-7.0-gd.lib
vtkViewsQt-7.0-gd.lib
flann_cpp_s-gd.lib
qhullstatic-gd.lib
OpenNI2.lib

//release模式下添加的附加依賴項:

pcl_common_release.lib
pcl_features_release.lib
pcl_filters_release.lib
pcl_io_release.lib
pcl_io_ply_release.lib
pcl_kdtree_release.lib
pcl_keypoints_release.lib
pcl_ml_release.lib
pcl_octree_release.lib
pcl_outofcore_release.lib
pcl_people_release.lib
pcl_recognition_release.lib
pcl_registration_release.lib
pcl_sample_consensus_release.lib
pcl_search_release.lib
pcl_segmentation_release.lib
pcl_stereo_release.lib
pcl_surface_release.lib
pcl_tracking_release.lib
pcl_visualization_release.lib
libboost_atomic-vc120-mt-1_59.lib
libboost_chrono-vc120-mt-1_59.lib
libboost_container-vc120-mt-1_59.lib
libboost_context-vc120-mt-1_59.lib
libboost_coroutine-vc120-mt-1_59.lib
libboost_date_time-vc120-mt-1_59.lib
libboost_exception-vc120-mt-1_59.lib
libboost_filesystem-vc120-mt-1_59.lib
libboost_graph-vc120-mt-1_59.lib
libboost_iostreams-vc120-mt-1_59.lib
libboost_locale-vc120-mt-1_59.lib
libboost_log-vc120-mt-1_59.lib
libboost_log_setup-vc120-mt-1_59.lib
libboost_math_c99-vc120-mt-1_59.lib
libboost_math_c99f-vc120-mt-1_59.lib
libboost_math_c99l-vc120-mt-1_59.lib
libboost_math_tr1-vc120-mt-1_59.lib
libboost_math_tr1f-vc120-mt-1_59.lib
libboost_math_tr1l-vc120-mt-1_59.lib
libboost_mpi-vc120-mt-1_59.lib
libboost_prg_exec_monitor-vc120-mt-1_59.lib
libboost_program_options-vc120-mt-1_59.lib
libboost_random-vc120-mt-1_59.lib
libboost_regex-vc120-mt-1_59.lib
libboost_serialization-vc120-mt-1_59.lib
libboost_signals-vc120-mt-1_59.lib
libboost_system-vc120-mt-1_59.lib
libboost_test_exec_monitor-vc120-mt-1_59.lib
libboost_thread-vc120-mt-1_59.lib
libboost_timer-vc120-mt-1_59.lib
libboost_unit_test_framework-vc120-mt-1_59.lib
libboost_wave-vc120-mt-1_59.lib
libboost_wserialization-vc120-mt-1_59.lib
vtkalglib-7.0.lib
vtkChartsCore-7.0.lib
vtkCommonCore-7.0.lib
vtkCommonColor-7.0.lib
vtkCommonComputationalGeometry-7.0.lib
vtkCommonDataModel-7.0.lib
vtkCommonExecutionModel-7.0.lib
vtkCommonMath-7.0.lib
vtkCommonMisc-7.0.lib
vtkCommonSystem-7.0.lib
vtkCommonTransforms-7.0.lib
vtkDICOMParser-7.0.lib
vtkDomainsChemistry-7.0.lib
vtkexoIIc-7.0.lib
vtkexpat-7.0.lib
vtkFiltersAMR-7.0.lib
vtkFiltersCore-7.0.lib
vtkFiltersExtraction-7.0.lib
vtkFiltersFlowPaths-7.0.lib
vtkFiltersGeneral-7.0.lib
vtkFiltersGeneric-7.0.lib
vtkFiltersGeometry-7.0.lib
vtkFiltersHybrid-7.0.lib
vtkFiltersHyperTree-7.0.lib
vtkFiltersImaging-7.0.lib
vtkFiltersModeling-7.0.lib
vtkFiltersParallel-7.0.lib
vtkFiltersParallelImaging-7.0.lib
vtkFiltersProgrammable-7.0.lib
vtkFiltersSelection-7.0.lib
vtkFiltersSMP-7.0.lib
vtkFiltersSources-7.0.lib
vtkFiltersStatistics-7.0.lib
vtkFiltersTexture-7.0.lib
vtkFiltersVerdict-7.0.lib
vtkfreetype-7.0.lib
vtkGeovisCore-7.0.lib
vtkhdf5-7.0.lib
vtkhdf5_hl-7.0.lib
vtkImagingColor-7.0.lib
vtkImagingCore-7.0.lib
vtkImagingFourier-7.0.lib
vtkImagingGeneral-7.0.lib
vtkImagingHybrid-7.0.lib
vtkImagingMath-7.0.lib
vtkImagingMorphological-7.0.lib
vtkImagingSources-7.0.lib
vtkImagingStatistics-7.0.lib
vtkImagingStencil-7.0.lib
vtkInfovisCore-7.0.lib
vtkInfovisLayout-7.0.lib
vtkInteractionImage-7.0.lib
vtkInteractionStyle-7.0.lib
vtkInteractionWidgets-7.0.lib
vtkIOAMR-7.0.lib
vtkIOCore-7.0.lib
vtkIOEnSight-7.0.lib
vtkIOExodus-7.0.lib
vtkIOExport-7.0.lib
vtkIOGeometry-7.0.lib
vtkIOImage-7.0.lib
vtkIOImport-7.0.lib
vtkIOInfovis-7.0.lib
vtkIOLegacy-7.0.lib
vtkIOLSDyna-7.0.lib
vtkIOMINC-7.0.lib
vtkIOMovie-7.0.lib
vtkIONetCDF-7.0.lib
vtkIOParallel-7.0.lib
vtkIOParallelXML-7.0.lib
vtkIOPLY-7.0.lib
vtkIOSQL-7.0.lib
vtkIOVideo-7.0.lib
vtkIOXML-7.0.lib
vtkIOXMLParser-7.0.lib
vtkjpeg-7.0.lib
vtkjsoncpp-7.0.lib
vtklibxml2-7.0.lib
vtkmetaio-7.0.lib
vtkNetCDF-7.0.lib
vtkNetCDF_cxx-7.0.lib
vtkoggtheora-7.0.lib
vtkParallelCore-7.0.lib
vtkpng-7.0.lib
vtkproj4-7.0.lib
vtkRenderingAnnotation-7.0.lib
vtkRenderingContext2D-7.0.lib
vtkRenderingContextOpenGL2-7.0.lib
vtkRenderingCore-7.0.lib
vtkRenderingFreeType-7.0.lib
vtkRenderingImage-7.0.lib
vtkRenderingLabel-7.0.lib
vtkRenderingLOD-7.0.lib
vtkRenderingOpenGL2-7.0.lib
vtkRenderingVolume-7.0.lib
vtkRenderingVolumeOpenGL2-7.0.lib
vtksqlite-7.0.lib
vtksys-7.0.lib
vtktiff-7.0.lib
vtkverdict-7.0.lib
vtkViewsContext2D-7.0.lib
vtkViewsCore-7.0.lib
vtkViewsInfovis-7.0.lib
vtkzlib-7.0.lib
vtkGUISupportQt-7.0.lib
vtkRenderingQt-7.0.lib
vtkViewsQt-7.0.lib
flann_cpp_s.lib
qhullstatic.lib
OpenNI2.lib

  編寫測試代碼,新建一個c++的win32控制台程序,更改代碼如下:

#include "stdafx.h"
#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 _tmain(int argc, _TCHAR* argv[])
{
    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>);
    pcl::io::loadPCDFile("example.pcd的位置", *cloud);

    pcl::visualization::CloudViewer viewer("Cloud Viewer");

    //blocks until the cloud is actually rendered
    viewer.showCloud(cloud);

    //use the following functions to get access to the underlying more advanced/powerful
    //PCLVisualizer

    //This will only get called once
    viewer.runOnVisualizationThreadOnce(viewerOneOff);

    //This will get called once per visualization iteration
    viewer.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;
}

  這時候運行一個測試程序很有可能會拋出error c4996錯誤,只需在項目-屬性-C/C++-預處理器-預處理器定義中添加_SCL_SECURE_NO_WARNINGS就可以。

 

  完成以上設置后別忘了保存屬性表,右擊屬性表保存即可。經過以上步驟,運氣好的話,PCL庫就可以用了,運氣不好只能出啥問題找度娘了。

 

 

2.Vs2013與Qt協同

  在工具-拓展和更新-聯機中搜索Qt可以找到Qt visual studio Tools,點擊下載,然后安裝即可。

 

  安裝完畢之后在界面菜單欄上會多一個Qt VS Tools菜單,點擊Qt Options在Qt version中添加一項名稱隨意,路徑設為Qt的安裝目錄下相應目錄,即指定了Qt版本,這時候可以使用Qt了。

  

  測試一下,現在在文件-新建-項目向導中已經有Qt的內容,可以選擇Qt GUI Application,就可以開發帶有GUI界面的Qt程序。

  

 

  現在可以在VS中寫代碼,雙擊.ui文件可打開Qt Designer設計界面。

 

 

 

3.編譯vtk

  參考https://blog.csdn.net/jepco1/article/details/80628026。原地址講解會更詳細。

  使用CMAKE配置VTK for Qt的編譯環境,cmake版本為3.11.3,下載地址為https://cmake.org/download/。VTK使用版本為8.1.1,下載地址為https://www.vtk.org/download/

  下載VTK-8.1.1.zip和VTKData-8.1.1.zip於同一目錄,解壓到當前目錄,二者會合並成一個文件夾,即編譯源碼所在目錄。

 

  打開cmake,選擇源碼目錄和構建目錄(構建目錄自己建一個),點擊configure。

 

  選擇visual studio 12 2013 win 32(對應版本的編譯器,不然在Qt中沒法使用)。

  選擇BUILD_EXAMPLES,BUUILD_SHARED_LIBS,BUILD_TESTING。

 

  CMAKE_INSTALL_PREFIX選擇VTK的安裝目錄。

 

  選擇VTK_Group_Qt。點擊configure。

 

  這里一般都會自動設置好。Qt5_DIR選擇路徑為F:/Qt/5.9.4/msvc2015_64/lib/cmake/Qt5。點擊configure,configure done后點擊generate。

 

 

 

  Generate done后點擊Open Project即可在VS2015中打開項目。選擇ALL_BUILD右鍵生成,生成完畢后改為release再生成一次release版本。這個過程會比較長。

 

  至此編譯完成,將build/bin/release下的QVTKWidget.dll復制到Qt安裝目錄的plugins/designer下,這樣打開Qt Designer就可以看到工具箱里有QVTKWidget控件了(在Qt Creator中是看不到的,在Qt Creator中使用QVTKWidget可以使用Widget代替,然后提升為QVTKWidget)。

 

4.在vs2013下使用vtk,Qt顯示點雲

  目前無法使用QVTKWidget,在VS2015中可以使用Qt Designer拖動QVTKWidget設計界面,但是運行時會出現錯誤,debug模式下調試出現error LNK2019: 無法解析的外部符號錯誤,看起來貌似是加載dll文件時無法識別QVTKWidget中的函數;release模式下則報錯fatal error C1083: 無法打開包括文件: “QVTKWidget.h,看起來是不能找到頭文件,即使是在項目屬性的VC++目錄的包含目錄中添加相應包含目錄也不成,添加包含目錄后debug與release模式下均顯示error LNK2019。

 

 

  

  而Qt下也不可使用QVTKWidget,Qt Creator中工具箱中沒有QVTKWidget,雖可通過提升的方式使用QVTKWidget,但是運行的時候同樣遇到問題。debug與release模式下都出現LNK 2019無法解析的外部符號問題,看起來貌似與visual studio中的報錯是一樣的。

  

  目前尚不知為何,有待進一步解決。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM