PCL有两种建立工程的方法,一种以cmakelist.txt文件生成相对应的工程(例如VS2019),还有一种就是纯粹的建立包含PCL环境库的工程进行开发。本文主要介绍怎么从0开始建立PCL工程,方便后面配合CV和QT进行开发。
首先得先下载两个文件PCL-1.11.1-AllInOne-msvc2019-win64.exe和pcl-1.11.1-pdb-msvc2019-win64.zip网址在https://github.com/PointCloudLibrary/pcl/releases,github下载较慢,可以在我上传的资源里下载。
PCL1.11.1版本.rar-互联网文档类资源-CSDN下载
下载完成后开始安装(最好下载64位的),
双击PCL-1.8.1-AllInOne-msvc2017-win32.exe 一路next到如下界面,直接点击下一步,这一步我们不添加环境变量,到完成安装后我们自己手动添加。
到如下界面选择添加路径,最好安装到D盘。
选中全部的第三方库。
将OpenNI2安装到你pcl安装目录下的3rdParty\OpenNI2下,这里一定要改一下,有些人这一步没有做好后面编译的时候会发现OPenNI2的库一直在报错,就是因为这个库安装了但是环境变量没有设置好,安稳一点直接将其塞到该目录下。
当然如果你没有这一步或者已经出错了不要慌,在3rdParty\OpenNI2有个OpenNI-Windows-x64-2.2.msi文件,双击一样可以安装或者卸载重装。到这一步PCL-1.8.1-AllInOne-msvc2017-win32.exe已经安装完毕。
解压pcl-1.11.1-pdb-msvc2019-win64.zip
复制这些文件到你PCL安装路径下的bin文件夹下。
至此软件已经全部安装完毕了。接下来就是环境配置的问题了。
首先先右击我的电脑->属性->高级系统设置->高级->环境变量。
双击Path
根据自己的版本添加相应的目录,千万别弄错了。
环境变量
D:\PCL\PCL 1.11.1\bin
D:\PCL\PCL 1.11.1\3rdParty\FLANN\bin
D:\PCL\PCL 1.11.1\3rdParty\Qhull\bin
D:\PCL\PCL 1.11.1\3rdParty\OpenNI2\Tools
D:\PCL\PCL 1.11.1\3rdParty\VTK\bin
打开VS,创建一个C++工程,能打印helloworld的那种,打开 “属性管理器”窗口,在Debug X64和Release添加两个属性表。
分别双击两个属性表按图示所示的区域填充具体的路径
一定要根据自己的实际情况去设置
VC C/C++目录 包含目录
D:\PCL\PCL 1.11.1\include\pcl-1.11
D:\PCL\PCL 1.11.1\3rdParty\VTK\include\vtk-8.2
D:\PCL\PCL 1.11.1\3rdParty\Qhull\include
D:\PCL\PCL 1.11.1\3rdParty\OpenNI2\Include
D:\PCL\PCL 1.11.1\3rdParty\FLANN\include
D:\PCL\PCL 1.11.1\3rdParty\Eigen\eigen3
D:\PCL\PCL 1.11.1\3rdParty\Boost\include\boost-1_74
尤其这两个要注意
VC C/C++目录 库目录
D:\PCL\PCL 1.11.1\lib
D:\PCL\PCL 1.11.1\3rdParty\VTK\lib
D:\PCL\PCL 1.11.1\3rdParty\Qhull\lib
D:\PCL\PCL 1.11.1\3rdParty\OpenNI2\lib
D:\PCL\PCL 1.11.1\3rdParty\FLANN\lib
D:\PCL\PCL 1.11.1\3rdParty\Boost\lib
C/C++->预处理器->预处理器定义
BOOST_USE_WINDOWS_H
NOMINMAX
_CRT_SECURE_NO_DEPRECATE
注意:到这里为止Debug和Release操作完全一样。
将pcl和vtk的lib库放入 链接器-输入-附加依赖项 中。
vtk结尾带-gd的为debug模式,不带的为release模式。pcl末尾带-debug的为debug模式(有的可能直接带-d),不带-debug(或d)为release模式。
一定注意是换行输入,或者中间加上;断开(直接复制过去应该就是换行输入,还是检查一下吧)。
转到链接器->输入栏,这里需要分别就Debug和Release两个输入不同的内容,先不要着急去复制,往下看。
打开PCL 1.11.0\3rdParty\VTK\lib目录,在这里输入cmd进入命令行,执行dir /b *.lib *>0.txt,会在该目录下产生0.txt。
对PCL 1.11.0\lib目录进行一样的操作。
或者
//win+r调出“运行”窗口并输出cmd
//(填自己的路径)
cd /d D:\programming\PCL 1.11.0\3rdParty\VTK\lib
dir /b *.lib *>0.txt
//win+r调出“运行”窗口并输出cmd
//(填自己的路径)
cd /d D:\programming\PCL 1.11.0\lib
dir /b *.lib *>0.txt
注意,两个依赖项还杂合在一起,直接复制的话太麻烦了,所以仍然是先别急继续往下看。
参考 VISUAL STUDIO 2019配置PCL1.9.0并测试这篇文章里的内容,找到了快速提取的方法。
建立一个C++工程将下面的代码添加到工程,将0.txt复制到代码的根目录下,这个0.txt中会把0.txt和一个pkgconfig文件夹也写进去,复制之前,应该把这两个删掉,否则可能会出现意外情况,总之没有.lib为后缀的都删掉,运行如下代码。
#include <iostream>
#include <string>
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
ifstream txtfile;//打开读取的文件
ofstream txt01;//保存的文件
ofstream txt02;//保存的文件
string temp;
int index = 0;//用于判断奇偶
txtfile.open("0.txt", ios::in);
while (!txtfile.eof()) // 若未到文件结束一直循环
{
getline(txtfile, temp);//一行一行读取
if (index % 2 == 0)//判断除以2的余数,即为奇偶的判断
{
txt01.open("1.txt", ios::app);
txt01 << temp;
txt01 << endl;
txt01.close();
}
else
{
txt02.open("2.txt", ios::app);
txt02 << temp;
txt02 << endl;
txt02.close();
}
index++;
}
txtfile.close(); //关闭文件
txtfile.close();
txt01.close();
txt02.close();
return 0;
}
运行结束后,该目录下会产生1.txt和2.txt
该代码是按行提取的,检查一下如果名称全是*d.lib则复制其到Debug的依赖里去,如果全是*.lib则复制其到Release的依赖项里。(两个0.txt一样操作,记住复制之前一定要保证把文件里面内容0.txt和pkgconfig(可能有,搜索一下)删掉,总之没有.lib为后缀的都删掉)。
注意再检查一下,每个依赖都是一行,因为一旦输入错,编译就会报错。
还有最后一步,将SDL检查关闭
肯最后编译还是报错,因为这两个SDL都不是最高层,项目->属性里将SDL关闭
至于还有错或者警报编号4996:PCL use getColor() without parameters instead的
在头文件point_cloud_color_handlers.h中注释掉109行和611行
或者
建立一个源文件
输入代码
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
int main(int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ> cloud; // Fill in the cloud data
cloud.width = 5;
cloud.height = 1;
cloud.is_dense = false;
cloud.points.resize(cloud.width * cloud.height);
for (std::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);
}
pcl::io::savePCDFileASCII("test_pcd.pcd", cloud);
std::cerr << "Saved " << cloud.points.size() << " data points to test_pcd.pcd." << std::endl;
for (std::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;
return (0);
}
能显示数据就算配置成功了
第一次写文章,可能写的不是很好,如果还是有问题的朋友可以回头再看两遍或者参考其他教程。