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交流群。

原創不易,轉載請聯繫群主,註明出處。

作者:資源組

排版:青衫依舊