利用pcl库实现简单单帧障碍物检测

#include <iostream>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/console/parse.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/crop_box.h>
#include <Eigen/Core>
#include <Eigen/Dense>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/segmentation/extract_clusters.h>
#include <pcl/filters/extract_indices.h>
#include <string>
using namespace std;//聚类函数
std::vector<pcl::PointCloud<pcl::PointXYZI>::Ptr> Clustering(pcl::PointCloud<pcl::PointXYZI>::Ptr cloud, float clusterTolerance, int minSize, int maxSize)
{//创建一个tree对象pcl::search::KdTree<pcl::PointXYZI>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZI>); //创建一个KDtree//将点云数据按照tree的方式进行存储,方便后续遍历tree->setInputCloud(cloud);std::vector<pcl::PointIndices> cluster_indices;pcl::EuclideanClusterExtraction<pcl::PointXYZI> ec;ec.setClusterTolerance(clusterTolerance);ec.setMinClusterSize(minSize); //设置一个类别里面最小点云数ec.setMaxClusterSize(maxSize); //设置一个类别里面最大点云数ec.setSearchMethod(tree);      //采用KDtree的寻找方法ec.setInputCloud(cloud);ec.extract(cluster_indices);std::vector<pcl::PointCloud<pcl::PointXYZI>::Ptr> clusters; //创建一个保存点云指针的容器//这个容器里面保存的都是聚集的小类点云for (pcl::PointIndices getIndices : cluster_indices){typename pcl::PointCloud<pcl::PointXYZI>::Ptr cloudCluster(new pcl::PointCloud<pcl::PointXYZI>);for (int index : getIndices.indices)cloudCluster->points.push_back(cloud->points[index]);cloudCluster->width = cloudCluster->points.size();cloudCluster->height = 1;cloudCluster->is_dense = true;clusters.push_back(cloudCluster);}return clusters;
}struct Box //创建一个红色的矩形框
{float x_min;float y_min;float z_min;float x_max;float y_max;float z_max;
};Box BoundingBox(pcl::PointCloud<pcl::PointXYZI>::Ptr cluster)
{// Find bounding box for one of the clusterspcl::PointXYZI minPoint, maxPoint;pcl::getMinMax3D(*cluster, minPoint, maxPoint);Box box;box.x_min = minPoint.x;box.y_min = minPoint.y;box.z_min = minPoint.z;box.x_max = maxPoint.x;box.y_max = maxPoint.y;box.z_max = maxPoint.z;return box;
}int main(int argc, char **argv)
{std::cout << "Test PCL !!!" << std::endl;pcl::PointCloud<pcl::PointXYZI>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZI>);pcl::io::loadPCDFile(argv[1], *cloud);cout << "滤波前点数量:" << cloud->size() << endl;pcl::VoxelGrid<pcl::PointXYZI> sor;pcl::PointCloud<pcl::PointXYZI>::Ptr cloudFiltered(new pcl::PointCloud<pcl::PointXYZI>);sor.setInputCloud(cloud);sor.setLeafSize(0.1f, 0.1f, 0.1f);sor.filter(*cloudFiltered); //体素滤波之后的数据保存在cloudFiltered里面cout << "滤波后点数量:" << cloudFiltered->size() << endl;//下面操作会保留箱子内的点// typename pcl::PointCloud<pcl::PointXYZI>::Ptr cloudRegion(new pcl::PointCloud<pcl::PointXYZI>);// pcl::CropBox<pcl::PointXYZI> region(true);// region.setMin(Eigen::Vector4f(-1.5, -1.7, -1, 1));// region.setMax(Eigen::Vector4f(2.6, 1.7, -0.4, 1));// region.setInputCloud(cloudFiltered);// region.filter(*cloudRegion);pcl::PointIndices::Ptr inliers(new pcl::PointIndices());// TODO:: Fill in this function to find inliers for the cloud.pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());pcl::SACSegmentation<pcl::PointXYZI> seg;seg.setOptimizeCoefficients(true);seg.setModelType(pcl::SACMODEL_PLANE);seg.setMethodType(pcl::SAC_RANSAC);seg.setMaxIterations(1000);seg.setDistanceThreshold(0.2);seg.setInputCloud(cloudFiltered);seg.segment(*inliers, *coefficients); // inliers里面保存的估计是平面点if (inliers->indices.size() == 0){std::cout << "could not find a plane model for the given dataset." << std::endl;}pcl::PointCloud<pcl::PointXYZI>::Ptr planeOrObsCloudPtr(new pcl::PointCloud<pcl::PointXYZI>);//提取平面点,下面如果设置为tree的话可能是提取除了平面所有的点pcl::ExtractIndices<pcl::PointXYZI> extract;extract.setInputCloud(cloudFiltered);extract.setIndices(inliers);extract.setNegative(true);           //提取传入索引外的点,false就是默认,会提取默认索引内的点extract.filter(*planeOrObsCloudPtr); //提取的结果//创建一个容器用来保存聚类之后的点云std::vector<pcl::PointCloud<pcl::PointXYZI>::Ptr> VecAftClu = Clustering(planeOrObsCloudPtr, 0.5, 50, 10000);cout << "一共聚类为多少簇:" << VecAftClu.size() << endl;std::vector<Box> VecBox;for (int i = 0; i < VecAftClu.size(); i++){VecBox.push_back(BoundingBox(VecAftClu[i])); //获取每一个聚类的矩形框}// AABB外接立方体pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);viewer->addCoordinateSystem(0.1);viewer->initCameraParameters();//根据点云的intensity给点云上色pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZI> intensity_distribution(cloud, "intensity");viewer->addPointCloud<pcl::PointXYZI>(cloud, intensity_distribution, "sample cloud");//直接显示普通的点云则就根据下面// viewer->addPointCloud<pcl::PointXYZI>(planeOrObsCloudPtr, "sample cloud");std::vector<std::string> name;for (int i = 0; i < VecBox.size(); i++){name.push_back(to_string(i));}for (int i = 0; i < VecBox.size(); i++){//下面是设置目标包围框的一些属性,包括包围框的颜色,包围框的不透明度等等//下面设置的是包围框的线条的属性viewer->addCube(VecBox[i].x_min, VecBox[i].x_max, VecBox[i].y_min, VecBox[i].y_max, VecBox[i].z_min, VecBox[i].z_max, 1.0, 0.0, 0.0, to_string(i), 0);//第一句话表示添加的立方体只显示线框viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME, to_string(i));//设置立方体的颜色属性viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1.0, 0.0, 0.0, to_string(i));//设置立方体的不透明度属性viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, 0.5, to_string(i)); //设置不透明度这个属性为0.5//下面是设置包围框面的属性std::string cubeFill = "boxFill" + std::to_string(i);// viewer->addCube(box.bboxTransform, box.bboxQuaternion, box.cube_length, box.cube_width, box.cube_height, cubeFill);viewer->addCube(VecBox[i].x_min, VecBox[i].x_max, VecBox[i].y_min, VecBox[i].y_max, VecBox[i].z_min, VecBox[i].z_max, 1.0, 0.0, 0.0, cubeFill);viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_SURFACE, cubeFill);//surface表示表面viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1.0, 0.0, 0.0, cubeFill);//表面的颜色viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, 0.5 * 0.3, cubeFill);//表面的不透明度}while (!viewer->wasStopped()){viewer->spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));}// pcl::visualization::CloudViewer viewer("test");// viewer.showCloud(planeOrObsCloudPtr);// while (!viewer.wasStopped())// {// };return 0;
}

CMakeLists.txt文件

cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
project(pcl_test)find_package(PCL 1.2 REQUIRED)
#include_directories( "/usr/include/eigen3")include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})add_executable(pcl_test pcl_test.cpp)
target_link_libraries (pcl_test ${PCL_LIBRARIES})install(TARGETS pcl_test RUNTIME DESTINATION bin)

结果显示
懒得去调整里面的一些参数了,主要是为了学习pcl库,来实现简单的小demo,本文的代码主要是根据一个网上的代码改动的,具体哪一个找不到了。

利用pcl库实现简单单帧障碍物检测相关推荐

  1. 利用PCL库做简单的三维立体图形

    利用PCL库画简单的三维立体图形需要知道各种图形的参数方程,然后给每个参数赋值便可以. 圆柱面的参数方程为:x = R*cos(θ); y = R*sin(θ); z = z;其中 θ范围是[-2*P ...

  2. 利用PCL库从点云数据生成深度图像及关键点提取

    利用PCL库从点云数据生成生成深度图像及关键点提取 利用PCL库从点云数据生成深度图像及关键点提取 本想利用标准点云数据库分割成若干块,利用标准点云数据生成深度图像作为数据库用来验证算法,目前效果不是 ...

  3. 利用PCL库构建Mesh三维模型

    从两张任意拍摄的一对图像(得有大部分重合面积)和相机内参矩阵开始,重建出基于Mesh的三维模型,美观又实用,还不赶快学起来.本文也是记录一下自己学习过程,废话较多,请多包涵,主要代码已注释,请自行下载 ...

  4. python的turtle怎么画曲线_利用 turtle库绘制简单图形

    turtle库是python的基础绘图库,这个库被介绍为一个最常用的用来介绍编程知识的方法库,其主要是用于程序设计入门,是标准库之一,利用turtle可以制作很多复杂的绘图. turtle名称含义为& ...

  5. matlab 生成zc序列,利用zc序列进行简单的帧同步

    嵌牛导读:帧同步有起止式同步法和插入特殊同步码组法两种.,为了能正确分离各路时隙信号,在发送端必须提供每帧的起始标记,在接收端检测并获取这一标志的过程称为帧同步 嵌牛鼻子:帧同步 zc序列 嵌牛提问: ...

  6. 利用zc序列进行简单的帧同步

    帧同步 zc序列的产生 同步算法 参考文章 https://wenku.baidu.com/view/accce6d1240c844769eaeea9.html zc序列的产生 产生zc序列,根据论文 ...

  7. STM32CubeIDE 利用LL库 SysTick简单实现hcsr04超声波测距

    一.超声波测距模块简介(网络摘取) HC-sr04是一款典型的超声波测距模块,升级版的程序和04的差别不大,只是测量范围和精度有所不同. 它是如何工作的? 超声波传感器使用声纳来确定到物体的距离.以下 ...

  8. 利用Seaborn库进行简单的画图

    Seaborn练习 练习题 代码 效果图 小结 练习题 代码 import seaborn as sns import pandas as pd from matplotlib import pypl ...

  9. 利用Pandas库进行简单的数据规整

    Pandas练习4-数据规整 练习题 练习1 练习2 练习3 练习4 练习1 代码 效果图 练习2 代码 效果图 练习3 代码 效果图 练习4 代码 效果图 小结 练习题 练习1 练习2 练习3 练习 ...

最新文章

  1. 盘点程序员写过的惊天Bug:亏损30亿、致6人死亡,甚至差点毁灭世界
  2. Springmvc ajax请求400
  3. caffe使用过程中遇到的一些问题错误
  4. OpenCASCADE绘制测试线束:拓扑命令之基本拓扑
  5. [C/C++基础知识] 面试再谈struct和union大小问题
  6. CodeForces - 1370F2 The Hidden Pair (Hard Version)(交互题+二分)
  7. 图的广度优先算法+遍历
  8. linux下安装 Sublime Text 3
  9. Javascript图形处理库 -- Raphaël
  10. java代码行数_Java统计代码行数
  11. 实验楼挑战:备份日志
  12. marlab中主成分得分怎么求_PCA(主成分分析) 和 SVD (奇异值分解)
  13. 公众号采集文章插件下载-支持各大网站自动采集发布的公众号插件
  14. vue项目中引入vuex------初试
  15. 三元一次方程组例题_50道三元一次方程组计算题及答案过程
  16. 计算2个拼音的相似度 PHP版本
  17. scanf与getchar的区别
  18. 深入理解C++的new
  19. 小晶粒zsm分子筛合成表征实验报告_小晶粒ZSM-5分子筛的合成
  20. ssm后台管理系统-04

热门文章

  1. [文摘201009]演讲录全文:美国世界帝国战略与中国的危机 - 戴旭
  2. cad放大_CAD制图初学入门常见问题秘笈,助你摆脱节后综合症!(上)
  3. USB媒体设备端口绑定(以海康会议摄像头为例)
  4. 协作设计: 如何有效提高团队合作的工作效率?
  5. 在Kali中 利用工具Fluxion渗透wpa/wpa2加密WiFi 详细步骤(小白适用) 2020.1
  6. 传智黑马Java第6期
  7. Dual Self-Attention Network (DSANet)
  8. NB-IoT标准及其介绍
  9. 学土木的考计算机二级的什么好些,学土木适合考计算机二级考什么?
  10. linux 动态库系统目录,Linux操作系统:指定动态库(.so)搜索路径(4)