登陆注册
2491

3D点云处理 PCL部署使用

站长网2023-05-24 16:42:110

pcl是3D点云处理的必须算法,比肩图像算法中的opencv ,是国内自主开发开源的算法包,适合所有需要处理点云的算法工程师的必备技能。应用范围极其广泛,自动驾驶相关应用的经典算法库。从理论到实际,从实验到应用,记录学习pcl算法的学习之路。

算法的范围,PCL 是指纳入了多种操作点云数据的三维处理算法,其中包括过滤、特征估计、表面重建、模型拟合和分割、定位搜索...

系统:ubuntu20.04

下载最新的算法部署包。

https://github.com/PointCloudLibrary/pcl/releases

点击链接下载

下载解压后,编译。

在解压的文件夹下编译PCL算法库。

mkdir build

cd build

cmake ..

make

make install

等待编译和部署完成。

安装完成

安装完成迫不及待

下面是网上找的测试代码。

#include <pcl/point_cloud.h>

//点类型定义头文件

#include <pcl/kdtree/kdtree_flann.h> //kdtree类定义头文件

#include <iostream>

#include <vector>

#include <ctime>

int

main (int argc, char** argv)

{

srand (time (NULL)); //用系统时间初始化随机种子

//创建一个PointCloud<pcl::PointXYZ>

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); // // 产生数值为0-1024的浮点数

cloud->points[i].y = 1024.0f * rand () / (RAND_MAX 1.0f);

cloud->points[i].z = 1024.0f * rand () / (RAND_MAX 1.0f);

}

//创建KdTreeFLANN对象,并把创建的点云设置为输入,创建一个searchPoint变量作为查询点

pcl::KdTreeFLANN<pcl::PointXYZ> kdtree; // pcl::KdTreeFLANN<PointT, Dist>::setInputCloud (const PointCloudConstPtr &cloud, const IndicesConstPtr &indices)

//设置搜索空间

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 临近搜索

//创建一个整数(设置为10)和两个向量来存储搜索到的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;

}

/**********************************************************************************

下面的代码展示查找到给定的searchPoint的某一半径(随机产生)内所有近邻,重新定义两个向量

pointIdxRadiusSearch pointRadiusSquaredDistance来存储关于近邻的信息

********************************************************************************/

// 半径 R内近邻搜索方法

std::vector<int> pointIdxRadiusSearch;

//存储近邻索引

std::vector<float> pointRadiusSquaredDistance; //存储近邻对应距离的平方

float radius = 256.0f * rand () / (RAND_MAX 1.0f); //随机的生成某一半径

//打印输出

std::cout << "Neighbors within radius search at (" << searchPoint.x

<< " " << searchPoint.y

<< " " << searchPoint.z

<< ") with radius=" << radius << std::endl;

// 假设我们的kdtree返回了大于0个近邻。那么它将打印出在我们"searchPoint"附近的10个最近的邻居并把它们存到先前创立的向量中。

if ( kdtree.radiusSearch (searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0 ) //执行半径R内近邻搜索方法

{

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;

}

return 0;

}

可以看到输出结果说明我们的pcl库已经部署ok,并且可以正常使用。

1.首先编写代码到main.cpp文件内。

2.随后构建CmakeList.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(test)

find_package(PCL 1.13 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})

link_directories(${PCL_LIBRARY_DIRS})

add_definitions(${PCL_DEFINITIONS})

add_executable(test main.cpp)

target_link_libraries(test ${PCL_LIBRARIES})

3.编译

mkdir build

cd build

cmake ..

make

4.运行

会在build文件夹下生成可执行文件结果如下:

./test

运行成功,输出结果

随后等待继续理论学习。

0000
评论列表
共(0)条