PCL1.8.1+vs2015配置教程
- 2019 年 10 月 4 日
- 筆記
一、下載PCL安裝包
下載路徑:http://unanancyowen.com/en/pcl181 (這個並不是官網,官網是這個:http://pointclouds.org/)
先看下進去下載鏈接我們會看到什麼東西,對PCL有個基本的認識:

注意,點擊這裡的Source Code和Change List會跳轉到GitHub去,因為PCL官網從1.5/1.6左右的版本就不在官網上託管了,最新的版本全部放在了GitHub上了
1、下面是PCL常見的幾大模組:

2、這裡介紹了開發環境:

注意這裡的一個注釋1,看看是怎麼介紹的:

說的意思就是說PCL的一些主要的三方的庫有哪些:Qt(UI顯示)、CUDA(GPU開發)、GLUT和GLEW(都是OpenGL的東西)
3、接著往下面看

Required:配置需要的第三方支援,分別有Boost、Eigen、FLANN、VTK等
Optional:配置可選第三方支援,有OpenNI/OpenNI2,建議安裝的時候都裝上去
4、下載安裝方式

注意:這裡提供的是All-in-one版本的安裝文件,以及下面的PDB文件(調試文件)都下載下來,根據自己電腦的系統位數來安裝,應該一般都是64位的
5、這裡還有一個配置環境

這裡可以不用管,就類似於安裝配置Opencv的時候需要在系統環境變數中配置一下的那個一樣,我們等下安裝的時候勾選了東西就可以自己在環境變數中配置了
二、安裝配置
下載好的文件,點擊那個exe的文件直接安裝,注意在下面這步按照如下選擇:

修改安裝路徑,習慣性的安裝在D盤下:(這裡有個問題啊,就是據說cmake去編譯PCL的時候會默認去c盤下面找,所以到時候cmake的時候記得把安裝路徑改下注意把路徑改下)


安裝過程中會彈出窗口提示安裝OpenNI,將OpenNI的安裝路徑更改為自己選定的安裝PCL的第三方庫(3rdparty文件夾)的路徑下即:D:PCL1.8.1PCL1.8.13rdpartyOpenNI2,然後同意安裝PrimerSense

下面的這個警告忽略:提示什麼路徑太長

安裝完成:

安裝完成後,安裝目錄下面的幾個文件是這樣的:

然後把PDB文件解壓放在bin目錄下面去
到這一步,PCL的安裝算是完成了
順便說下第三方文件夾下有哪些文件啊:一共六個文件,就是上面提到過的六個文件

其中的VTK是一個可視化工具包,就是顯示點雲用的,一般會和Qt結合一起用,但是這裡安裝的VTK是還沒有和QT一起編譯的,所以這兩個還不能結合一起用的,需要用CMake編譯工具編譯,這就是為什麼安裝完成了還要用make工具去編譯的原因
(注意這裡的路徑中需要把空格去掉,我這裡的截圖是沒有去空格的,空格一定要去掉)
三、環境變數配置
一般來講,安裝第三方軟體是不可避免要去配置環境變數的,opencv如此,PCL亦是如此,安裝的Qt也是如此,下面就如何配置環境變數說下:
在系統的環境變數裡面可以看到,如下:


這四個就是我們在上面的安裝過程中點擊的選項自動添加的

現在還要做的就是,將第三方的bin文件添加到系統文件中去,如下
在Path中手動添加:
%PCL_ROOT%bin
%PCL_ROOT%3rdPartyFLANNbin
%PCL_ROOT%3rdPartyQhullbin
%PCL_ROOT%3rdPartyOpenNI2Tools
%PCL_ROOT%3rdPartyVTKbin
搞完前面的這三步,PCL的安裝就基本完成了,下面就是在VS中的配置了
四、pcl在VS中的配置
VS2015新建項目,這裡命名為PCLPropertySheet_D,表示Debug下的配置
1、打開屬性管理器,找到Debug|x64,右鍵新建屬性頁,然後輸入名稱PCLPropertySheet_D,然後點擊添加,如下

2、雙擊打開該屬性頁,進行配置
①點擊「VC++目錄」->「包含目錄」,進行編輯。
添加下列路徑:(按照自己的目錄來設置)
D:PCL1.8.1PCL1.8.1includepcl-1.8.
D:PCL1.8.1PCL1.8.13rdPartyBoostincludeboost-1_64
D:PCL1.8.1PCL1.8.13rdPartyEigeneigen3
D:PCL1.8.1PCL1.8.13rdPartyFLANNinclude
D:PCL1.8.1PCL1.8.13rdPartyFLANNincludeflann
D:PCL1.8.1PCL1.8.13rdPartyOpenNI2Include
D:PCL1.8.1PCL1.8.13rdPartyQhullinclude
D:PCL1.8.1PCL1.8.13rdPartyVTKincludevtk-8.0
②點擊「VC++目錄」->「庫目錄」,進行編輯。
添加下列路徑:(按照自己的目錄來設置)
D:PCL1.8.1PCL1.8.1lib
D:PCL1.8.1PCL1.8.13rdPartyBoostlib
D:PCL1.8.1PCL1.8.13rdPartyFLANNlib
D:PCL1.8.1PCL1.8.13rdPartyOpenNI2Lib
D:PCL1.8.1PCL1.8.13rdPartyQhulllib
D:PCL1.8.1PCL1.8.13rdPartyVTKlib
③點擊「鏈接器」->「輸入」->「附加依賴項」,進行編輯,添加lib文件。
這裡添加的lib文件太多了,建立了txt文件保存了,見鏈接,輸入裡面的Debug的lib文件即可
3、同理在release下建立屬性頁,如下

同理如上,上面的①②③步都配置,注意的是第三步要加入release下的lib文件,見鏈接
這裡整個配置就完成了,檢驗下配置是否正確:
程式1:
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/ModelCoefficients.h>
#include <pcl/filters/project_inliers.h>
int main(int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_projected(new pcl::PointCloud<pcl::PointXYZ>);
cloud->width = 5;
cloud->height = 1;
cloud->points.resize(cloud->width * cloud->height);
for (size_t i = 0; i < cloud->points.size(); ++i)
{
cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
}
std::cerr << "Cloud before projection: " << std::endl;
for (size_t i = 0; i < cloud->points.size(); ++i)
std::cerr << " " << cloud->points[i].x << " " <<
cloud->points[i].y << " " << cloud->points[i].z << std::endl;
// Create a set of planar coefficients with X=Y=0,Z=1
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());
coefficients->values.resize(4);
coefficients->values[0] = coefficients->values[1] = 0;
coefficients->values[2] = 1.0;
coefficients->values[3] = 0;
// Create the filtering object
pcl::ProjectInliers<pcl::PointXYZ> proj;
proj.setModelType(pcl::SACMODEL_PLANE);
proj.setInputCloud(cloud);
proj.setModelCoefficients(coefficients);
proj.filter(*cloud_projected);
std::cerr << "Cloud after projection: " << std::endl;
for (size_t i = 0; i < cloud_projected->points.size(); ++i)
std::cerr << " " << cloud_projected->points[i].x << " " <<
cloud_projected->points[i].y << " " << cloud_projected->points[i].z << std::endl;
system("pause");
return (0);
}

程式2
#include<pcl/visualization/cloud_viewer.h>
#include<iostream>//標準C++庫中的輸入輸出類相關頭文件。
#include<pcl/io/io.h>
#include<pcl/io/pcd_io.h>//pcd 讀寫類相關的頭文件。
#include<pcl/io/ply_io.h>
#include<pcl/point_types.h> //PCL中支援的點類型頭文件。
int user_data;
using std::cout;
void viewerOneOff(pcl::visualization::PCLVisualizer& viewer)
{
viewer.setBackgroundColor(1.0, 0.5, 1.0); //設置背景顏色
}
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
char strfilepath[256] = "rabbit.pcd";
if (-1 == pcl::io::loadPCDFile(strfilepath, *cloud)){
cout << "error input!" << endl;
return -1;
}
cout << cloud->points.size() << endl;
pcl::visualization::CloudViewer viewer("Cloud Viewer"); //創建viewer對象
viewer.showCloud(cloud);
viewer.runOnVisualizationThreadOnce(viewerOneOff);
system("pause");
return 0;
}

①編譯的時候記得將編譯器變為x64的環境下運行,然後估計會報這樣的錯誤:
error C4996: 'pcl::SAC_SAMPLE_SIZE': This map is deprecated and is kept only to prevent breaking existing user…
解決方式:屬性"->"C/C++"->"SDL檢查":改為否(/sdl)
②為了防止彈出很多的warning,加入預處理器
在屬性目錄"C/C++ "– >"預處理器"–>"預處理器定義" 加入:
_SCL_SECURE_NO_WARNINGS
_CRT_SECURE_NO_WARNINGS
PCL_NO_PRECOMPILE
③在Debug下編譯會出現大量的如下warning(Release下沒有):
warning LNK4099: 未找到 PDB「.pdb」正在鏈接對象,如同沒有調試資訊一樣
解決方法:「視圖」->"解決方案資源管理器"->"屬性"->「鏈接器"->"調試",在右側的「生成調試資訊」改為「否」,確定即可。
具體原因涉及到release和debug的區別,以及PDB文件,具體可百度了解。
④提取文件夾中.lib文件名到文本中 分別粘貼複製靜態鏈接庫名到文本甚是麻煩,故通過批處理來完成
例如要獲取目錄中D:PCL 1.8.13rdPartyVTKlib下的所有靜態鏈接庫文件名並存儲至文本.txt,方法如下:
1、win+r
2、輸入:cmd回車
3、輸入:cd /d D:PCL 1.8.13rdPartyVTKlib 回車
4、輸入:dir /b *.lib *>0.txt 回車

這樣在Debug/Rease X64下的屬性配置資訊就保存在了下面這兩個文件了,然後下次新建其他工程的時候載入這兩個文件即可

編譯報錯:

五、用CMake編譯下載的PCL中第三方庫VTK的源碼
目的:編譯後就可以適應Qt和VTK的結合
好處:CMake有個好處就是編譯中如果前期的配置出現了問題,導致編譯出現問題,直接將編譯生成的文件夾刪掉,重新編譯,很方便,就是耗時罷了
給vtk-v8.0.0找個位置放著:如下

編譯VTK,因為PCL自帶的VTK是不支援Qt的可視化的,必須自己編譯(先把按照上面安裝後的安裝路徑下的VTK文件清空,但是並不要刪掉VTK這個文件夾,後面還有用的),網上下載VTK8.0版本,只能是這個,因為對應的是PCL1.8.1版本的庫,用CMake編譯,如下:
(這裡注意下,在vtk-v8.0.0下面建立文件夾build是放編譯之後的文件的,編譯之後的debug和release都是放在這裡面的,然後得到的dll的文件名是一樣的,想要得到不同名字的dll文件,就得添加其他額外的路徑,這裡不做說明)

1、選擇編譯的原路徑和編譯之後的路徑,如圖
2、選擇VS的版本 這裡是vs2015
3、選擇編譯的平台集 64位的 X64
然後開始點擊Configure開始編譯,第一次編譯時間會比較長,編譯完之後需要勾選下面的選項,然後再次編譯
解釋在下面

相關的參數含義解釋:
1、CMAKE_CONFIGURATION_TYPES表示讓vtk的lib最後分為debug版本跟release版本。Debug版本帶-gd。Release版本不帶-gd,方便區分.
2.勾選BUILD_SHARED_LIBS,這樣最後生成的vtk才會有dll跟lib
3.CMAKE_INSTALL_PREFIX設置為你清空的VTK文件夾,以便放你編譯完只有需要得到的幾個include、lib、bin文件夾等
注意這裡最終得到的文件雖然和build得到的
4.勾選VTK_Group_Qt,這樣以後方便在qt裡面使用
5.修改Qt5_DIR路徑為PATH=D:/Qt/Qt5.12.0/5.12.0/msvc2017_64/lib/cmake/Qt5
6.修改VTK_QT_VERSION:STRING=5,使用Qt5修改相應版本號
7.如出現qmake路徑則修改QT_QMAKE_EXECUTABLE:FILEPATH=D:/Qt/Qt5.12.0/5.12.0/msvc2017_64/bin/qmake.exe
編譯的時候可能會報錯,是因為我的QT版本沒有更改過來,如下圖,更改Qt版本為5,路徑選擇安裝的目錄

這裡注意一個細節位置:

上圖中的Qt5_dir設置的路徑和前面的那個路徑是不一樣的,注意在Cmake的時候看清楚Name的參數是
什麼
報錯沒找到合適的版本,是因為之前VTK_QT_VERSION那裡填的是4,所以要改為5,然後再次編譯
編譯完成後,看看最終的編譯結果是怎麼樣的,如下圖:

再次點擊按鈕Configuring編譯,編譯多次直到上面的紅色條沒有,
然後就是點擊生成按鈕Generate,如下

六、VS去編譯CMake編譯的VTK
目的:得到下面這兩個文件

首先用管理員方式打開VS2015(一定管理員方式打開),然後找到如下的路徑,打開裡面的VTK.sln

打開如下:

分別在Debug和Release下面完成下面的動作:(注意這裡需要在X64下面)
1、右鍵ALL_BUILD—>>重新生成(時間比較久)

2、右鍵INSTALL—>>生成

生成完成後,可以看下本地文件路徑下的VTK文件夾生成的東西:

注意:如果編譯的debug版本,那麼上圖生成的就是重新編譯的debug的版本的VTK;如果編譯的是release版本,那麼上圖生成的就是重新編譯的
release版本的VTK,其實這個和build(build文件夾下只會有bin文件和lib包文件,不會有include文件)下面的bin文件的.dll以及lib文件的.lib文件是一樣的,為了統一下我們將兩次生成的版本分別建立文件夾放到對應的位置,如下:


這樣在vs裡面配置的時候就不用去包含build文件夾下的lib文件夾和bin文件夾了,直接和其他的幾個三方庫統一即可
3、然後再release模式下再次去執行上面兩步,得到release的dll和lib
PS:非常重要
VS2015的編譯結果包括4個部分。
1. include 不區分release和debug版本
2. lib 不區分版本
3. dll 根據輸入配置選擇debug和release版本)
4. plugin dll 只有release版本可用)
這4個編譯結果被放在2個位置。
.h和.lib文件存放在D:PCL1.8.1PCL1.8.13rdPartyVTK目錄。D:PCL1.8.1PCL1.8.13rdPartyVTK下的dll文件請不要使用,因為沒有區分release和debug。

(這裡統一下,lib文件就用D:PCL1.8.1PCL1.8.13rdPartyVTKlib目錄下的lib文件,全部是VTK的lib文件,與其他的三方庫無關的)
得到的方式如下:
.dll文件被放在如下位置:(可以看到有Debug和Release)

那我們的lib文件和dll文件分別在如下路徑:


小技巧:
在lib文件夾下新建一個文本文檔,把下面的語句放進去,保存,改後綴名為 bat,雙擊,看看是不是多了一個 LIBLIST.txt 文件,
把裡面的內容全複製,拷貝到附加依賴項中。
DIR *.lib /B >LIBLIST.TXT
但有一點要提醒大家:只需要將Release版本中QVTKWidgetPlugin.dll 和 QVTKWidgetPlugin.lib放在designer文件夾下就可以了,QVTK.dll不需要放入該文件夾下,否則會出現qwidget: must construct a qapplication before a qpaintde 錯誤,因為Release與Debug中DLL混合在一起。
目前微信交流群不斷壯大,由於人數太多,目前有兩個群,為了鼓勵大家分享,我們希望大家能在學習的同時積極分享,將您的問題或者小總結投稿發到群主郵箱主郵箱[email protected]。
以上內容如有錯誤或者需要補充的,請留言!同時歡迎大家關注微信公眾號,積極分享投稿,或者加入3D視覺微信群或QQ交流群。
原創不易,轉載請聯繫群主,註明出處。
作者:資源組
排版:青衫依舊