大家在做點雲的時候經常會用到QT,但是我們需要使用QT做點雲的可視化的時候又需要VTK,雖然我們在windows下安裝PCL的時候就已經安裝了VTK,由于跟着PCL安裝的VTK是沒有和QT聯合編譯的,是以在使用PCL和QT做點雲可視化界面的時候是無法使用可是QT的插件QVTKWidget,本文将主要講解一些PCL在Ubuntu系統和windows使用QT做界面的一些分享。

ubuntu 中使用QT和PCL
(1)如果是Ubuntu14.04,無論是使用指令行安裝PCL或者是QT,系統都已經将QVTKWidget的庫安裝好了,在使用QT時會自動的加載了QVTKWideget,并且使用我的例子正常cmake就可以實作QT與點雲的相關功能,有興趣的可以查閱我們公衆号的github位址,當然在PCL的官方的源碼中也是有一些基本的例子,以我的經驗來說,在ubuntu14.04上使用應該是沒有什麼問題。
(2)如果你安裝的是ubuntu16.04那麼就可能比較麻煩,因為在使用的時候發現PCL中的QT的依賴工程并沒有改變,并且ubuntu16.04會預設安裝qt5,這就導緻一些依賴項的沖突,甚至如果安裝了ROS包,也會出現一些問題,主要是PCL中的例子中都是依賴的QT4,而Ubuntu16.04的一些庫都是預設安裝QT5,是以會導緻你編譯不過,是以有問題的可以歡迎讨論。
我們知道在ubuntu系統下學習和使用PCL是十分友善的,并且安裝任何第三方庫都十分的便捷,這裡就不再過多的說明。

windows 中使用QT和PCL
在windows上使用PCL實作QT設計點雲的可視化界面,這就又涉及到了工程軟體的問題,我相信大多數人都是使用VS,是以我的電腦安裝了VS3013 和VS2015,這裡主要是使用VS2015 編譯實作點雲PCL的開發在VS下的GUI的開發。如果你真的需要使用在VS下的界面設計點雲的可視化的界面,那麼你可以安裝以下的步驟試試,但是不能保證一定可以編譯通過,但是即便你編譯不過,隻要你安裝了VS2015,并且你編譯的程式是X64 release那麼就可以直接使用我編譯好的VTK的庫,直接使用,友善又省心。并在最後我将做一個簡單的demo用于大家的測試。
安裝和編譯的步驟
首先下載下傳安裝PCL1.8windows的版本正常安裝,因為我們隻需要替換掉第三方庫的VTK的部分,其他部分的庫原封不動。
PCL1.8.1依賴的第三方庫是VTK8.0,是以我們下載下傳一個VTK的源碼,使用cmake進行編譯,接下來就是一步一步來,當然比可以跳過,直接去下載下傳我編譯好的QVTK的庫
首先我們需要安裝了Qt5.8,這個很簡單直接去Qt官網搜尋下載下傳下來,一路安裝完成即可,這裡沒什麼需要值得注意的地方,接下來就是要使用cmake編譯VTK。
(1)啟動CMake,指定源碼目錄和編譯目錄,點選Configure。
(2)VS 的版本一定是你安裝的版本指定,我選擇的是:Visual Studio 14 2015 Win64。點選finish就,等待配置完成。會自動進行第一次的cmake.
(3)在第一次configure之後需要更新一下設定,首先點選一下advanced,然後我們找到會找到以下幾個選項進行修改
該選擇為為VTK設定Qt的版本,這裡需要選擇你已經安裝好的qt 的位置,主要是qmake.exe和Qtcmake.config這兩個路徑指定成功即可
如果出現錯誤,就需要你正常設定,這裡其實主要就是QT的qmake以及qtcmake.config這兩個地方,如果提示DONXYGEN找不到,那麼就将build_decument整個選項去掉。總之就是要配置好QT的路徑就可以了,如果你不知道如何在win對VTK進行cmake的編譯,沒關系,如果你也使用了Qt5.8并且使用VS2013,PCL的版本是1.8.1版本,那麼就直接下載下傳我已經編譯好的VTK X64的庫既可以了。
在cmake之後我們就可以生成了對應的VS工程檔案
(5)Generate工程
配置成功後,出現Configure done提示。點選Generate生成工程。
(6)啟動VS2015開始編譯
出現Generating done提示表示VS2015工程已經生成成功。點選Open Project,VS2015會啟動,并打開工程。
即便你沒有編譯成功,也沒有關系,這裡我已經将編譯好的VTK打包https://download.csdn.net/download/u013019296/12093433(這裡的下載下傳積分不是我能決定的)
下載下傳對應的VTK即可,前提是你也要保證你使用的是VS2015,QT 5.8,PCL1.8.1,在下載下傳了我編譯好的依賴項之後,隻需要安裝包複制在我們安裝的PCL1.8.1的thirdtarty,後面的程式中設定好路徑一般都是沒問題
(7)将3rdParty\QVTK\plugins\designer下的QVTKWidgetPlugin.dll拷貝到QT\5.8\msvc2015_64\plugins\designer下,這樣Qt裡面就有了QVtk的控件了。這一步将會讓你在打開QT_creator的界面的時候會看見
這裡多了一個控件,整個時候就說明你已經安裝成功了,安裝成功要如果使用,也比較難以一次搞定。下面就是要設定VS的環境
以上就是将VTK的插件正确的放在了QT的第三方庫中,但是我們在使用配置環境的時候,總是會出現一些小問題,比如我們在上述的編譯的時候忘了設定為X64 release模式,等等
配置環境
如果一切準備工作都結束了,接下來我們為了測試一些我們建立一個工程,配置一下路徑,用來測試一下我們庫安裝是否有問題
(1)在VS2015中下載下傳VS2015_QT的插件,選擇“擴充與更新”
(2)選擇網絡搜尋輸入關鍵字“qt”下載下傳第一個安裝即可。
(3)下載下傳完成後重新開機VS2015,你會發現”Qt VS Tool“這個選項,設定qmake所在路徑,在“QT option”中設定好qmake所在路徑即可
(4)此時我們就已經将所有的準備工作完成,可以建立一個QT的項目。此時比較頭疼的就是設定各種路徑的問題了:這裡因為每個人的安裝路徑不一樣,但是如果你熟練的使用VS,就知道VS中的環境設定其實就隻有三個主要的關鍵地方 include lib所在的路徑以及我們需要使用的lib清單,這裡給出了我建立工程的設定檔案的截圖,希望對你有所啟發。
lib路徑的清單:
最後是我們要輸入lib的清單,整個lib 因為我也不知道暫時會使用到哪一個,是以一般我是将所有的lib都作為輸入
qtmain.lib
Qt5Core.lib
Qt5Gui.lib
Qt5Widgets.lib
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
flann_cpp_s.lib
flann_s.lib
flann.lib
libboost_atomic-vc140-mt-1_64.lib
libboost_chrono-vc140-mt-1_64.lib
libboost_container-vc140-mt-1_64.lib
libboost_context-vc140-mt-1_64.lib
libboost_coroutine-vc140-mt-1_64.lib
libboost_date_time-vc140-mt-1_64.lib
libboost_exception-vc140-mt-1_64.lib
libboost_filesystem-vc140-mt-1_64.lib
libboost_graph-vc140-mt-1_64.lib
libboost_iostreams-vc140-mt-1_64.lib
libboost_locale-vc140-mt-1_64.lib
libboost_log-vc140-mt-1_64.lib
libboost_log_setup-vc140-mt-1_64.lib
libboost_math_c99-vc140-mt-1_64.lib
libboost_math_c99f-vc140-mt-1_64.lib
libboost_math_c99l-vc140-mt-1_64.lib
libboost_math_tr1-vc140-mt-1_64.lib
libboost_math_tr1f-vc140-mt-1_64.lib
libboost_math_tr1l-vc140-mt-1_64.lib
libboost_mpi-vc140-mt-1_64.lib
libboost_prg_exec_monitor-vc140-mt-1_64.lib
libboost_program_options-vc140-mt-1_64.lib
libboost_random-vc140-mt-1_64.lib
libboost_regex-vc140-mt-1_64.lib
libboost_serialization-vc140-mt-1_64.lib
libboost_signals-vc140-mt-1_64.lib
libboost_system-vc140-mt-1_64.lib
libboost_test_exec_monitor-vc140-mt-1_64.lib
libboost_thread-vc140-mt-1_64.lib
libboost_timer-vc140-mt-1_64.lib
libboost_unit_test_framework-vc140-mt-1_64.lib
libboost_wave-vc140-mt-1_64.lib
libboost_wserialization-vc140-mt-1_64.lib
qhullstatic.lib
qhull.lib
qhull_p.lib
qhull_r.lib
qhullcpp.lib
qhullstatic_r.lib
libEGL.lib
QVTKWidgetPlugin.lib
QVTKWidgetPlugin.lib
vtkInteractionWidgets-8.0.lib
vtkalglib-8.0.lib
vtkIOAMR-8.0.lib
vtkChartsCore-8.0.lib
vtkIOCore-8.0.lib
vtkCommonColor-8.0.lib
vtkIOEnSight-8.0.lib
vtkCommonComputationalGeometry-8.0.lib
vtkIOExodus-8.0.lib
vtkCommonCore-8.0.lib
vtkIOExport-8.0.lib
vtkCommonDataModel-8.0.lib
vtkIOExportOpenGL2-8.0.lib
vtkCommonExecutionModel-8.0.lib
vtkIOGeometry-8.0.lib
vtkCommonMath-8.0.lib
vtkIOImage-8.0.lib
vtkCommonMisc-8.0.lib
vtkIOImport-8.0.lib
vtkCommonSystem-8.0.lib
vtkIOInfovis-8.0.lib
vtkCommonTransforms-8.0.lib
vtkIOLegacy-8.0.lib
vtkDICOMParser-8.0.lib
vtkIOLSDyna-8.0.lib
vtkDomainsChemistry-8.0.lib
vtkIOMINC-8.0.lib
vtkDomainsChemistryOpenGL2-8.0.lib
vtkIOMovie-8.0.lib
vtkexoIIc-8.0.lib
vtkIONetCDF-8.0.lib
vtkexpat-8.0.lib
vtkIOParallel-8.0.lib
vtkFiltersAMR-8.0.lib
vtkIOParallelXML-8.0.lib
vtkFiltersCore-8.0.lib
vtkIOPLY-8.0.lib
vtkFiltersExtraction-8.0.lib
vtkIOSQL-8.0.lib
vtkFiltersFlowPaths-8.0.lib
vtkIOTecplotTable-8.0.lib
vtkFiltersGeneral-8.0.lib
vtkIOVideo-8.0.lib
vtkFiltersGeneric-8.0.lib
vtkIOXML-8.0.lib
vtkFiltersGeometry-8.0.lib
vtkIOXMLParser-8.0.lib
vtkFiltersHybrid-8.0.lib
vtkjpeg-8.0.lib
vtkFiltersHyperTree-8.0.lib
vtkjsoncpp-8.0.lib
vtkFiltersImaging-8.0.lib
vtklibharu-8.0.lib
vtkFiltersModeling-8.0.lib
vtklibxml2-8.0.lib
vtkFiltersParallel-8.0.lib
vtklz4-8.0.lib
vtkFiltersParallelImaging-8.0.lib
vtkmetaio-8.0.lib
vtkFiltersPoints-8.0.lib
vtknetcdf_c++.lib
vtkFiltersProgrammable-8.0.lib
vtkNetCDF-8.0.lib
vtkFiltersSelection-8.0.lib
vtkoggtheora-8.0.lib
vtkFiltersSMP-8.0.lib
vtkParallelCore-8.0.lib
vtkFiltersSources-8.0.lib
vtkpng-8.0.lib
vtkFiltersStatistics-8.0.lib
vtkproj4-8.0.lib
vtkFiltersTexture-8.0.lib
vtkRenderingAnnotation-8.0.lib
vtkFiltersTopology-8.0.lib
vtkRenderingContext2D-8.0.lib
vtkFiltersVerdict-8.0.lib
vtkRenderingContextOpenGL2-8.0.lib
vtkfreetype-8.0.lib
vtkRenderingCore-8.0.lib
vtkGeovisCore-8.0.lib
vtkRenderingFreeType-8.0.lib
vtkgl2ps-8.0.lib
vtkRenderingGL2PSOpenGL2-8.0.lib
vtkglew-8.0.lib
vtkRenderingImage-8.0.lib
vtkGUISupportQt-8.0.lib
vtkRenderingLabel-8.0.lib
vtkGUISupportQtSQL-8.0.lib
vtkRenderingLOD-8.0.lib
vtkhdf5_hl-8.0.lib
vtkRenderingOpenGL2-8.0.lib
vtkhdf5-8.0.lib
vtkRenderingQt-8.0.lib
vtkImagingColor-8.0.lib
vtkRenderingVolume-8.0.lib
vtkImagingCore-8.0.lib
vtkRenderingVolumeOpenGL2-8.0.lib
vtkImagingFourier-8.0.lib
vtksqlite-8.0.lib
vtkImagingGeneral-8.0.lib
vtksys-8.0.lib
vtkImagingHybrid-8.0.lib
vtkTestingGenericBridge-8.0.lib
vtkImagingMath-8.0.lib
vtkTestingIOSQL-8.0.lib
vtkImagingMorphological-8.0.lib
vtkTestingRendering-8.0.lib
vtkImagingSources-8.0.lib
vtktiff-8.0.lib
vtkImagingStatistics-8.0.lib
vtkverdict-8.0.lib
vtkImagingStencil-8.0.lib
vtkViewsContext2D-8.0.lib
vtkInfovisCore-8.0.lib
vtkViewsCore-8.0.lib
vtkInfovisLayout-8.0.lib
vtkViewsInfovis-8.0.lib
vtkInteractionImage-8.0.lib
vtkViewsQt-8.0.lib
vtkInteractionStyle-8.0.lib
vtkzlib-8.0.lib
複制
這裡比較多,就沒有都列舉出來
這裡我們先試用一個VTK的程式測試一下我們的環境是否正常的配置成功。
#include <vtkVersion.h>
#include <vtkPlaneSource.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
int main(int, char *[])
{
// Create a plane
vtkSmartPointer<vtkPlaneSource> planeSource =
vtkSmartPointer<vtkPlaneSource>::New();
planeSource->SetCenter(1.0, 0.0, 0.0);
planeSource->SetNormal(1.0, 0.0, 1.0);
planeSource->Update();
vtkPolyData* plane = planeSource->GetOutput();
// Create a mapper and actor
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
#if VTK_MAJOR_VERSION <= 5
mapper->SetInput(plane);
#else
mapper->SetInputData(plane);
#endif
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
// Create a renderer, render window and interactor
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
// Add the actors to the scene
renderer->AddActor(actor);
renderer->SetBackground(.1, .2, .3); // Background color dark blue
// Render and interact
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}
複制
一般是是沒有問題的,有問題的那麼就是在啟動VTK的界面的時候,提示你初始化錯誤。
這個問題在之前的部落格中是有記錄過的,隻需要添加
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
編譯成功後,在VTK中可視化了一個平面。
win 下PCL聯合QT點雲GUI開發
建立的VS工程中,我們打開.ui進行界面編輯,注意其實QT的使用,你可以直接使用代碼進行排版,你也可以在界面的地方将你的控件排版好,然後儲存,這個時候QT會幫你生成對應的代碼,比如我再找個ui的界面上,放了兩個按鈕,一個QVTKWideget可視化的插件,一個文本浏覽器,需要實作的工程是:
第一個按鈕實作了打開一個PCD檔案可視化在右邊的插件上,并且點雲是可以可以使用滑鼠自由的拖動的。
第二個按鈕實作了生成一個5000個點的正方體點雲,并且每次點選都會改變點雲顔色。
QVTKWideget需要你設定一下顯示的位置,和在界面中的位置。
文本浏覽器主要是說明一下程式的基本用途。如下圖設計
具體的每一個控件的命名我就不在一一說明了,在我們布局排版之後,我們可以點選儲存去實作每一個按鈕的功能即可,這裡由于篇幅有限,就不再貼出實作的代碼。簡單截圖如下:
有興趣的小夥伴可以下載下傳一下程式在自己的電腦上運作,下載下傳位址 :
https://download.csdn.net/download/u013019296/12115883
這種使用QT的GUI布局有一些局限性,就是當我們放大和縮小的時候會導緻界面不夠美觀,是以很多人會選擇使用代碼來排版,但是代碼排版就會讓你的代碼量比較多。我們嘗試打開程式 如下圖:
說明:
這是一個由“點雲PCL”公衆号釋出的一個關于使用VS2015聯合QT設計的一個點雲可視化界面的程式,已經完成了封裝的釋出的一個exe,可以在win7上直接點選exe打開界面,實作了兩個按鈕,一個是打開一個PCD檔案并且可視化,如右圖上,一個按鈕實作了生成一個正方體的點雲,并且每一次按鈕就會改變點雲的顔色。