VS2017+PCL1.8.1环境配置+代码测试(详细教程❤️❤️❤️Win 10)

VS2017+PCL1.8.1环境配置+代码测试(Win 10)

1 准备工作

1.1 Vs2017的获取与安装 。

1.2 PCL-1.8.1-AllInOne-msvc2017-win64.exe及其对应PDB文件 pcl-1.8.1-pdb-msvc2017- win64.exe的获取。

相关文件可以自行下载
在这里插入图片描述

链接:https://pan.baidu.com/s/1kLJNW5OfwHv-1ZNi7FcMxg
提取码:pdx6

2 PCL安装

2.1 PCL-1.8.1-AllInOne安装

1) 右键选择PCL-1.8.1-AllInOne-msvc2017-win64.exe,以管理员身份运行
在这里插入图片描述
在这里插入图片描述
2)选择第二项“Add PCL to the system PATN for all users”
在这里插入图片描述
3)更改安装目录,建议使用英文目录
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4)安装过程中会进行OpenNI 2.2 SDK的安装,选择路径安装即可(有人建议安装在PCL 1.8.1\3rdParty\OpenNI2目录下)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 添加pdb文件

将pdb文件解压,把文件夹中的内容(20个项目)复制到PCL目录的bin文件夹下(D:\Program Files\PCL 1.8.1\bin)
在这里插入图片描述

3 添加环境变量

右键“此电脑->属性->高级系统设置->高级->环境变量”
将以下内容依次新建到系统变量Path中(Win10)
D:\Program Files\PCL 1.8.1\bin
D:\Program Files\PCL 1.8.1\3rdParty\FLANN\bin
D:\Program Files\PCL 1.8.1\3rdParty\Qhull\bin
D:\Program Files\PCL 1.8.1\3rdParty\VTK\bin
D:\Program Files\OpenNI2\Tools
在这里插入图片描述
需要注销或者重启

4 配置pcl 1.8.1属性表(Debug版本)

4.1 创建属性表

1) 打开vs2017点击左上角“文件->新建->新建项目->空项目”
在这里插入图片描述
2)选择“属性管理器->Debug | x64”,右键“添加新项目属性表”(一劳永逸,以后创建新项目时直接调用即可,不必重新配置)
在这里插入图片描述
3)双击新建好的属性表,进入下一步。

4.2 VC++目录/包含目录(以实际安装目录为准)

将以下路径添加到“通用属性->VC++ 目录->包含目录”中

D:\Program Files\PCL 1.8.1\include\pcl-1.8
D:\Program Files\PCL 1.8.1\3rdParty\Boost\include\boost-1_64
D:\Program Files\PCL 1.8.1\3rdParty\Eigen\eigen3
D:\Program Files\PCL 1.8.1\3rdParty\FLANN\include
D:\Program Files\PCL 1.8.1\3rdParty\Qhull\include
D:\Program Files\PCL 1.8.1\3rdParty\VTK\include\vtk-8.0
D:\Program Files\OpenNI2\Include

在这里插入图片描述

4.3 库目录

将以下ib路径添加到“通用属性->VC++ 目录->库目录”中

D:\Program Files\PCL 1.8.1\lib
D:\Program Files\PCL 1.8.1\3rdParty\FLANN\lib
D:\Program Files\PCL 1.8.1\3rdParty\Boost\lib
D:\Program Files\PCL 1.8.1\3rdParty\Qhull\lib
D:\Program Files\PCL 1.8.1\3rdParty\VTK\lib
D:\Program Files\OpenNI2\Lib

在这里插入图片描述

4.4添加vtk_lib文件

打开”链接器->输入->附加依赖项“,添加vtk_lib文件
debug版本的vtk文件已经在百度网盘中给出
在这里插入图片描述

5 代码测试

以kd-tree作为测试代码,包括了点云生成,kd-tree的创建及搜索,保存生成的点云及可视化

5.1 创建.cpp文件

选择“源文件”,右键“添加->新建项”,建立C++文件.cpp

5.2 测试代码

#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/cloud_viewer.h>

int main(int argc, char**argv)
{
	srand(time(NULL));						//用系统时间初始化随机种子
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	//点云生成
	cloud->width = 1000;					//点云数量
	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.0f* rand() / (RAND_MAX + 1.0f);
		cloud->points[i].y = 1024.0f* rand() / (RAND_MAX + 1.0f);
		cloud->points[i].z = 1024.0f* rand() / (RAND_MAX + 1.0f);
	}
	pcl::KdTreeFLANN<pcl::PointXYZ>kdtree;	//创建K-D Tree 对象
	kdtree.setInputCloud(cloud);			//设置搜索空间
	pcl::PointXYZ searchPoint;				//定义查询点,并赋随机值
	searchPoint.x = 1024.0f* rand() / (RAND_MAX + 1.0f);
	searchPoint.y = 1024.0f* rand() / (RAND_MAX + 1.0f);
	searchPoint.z = 1024.0f* rand() / (RAND_MAX + 1.0f);
	// k近邻搜索
	int K = 10;
	std::vector<int>pointIdxNKNSearch(K);			//存储查询点近邻索引
	std::vector<float>pointNKNSquaredDistance(K);	//存储近邻点对应平方距离
	std::cout << "K nearest neighbor search at ("
		<< searchPoint.x
		<< " " << searchPoint.y
		<< " " << searchPoint.z
		<< ") with K=" << K << std::endl;
	if (kdtree.nearestKSearch(searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0)	//执行K近邻搜索
	{
		for (size_t i = 0; i < pointIdxNKNSearch.size(); ++i)
			std::cout << "    " << cloud->points[pointIdxNKNSearch[i]].x
			<< " " << cloud->points[pointIdxNKNSearch[i]].y
			<< " " << cloud->points[pointIdxNKNSearch[i]].z
			<< " (squared distance: " << pointNKNSquaredDistance[i] << ")" << std::endl;
	}
	// 在半径r内搜索近邻
	std::vector<int> pointIdxRadiusSearch;
	std::vector<float> pointRadiusSquaredDistance;
	float radius = 156;
	std::cout << "Neighbors within radius search at (" << searchPoint.x
		<< " " << searchPoint.y
		<< " " << searchPoint.z
		<< ") with radius=" << radius << std::endl;
	if (kdtree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0)
	{
		for (size_t i = 0; i < pointIdxRadiusSearch.size(); ++i)
			std::cout << "    " << cloud->points[pointIdxRadiusSearch[i]].x
			<< " " << cloud->points[pointIdxRadiusSearch[i]].y
			<< " " << cloud->points[pointIdxRadiusSearch[i]].z
			<< " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << std::endl;
	}

	pcl::io::savePCDFileASCII("1.pcd", *cloud);	//保存点云

	std::cerr << "Saved " << cloud->points.size() << " data points to 1.pcd." << 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;
	//可视化生成点云
	pcl::visualization::CloudViewer viewer("Cloud Viewer");
	viewer.showCloud(cloud);
	while (!viewer.wasStopped())
	{
	
	}
	return 0;
}

5.3 测试结果

在这里插入图片描述
可视化点云,为一立方体

默认显示如下

在这里插入图片描述
此时,通过滑动滚轮缩小点云,并长按滚轮拖动即可得到如下显示

在这里插入图片描述

6 异常处理

配置完成后可能会出现以下异常
异常1:
pcl 1.8.1\3rdparty\flann\include\flann\util\serialization.h(484): error C4996: ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
解决办法:
C/C++ 预处理器 预处理定义,添加 _CRT_SECURE_NO_WARNINGS

异常2
C3861: “pop_t”: 找不到标识符
在这里插入图片描述

解决办法:
修改打开的dish.h文件,将503行的“typedef unsigned long pop_t”移到“#if GNUC”前面一行(往上翻几行就能看到)

异常3
C4996 ‘std::fpos<_Mbstatet>::seekpos’: warning STL4019

错误 C4996 ‘std::fpos<_Mbstatet>::seekpos’: warning STL4019: The member std::fpos::seekpos() is non-Standard, and is preserved only for compatibility with workarounds for old versions of Visual C++. It will be removed in a future release, and in this release always returns 0. Please use standards-conforming mechanisms to manipulate fpos, such as conversions to and from streamoff, or an integral type, instead. If you are receiving this message while compiling Boost.IOStreams, a fix has been submitted upstream to make Boost use standards-conforming echanisms, as it does for other compilers. You can define _SILENCE_FPOS_SEEKPOS_DEPRECATION_WARNING to acknowledge that you have received this warning, or define _REMOVE_FPOS_SEEKPOS to remove std::fpos::seekpos entirely.

解决办法
VS其实在加粗部分已经给出了解决该错误的办法,具体操作为

C/C++ 预处理器 预处理定义,添加 _SILENCE_FPOS_SEEKPOS_DEPRECATION_WARNING
应用并确定,重新调试运行(我到这就已经调试成功了)
若还有问题,再添加_REMOVE_FPOS_SEEKPOS
若还有问题,尝试 C/C++ 常规 SDL检查设置为“否”

目前未遇到其他异常,如出现其他异常请检查以上步骤是否执行正确,或者参考其他博主的文章


相关链接

PCL点云数据处理基础❤️❤️❤️目录

  • 25
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 49
    评论
搭建点云开发环境需要安装以下软件: 1. Visual Studio 2017:用于编写C++代码。 2. Qt 5.10.1:用于构建GUI界面。 3. PCL 1.8.1:点云库。 4. VTK 8.0:用于可视化点云数据。 以下是具体的步骤: 1. 安装 Visual Studio 2017,选择 C++ 工作负载。此外,还需要安装 CMake。 2. 下载 Qt 5.10.1 安装包并安装。需要安装的组件有:Qt 5.10.1 MSVC2017 64-bit、Qt Visual Studio Tools、Qt Charts 和 Qt Data Visualization。 3. 下载 PCL 1.8.1 for Windows,并解压到一个目录下。 4. 下载 VTK 8.0 for Windows,并解压到一个目录下。 5. 打开 CMake,设置源代码路径为 PCL 的根目录,设置构建路径为一个新的目录(例如:PCL_build)。点击 Configure,选择 Visual Studio 15 2017 Win64 作为生成器,点击 Finish。 6. 在 CMake 中,找到 VTK_DIR 设置项,将其设置为 VTK 的安装目录(例如:D:/VTK-8.0.0/build)。点击 Configure,然后点击 Generate。 7. 打开 Visual Studio 2017,选择 File > New > Project,选择 Qt Widgets Application。设置项目名称、位置和解决方案名称,然后点击 Create。 8. 在项目属性中,选择 C/C++ > General,将 Additional Include Directories 设置为 PCL 的 include 目录(例如:D:/PCL-1.8.1/include/pcl-1.8)和 VTK 的 include 目录(例如:D:/VTK-8.0.0/include/vtk-8.0)。 9. 在项目属性中,选择 Linker > General,将 Additional Library Directories 设置为 PCL 的 lib 目录(例如:D:/PCL-1.8.1/lib)和 VTK 的 lib 目录(例如:D:/VTK-8.0.0/build/bin/Release)。 10. 在项目属性中,选择 Linker > Input,将 Additional Dependencies 设置为以下库:pcl_common_release.lib、pcl_io_ply_release.lib、pcl_visualization_release.lib、vtkCommonCore-8.0.lib、vtkFiltersCore-8.0.lib、vtkInteractionStyle-8.0.lib、vtkRenderingCore-8.0.lib。 11. 编写代码并构建项目,即可开始点云开发。 以上是在 Windows 10、Visual Studio 2017、Qt 5.10.1、PCL 1.8.1 和 VTK 8.0 环境下的点云开发环境搭建步骤。
评论 49
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙 悟 空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值