visual studio2022 配置 PCL 1.13.1
PCL库下载
下载链接: https://github.com/PointCloudLibrary/pcl/releases
下载这两个。
PCL库安装
运行.exe文件进行安装。
环境变量勾第二个(其实无所谓,反正还要添加别的环境变量,这里没选之后加也一样)。
安装路径自定义,我喜欢装在D盘。
3rd组件勾一下,除非你自己配置好了所需库就不用勾。
PCL库安装完成后,双击这个.msi文件装一下OpenNI2,最开始里面只有这个.msi文件,安装路径就选择这个OpenNI2路径,安装完成后就会多出下面这些文件。
这一步完成后,将最开始下载的.zip文件解压,把里面所有.pdb文件复制到PCL里的bin目录下。
最后配置系统环境变量。如果PCL安装时没加环境变量这里顺带加一下就行。
D:\PCL\bin
D:\PCL\3rdParty\VTK\bin
D:\PCL\3rdParty\FLANN\bin
%OPENNI2_REDIST64%
%OPENNI2_LIB64%
%OPENNI2_INCLUDE64%
visual studio环境配置
环境
PATH=D:\PCL\\bin;D:\PCL\\3rdParty\FLANN\bin;D:\PCL\\3rdParty\VTK\bin;D:\PCL\\3rdParty\OpenNI2\Tools
包含目录和库目录
附加依赖项
附加依赖项里面添加的是PCL\lib和PCL\3rdParty\VTK\lib里面的.lib文件名。
这里需要改debug模式还是release模式,debug模式加带d的.lib文件,release模式加不带d的.lib文件。
可以使用如下方法快速提取出里面的文件名
在这里输入cmd回车,会进到终端并定位到该路径。
第一行取出所有带d的.lib文件名写入1.txt,填入debug模式。
第二行取出所有不带d的.lib文件名写入2.txt,填入release模式。
PCL\3rdParty\VTK\lib目录下同样操作。
测试
以下面这段代码为例
#include <iostream>
#include <vector>
#include <ctime>
#include <pcl/point_cloud.h>
#include <pcl/octree/octree.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>
using namespace std;
int
main(int argc, char** argv)
{srand((unsigned int)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::octree::OctreePointCloudSearch<pcl::PointXYZ> octree(0.1);octree.setInputCloud(cloud);octree.addPointsFromInputCloud();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);//半径内近邻搜索vector<int>pointIdxRadiusSearch;vector<float>pointRadiusSquaredDistance;float radius = 256.0f * rand() / (RAND_MAX + 1.0f);cout << "Neighbors within radius search at (" << searchPoint.x<< " " << searchPoint.y<< " " << searchPoint.z<< ") with radius=" << radius << endl;if (octree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0){for (size_t i = 0; i < pointIdxRadiusSearch.size(); ++i)cout << " " << cloud->points[pointIdxRadiusSearch[i]].x<< " " << cloud->points[pointIdxRadiusSearch[i]].y<< " " << cloud->points[pointIdxRadiusSearch[i]].z<< " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << endl;}// 初始化点云可视化对象boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer(new pcl::visualization::PCLVisualizer("显示点云"));viewer->setBackgroundColor(0, 0, 0); //设置背景颜色为黑色// 对点云着色可视化 (red).pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>target_color(cloud, 255, 0, 0);viewer->addPointCloud<pcl::PointXYZ>(cloud, target_color, "target cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "target cloud");// 等待直到可视化窗口关闭while (!viewer->wasStopped()){viewer->spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(1000));}return (0);
}
release模式
把刚刚两个目录下的2.txt里面的所有文件名复制过来。
运行结果如下
debug模式
把刚刚两个目录下的1.txt里面的所有文件名复制过来,其实有更简洁的写法,如下
运行结果如下