1. 程式人生 > >PCL 1.8.0編譯、配置、VS2013

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)最終結果
這裡寫圖片描述

編譯和配置結束