pcl入门笔记1:pcl的安装

2023-11-19

前言

最近刚入坑pcl,打算记录一下自己的学习历程。

安装pcl前的准备

本教程使用的是windows下的预编译包安装,要想顺利编译程序,需要安装好微软的Visual Studio IDE和cmake。这两者安装过程笔者不详细介绍,读者可以自行百度。建议cmake安装gui版本。Visual Studio是集成开发环境,cmake是c/c++跨平台编译工具。
pcl的预编译包链接:https://pan.baidu.com/s/1hWi3_hELh1MVZihHV23juQ
提取码:ouzu
笔者提供了1.8和1.12两个版本,读者可以自行选择安装。每个版本的文件夹有两个文件。笔者的教程是以1.12版本为例。

安装步骤

双击下载的exe文件出现如下:
在这里插入图片描述
点击下一步
在这里插入图片描述
点击接受
在这里插入图片描述
如上图需要添加环境变量
在这里插入图片描述
然后选择安装位置,等待安装完成即可。
然后把另外一个压缩文件解压,会得到包含一些pdb后缀的文件,全选这些文件,复制到pcl安装目录下的bin文件夹中。

openni的安装

随后便需要安装openni,进入pcl安装目录中,进入3rdParty文件夹,进入openni2文件夹。里面有一个OpenNI-Windows-x64-2.2.msi文件,双击,如果以前安装过openni建议点击remove移除重新安装。然后安装的路径选择3rdParty下的openni2目录。

检查环境变量

安装之后需要检查一下,安装好的环境如下
在这里插入图片描述
打开环境变量页面查看,首先在系统变量中会有一个PCL_ROOT变量,这个变量的路径是pcl安装路径。
在这里插入图片描述

上图是用户变量下path里面需要添加的。

测试

建立一个kdtree_search.cpp文件,代码如下:

#include<iostream>
using namespace std;
#include<pcl/point_cloud.h>
#include<pcl/kdtree/kdtree_flann.h>
#include<vector>
#include<ctime>

int main(int argc,char** arv)
{
    //随机种子,srand里面的值每次都是一样的,那么生成的随机数不变,否则会变
    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);
    }
    //创建kd-tree对象
    pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
    //设置cloud的搜索空间
    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;
    //保存查询点的k近邻索引
    vector<int> pointIdxNKNSearch(k);
    //保存k近邻点对应的欧氏距离
    vector<float> pointNKSquaredDistance(k);
    cout<<"k nearest neighbor search at ("<<searchPoint.x
    <<"  "<<searchPoint.y<<"  "<<searchPoint.z<<") with k="<<k<<endl;
    //执行k近邻搜索,并且打印相应信息
    if(kdtree.nearestKSearch(searchPoint,k,pointIdxNKNSearch,pointNKSquaredDistance)>0)
    {
        cout<<"k nearest neighbor:"<<endl;
        for(size_t i=0;i<pointIdxNKNSearch.size();++i)
        {
            cout<<"    "<<cloud->points[pointIdxNKNSearch[i]].x
            <<" "<<cloud->points[pointIdxNKNSearch[i]].y
            <<" "<<cloud->points[pointIdxNKNSearch[i]].z
            <<" (squared distance:"<<pointNKSquaredDistance[i]<<")"<<endl;
        }
        //半径r内近邻搜索方式
        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(kdtree.radiusSearch(searchPoint,radius,pointIdxRadiusSearch,pointRadiusSquaredDistance)>0)
        {
            cout<<"radius search:"<<endl;
            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;
            }
            
        }
        else
        {
            cout<<"no radius search"<<endl;
        }
    }
    return 0;
}

建立一个CMakeLists.txt文件,内容如下:

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(kdtree_search)
find_package(PCL 1.12 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable(kdtree_search kdtree_search.cpp)
target_link_libraries(kdtree_search ${PCL_LIBRARIES})

这两个文件放在同一个文件夹下,然后在同级目录下建立一个build文件,用来存放编译产生的中间文件。然后打开cmd,cd到build文件夹,cmd输入cmake ..回车执行完毕后找到build文件夹下sln后缀的文件双击用vs打开。在生成中点击重新生成解决方案开始编译。编译完成后进入Debug文件夹,能找到exe可执行文件。然后进入cmd cd到Debug文件夹,输入exe可执行文件的全名称,就可以运行程序了,运行程序结果如下:
在这里插入图片描述
至此,pcl安装就完毕了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pcl入门笔记1:pcl的安装 的相关文章

随机推荐

  • 学习笔记-Spark环境搭建与使用

    一 20 04 Ubuntu安装 清华源ISO源 https mirrors tuna tsinghua edu cn ubuntu releases 20 04 下载链接 https mirrors tuna tsinghua edu c
  • 【整理八】

    1 说说你对Event Loop的理解 Eventloop 是一种在编程语言中常用的编程模型 用于处理任务队列中的事件 它可以被用来处理各种任务 包括网络事件 文件读写 定时器 用户界面事件等Eventloop 的工作原理是 它会按顺序处理
  • 通过进入单用户模式解决linux中的rc.local修改后无法启动的问题

    问题 本想将teamviewer这个软件随linux自启动 所以将其启动命令放在rc local中 但是重启后发现linux启动不起来了 系统前面都是正常启动的 就是无法进入帐户登陆界面 无法输入root帐号密码 不能登陆到系统 按了ctr
  • ROS系列报错与解决方法

    6 28 一 问题描述 ROS运行roscore命令后发现提示log文件 日志文件 大小超过1G 需要清理 Checking log directory for disk usage This may take awhile Press C
  • MYSQL 查看最大连接数和修改最大连接数

    MySQL查看最大连接数和修改最大连接数 1 查看最大连接数 show variables like max connections 2 修改最大连接数 set GLOBAL max connections 200 以下的文章主要是向大家介
  • 2021年 centos7.2 openssl3安装全过程

    安装关联软件包和编译工具包 yum install perl ExtUtils CBuilder perl ExtUtils MakeMaker 官网下载 https www openssl org source wget https ww
  • C++里有哪几种数据类型

    C 里有哪几种数据类型 1 基本类型 布尔型 布尔型 即bool 它的取值只能是true 真 或者false 假 分别代表非零与零 对布尔型的赋值可以直接用true或者false进行赋值 也可以用整型常量对其进行赋值 只不过整型常量赋值给布
  • vue加载ElementUI的el-image图片时不能使用相对路径问题

    Vue官方提供的图片控件el image 在加载相对路径时会出现加载失败现象
  • boost中boost::uint32_t和一般的uint32_t的区别

    using boost int8 t using boost uint8 t using boost int16 t using boost uint16 t using boost int32 t using boost uint32 t
  • word格式问题——英文单词间距太大、文本中嵌入公式导致行距太大、单双栏排版

    1 英文单词直接间距太大 1 全选 右击鼠标 选 段落 中文版式 勾选 允许西文在单词中间换行 如果不勾选此项 可目测换行位置 按住Shift打回车 手动换行 2 选择左对齐 然后用 连接被分割的单词 2 文本中嵌入公式导致行距太大 在段落
  • php的$_SERVER['HOSTNAME']

    一 前言 在最新一次更新代码后 发现代码中出现了 SERVER HOSTNAME 这个东西 关键是 SERVER HTTP HOST 和 SERVER SERVER NAME 我们经常用到 一般是用来获取服务器上的相关参数 唯独这个HOST
  • 写需求分析必须牢记的5大要点

    需求验证的5大要点 要做好需求验证 必须在思想 方法 语言 人员 内容5个要点上做好相应的工作 否则就会产生很多负面的影响 1 思想 前面已经说过 由于Review被翻译成 评审 导致很多人将其与中国人常说的评审相混淆 其实它们之间是有区别
  • CSDN博文显示图片的方法

    感觉官方应该出一个教程的 不然新手第一次发博文十有八九会发现自己的博文发表之后没有图片 既然官方不给 那么自己摸索咯 参考 http blog csdn net cherish cx article details 52782644 1 编
  • 利用Mybatis拦截器对数据库水平分表

    首先你要知道在哪些sql上面要处理分表 你可能需要一个注解 java view plain copy package com dusk domyself stock common split import java lang annotat
  • 数据挖掘知识点总结

    1 数据挖掘产生的背景 驱动力是什么 四种主要技术激发了人们对数据挖掘技术的开发 应用和研究的兴趣 超大规模数据库的出现 如商业数据仓库和计算机自动收集数据记录手段的普及 先进的计算机技术 如更快和更大的计算能力和并行体系结构 对海量数据的
  • 用递归法求两个数的最大公约数

    用递归法求两个数的最大公约数 求两个数的最大公约数的思路是 用辗转现除法 辗转相除法求两个数的最大公约数的步骤如下 先用小的一个数除大的一个数 得第一个余数 再用第一个余数除小的一个数 得第二个余数 又用第二个余数除第一个余数 得第三个余数
  • 虚拟化与网络存储技术

    虚拟化技术简介 一 常见的虚拟化技术分类 1 CPU虚拟化 CPU的虚拟化技术是一种硬件方案 支持虚拟化技术的CPU带有特别优化过的指令集来控制虚拟过程 通过这些指令集 VMM会很容易提高性能 2 服务器虚拟化 服务器虚拟化能够通过区分资源
  • 【手撕代码系列】JS手写实现Promise.all

    公众号 Code程序人生 分享前端所见所闻 Promise all 方法接收一个 Promise 对象数组作为参数 返回一个新的 Promise 对象 该 Promise 对象在所有的 Promise 对象都成功时才会成功 其中一个 Pro
  • mysql数据库中 控制流程函数 case

    1 CASE CASE value WHEN compare value1 THEN result1 WHEN compare value2 THEN result2 ELSE result3 END 解释 用value值来匹配 如果val
  • pcl入门笔记1:pcl的安装

    前言 最近刚入坑pcl 打算记录一下自己的学习历程 安装pcl前的准备 本教程使用的是windows下的预编译包安装 要想顺利编译程序 需要安装好微软的Visual Studio IDE和cmake 这两者安装过程笔者不详细介绍 读者可以自