PCL 1.8.0編譯、配置、VS2013
引言
pcl1.8.0,較pcl1.7和1.6多了不少演算法,很多感興趣的方法都在pcl1.8中有所實現。當pcl11.8.0rc1和rc2釋出時就迫不及待的下載下來進行使用,用了幾個月發現pcl1.8.0rc版有幾個bug無法解決,如:表面重建時無法對映紋理。得知2016/06/14 github 釋出正式版pcl1.8.0時,就立馬下載下來準備編譯並記錄整個過程,感興趣的小夥伴可以參考。
pcl官網已經有windows平臺下的編譯過程,現在我基於此教程編譯PCL1.8.0並配置。
PCL1.8.0原始碼包下載
準備工具
編譯器VS2013,CMakeGUI 3.3.2,系統版本win7 64位。
提示:軟體版本根據自己情況選擇,沒必要非要和部落格中一致。
第三方依賴庫
第三方庫 | 用途 | 是否必須 |
---|---|---|
Boost | 用於智慧指標等操作 | 必選 |
Eigen | 用於矩陣運算等 | 必選 |
FLANN | 用於鄰域搜尋等 | 必選 |
VTK | 視覺化庫,用於顯示點雲等 | 必選 |
Qt | 用於影象互動介面等 | 可選 |
QHULL | used for convex/concave hull decompositions in surface | 可選 |
OpenNI | 用於獲取點雲等 | 可選 |
提示:在編譯PCL1.8.0時請確保您已安裝了正確的第三方依賴庫。不能混合32位和64位程式碼,並且不能混用不同編譯器編譯第三方庫。有些庫需要自己編譯,這篇部落格裡就不對如何編譯第三方依賴庫進行講解了,只詳述PCL1.8.0的編譯過程。
編譯PCL1.8.0
官方編譯教程:http://www.pointclouds.org/documentation/tutorials/compiling_pcl_windows.php
提示:跟著官方教程操作即可成功。
(1) 將原始碼包pcl-pcl-1.8.0.zip解壓到目錄:F:\pcl-1.8.0
提示:根據自己需要解壓即可,本部落格一定程度上參考了官方教程。
(2)開啟CMakeGUI
原始碼路徑:F:/pcl-1.8.0
專案路徑:F:/pcl-1.8.0/build
如圖:
點選configure,選擇合適的編譯器(VS2013 64位)
(3)出現無法找到Eigen庫
將變數EIGEN_INCLUDE_DIR對應的值修改為Eigen庫所在目錄。
如:F:\Eigen\eigen3
重新configure
提示找不到Boost庫,新增下面三個變數和相應的路徑,重新configure。
BOOST_ROOT="F:\Boost"
Boost_LIBRARY_DIRS="F:\Boost\lib"
BOOST_INCLUDEDIR="F:\Boost\include\boost-1_59"
(4)修改安裝路徑
或者,開啟CPackConfig.cmake檔案,修改CPACK_INSTALL_PREFIX值為F:\PCL1.8.0
點Generate生成VS工程。
(5)開啟PCL.sln
分別批生成Debug和Release版本,並分別安裝。
(6)Debug和Release版編譯、安裝成功
Debug
Release
(7)提示
Cmake構建工程時可能會出現其他依賴庫缺失情況,一一補上就行。使用Cmake構建工程成功,也可能在VS中編譯時會出現其他問題,根據提示也可以一一解決。整個編譯過程很耗時,Debug和Release完全編譯一次要一個小時左右。如果需要All in One安裝包,在Cmake中勾選生成All in One包即可(特別費時所以就沒勾選)。
配置
將下列路徑加入環境變數:
F:\PCL1.8.0C\bin;F:\PCL1.8.0C\3rdParty\FLANN\bin;F:\PCL1.8.0C\3rdParty\OpenNI2\Tools;F:\PCL1.8.0C\3rdParty\Qhull\bin;F:\PCL1.8.0C\3rdParty\VTK\bin;
測試Debug版
(1)開啟VS2013新建專案,新增如下程式碼
#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>);
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;
}
(2)新建屬性表PCLCDebug
VC++目錄,新增包含目錄
VC++目錄,新增庫目錄
聯結器,輸入,附加依賴項
提示:我是把所有的Debug依賴庫都加上,因為用的多,懶得去挑。
(2)最終結果