激光点云数据显示

激光点云数据显示系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章Python机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言激光点云数据显示一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言本章将介绍如何加载、俯视图显示激光点云数据,去除地面反射点云。所使用的是KITTI数据集,使用VelodyneHDL-64E机械旋转式激光雷达采集,旋转频率10Hz,一圈大概有100k点

Lidar系列文章

传感器融合是将多个传感器采集的数据进行融合处理,以更好感知周围环境;这里首先介绍激光雷达的相关内容,包括激光雷达基本介绍(本节内容),激光点云数据处理方法(点云数据显示与裁剪,点云分割,点云聚类,障碍物识别实例)等。

系列文章目录

1. 激光雷达基本介绍
2. 激光点云数据显示
3. 基于RANSAC的激光点云分割
4. 点云分割入门级实例学习
5. 激光点云目标物聚类
6. 基于PCL实现欧式聚类提取
7. 激光雷达障碍物识别



基于PCL的激光点云可视化实例

本小节主要介绍激光点云的可视化,主要利用PCL对道路的激光点云进行可视化。
本实例中首先实例化了一个含有RGB颜色的激光点云对象,然后将这个激光点云对象指针作为参数,传入PCL中的激光点云读取函数中,将激光点云文件读取到实例化的激光点云对象的指针中。接下来,实例化一个激光点云可视化对象viewer1,通过这个对象调用addPointCloud()方法。实例化的激光点云传入viewer1对象后,设置激光点云可视化窗口的背景颜色。

#include<pcl/visualization/pcl_visualizer.h>
#include<iostream>//标准C++库中的输入输出类相关头文件。
#include<pcl/io/io.h>
#include<pcl/io/pcd_io.h>//pcd 读写类相关的头文件。

using namespace std;
using namespace pcl;
typedef pcl::PointXYZI PointIoType;//对激光点云类型进行宏定义

int main(int argc, char** argv){ 
   
	pcl::PointCloud<PointIoType>::Ptr cloud(new pcl::PointCloud<PointIoType>());
	if (pcl::io::loadPCDFile("../data/simpleHighway.pcd", *cloud) == -1)
		return (-1);
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer1(new pcl::visualization::PCLVisualizer("3D Viewer"));
	viewer1->addPointCloud<PointIoType>(cloud, "simpleHighway.pcb");
	viewer1->setBackgroundColor(0, 0, 0);//设置可视化窗口的背景颜色为黑色
	while (!viewer1->wasStopped())//持久化显示激光点云图像
	{ 
   
		viewer1->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}

	return 0;
}

在这里插入图片描述

激光点云俯视图显示

本小节将介绍如何加载、俯视图显示KITTI数据集的激光点云数据,去除地面反射点云。KITTI激光点云数据采集使用Velodyne HDL-64E机械旋转式激光雷达采集,旋转频率10Hz,一圈大概有100k点云。

这里我们使用Point激光点云格式如下:

struct LidarPoint { 
    // single lidar point in space
    double x,y,z,r; // x,y,z in [m], r is point reflectivity
};

采集平台中,激光雷达与摄像头同步采集,该时刻摄像头采集的场景如下。
在这里插入图片描述
同一时刻激光点云采集图像如下图,包含Velodyne坐标系统和距离标记。俯视图中点云图像被裁剪至Lidar前部20m,实际可达78m。
在这里插入图片描述
以下代码示例中,我们首先加载了点云数据;为了更好的表现车辆前方的激光点云数据,我们将根据激光反射点的由近及远将颜色显示转换为由红变绿。
在这里插入图片描述
然后,去除地面反射点云,结果显示如下。
在这里插入图片描述

void showLidarTopview()
{ 
   
  std::vector<LidarPoint> lidarPoints;
  readLidarPts("./dat/C51_LidarPts_0000.dat",lidarpoints);
  
  cv::Size worldSize(10.0,20.0); //width and height of sensor field in m
  cv::Size ImageSize(1000,2000); //Corresponding top view in pixel
  
  //create topview image
  cv::Mat topviewImg(ImageSize, CV_8UC3, cv::Scalar(0,0,0));
  
  //plot Lidar points into image
  for (auto it=lidarPoints.begin();it!=lidarPoints.end();++it)
  { 
   
    float xw=(*it).x; //world position in m with x facing forward from sensor
    float yw=(*it).y; //world position in m with y facing left from sensor
    
    int y=(-xw*imageSize.height/worldSize.height)+imageSize.height;
    int x=(-yw*imageSize.width/worldSize.width)+imageSize.width/2;
    
    float zw=(*it).z; //height above road surface
    double minZ=-1.40;
    
    if(zw>minZ)
    { 
   
    float val=it->x;//distance in driving direction
    float maxVal=worldSize.height;
    int red=min(255,(int)(255*abs((val-maxVal)/maxVal)));
    int green=min(255,(int)(255*(1-abs((val-maxVal)/maxVal))));
    cv::circle(topviewImg, cv::Point(x,y),5,cv::Scalar(0,green,red),-1);    
    }
  }
  
  //plot distance markers
  float lineSpacing = 2.0; //gap between distance markers
  int nMarkers = floor(worldSize.height/lineSpacing);
  for (size_t i=0; i<nMarkers;++i)
  { 
   
    int y=(-(i*lineSpacing)*imageSize.height/wordSize.height)+imageSize.height;
    cv::line(topeviewImg,cv::Point(0,y),cv::Point(imageSize.width,y),cv::Scalar(255,0,0));
  }
  
  //display image
  string windowName="Top-View Perpestive of LiDAR data";
  cv::namedWindow(windowName,2);
  cv::imshow(windowName,topViewImg);
  cv::waitKey(0);//wait for key to be pressed
}

资源链接:激光点云数据显示

今天的文章激光点云数据显示分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/12983.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注