处理点云数据(六):点云分割

2023-10-27

展示了如何在三维激光雷达数据中检测地平面和发现附近的障碍物。

clear;clc;
%%
% for img_idx = 181:446
%     fid = fopen(sprintf('D:/KITTI/data_set/2011_09_26/2011_09_26_drive_0009_sync/velodyne_points/data/%010d.bin',img_idx),'rb');
%     velo = fread(fid,[4 inf],'single')';
%     velo = velo(:,1:3); % 取前三列x y z
%     a = pointCloud(velo);
%     pcloud(img_idx-180).ptCloud = a;
%     fclose(fid);
% end
%% 
load pcloud.mat

%%选择要显示的点云
% 为了突出周围的环境, 车辆, 集中在一个地区的利益, 横跨20米左右的车辆, 40 米的前面和后面的车辆。
pc = pcloud(60).ptCloud;

% 设置感兴趣区域(单位米)
xBound  = 40; 
yBound  = 20; 
xlimits = [-xBound, xBound];
ylimits = [-yBound, yBound];
zlimits = pc.ZLimits;

player = pcplayer(xlimits, ylimits, zlimits);

% 裁剪指定范围内的点云
indices = find(pc.Location(:, 2) >= -yBound ...
             & pc.Location(:, 2) <=  yBound ...
             & pc.Location(:, 1) >= -xBound ...
             & pc.Location(:, 1) <=  xBound);

% 将裁剪到的点显示出来
pc = select(pc, indices);
view(player, pc)

%% 分割地平面和附近障碍物
% 找到地面平面并移除地面平面点。使用RANSAC算法检测和匹配地面平面。
% 平面的法线方向应大致沿 Z 轴向上指向。所有 inlier 点必须在地面平面的20厘米以内。

maxDistance = 0.2; % in meters
referenceVector = [0, 0, 1];
[~, inPlanePointIndices, outliers] = pcfitplane(pc, maxDistance, referenceVector);

%%
% 将颜色标签附加到点云中的每个点。使用绿色显示地面平面和红色的障碍, 在10米的激光雷达传感器。
labelSize   = [pc.Count, 1];
colorLabels = zeros(labelSize, 'single');

% 设置用于标记点的颜色表。
colors = [0 0 1; ...  % 蓝色为未标记的点(0 0 1); 指定为[R,G,B]
          0 1 0; ...  % 绿色的为地面平面点(0 1 0)
          1 0 0; ...  % 红色的为障碍点(1 0 0)
          0 0 0];     % 黑色的为自我车辆点(0 0 0)

blueIdx  = 0; % 整个点云最初是蓝色的
greenIdx = 1;
redIdx   = 2;
blackIdx = 3;

% 标出地平面点。
colorLabels(inPlanePointIndices) = greenIdx;

% 选择不属于地平面一部分的点。
pcWithoutGround = select(pc, outliers);

%% 检索半径在15米以内的点, 并将它们标记为障碍物。
sensorLocation   = [0,0,0]; % 将激光雷达传感器放在坐标系的中心
radius           = 15;      % in meters

nearIndices  = findNeighborsInRadius(pcWithoutGround, sensorLocation, radius);    
nearPointIndices = outliers(nearIndices);

% 标记障碍物点
colorLabels(nearPointIndices) = redIdx;

%% 分割自我车辆
% 激光雷达通常安装在车辆的顶部, 数据可能包含车辆本身的点, 如屋顶和引擎盖。
% 这些都不是障碍物,但是最接近激光雷达传感器。在包含车辆的小半径内检索点。
% 使用这些点来形成一个轴对齐的边界立方体来表示自我车辆。
radius      = 2; % in meters
nearIndices = findNeighborsInRadius(pcWithoutGround, sensorLocation, radius);

vehiclePointIndices = outliers(nearIndices);
pcVehicle           = select(pcWithoutGround, nearIndices);

%% 形成一个包围立方体和标签的自我车辆点。
delta = 0.1;
selfCube = [pcVehicle.XLimits(1)-delta, pcVehicle.XLimits(2)+delta ...
            pcVehicle.YLimits(1)-delta, pcVehicle.YLimits(2)+delta ...
            pcVehicle.ZLimits(1)-delta, pcVehicle.ZLimits(2)+delta];

colorLabels(vehiclePointIndices) = blackIdx;

%% 将所有标记的点绘制到点云播放器中。使用前面设置的数字颜色标签。
colormap(player.Axes, colors)
points1 = pc.Location;
% points1(inPlanePointIndices, :) = [];
view(player, points1, colorLabels);
title(player.Axes, 'Segmented Point Cloud');

%% 处理点云序列
% for k = 2:length(pcloud)
%     pc = pcloud(k).ptCloud;    
% 
%     % Crop the data to ROI.
%     indices = find(pc.Location(:, 2) >= -yBound ...
%                  & pc.Location(:, 2) <=  yBound ...
%                  & pc.Location(:, 1) >= -xBound ...    
%                  & pc.Location(:, 1) <=  xBound);
%     pc = select(pc, indices);
%     
%     colorLabels = zeros(pc.Count, 1, 'single'); % create label array
%     
%     % Fit the ground plane.
%     [~, inPlanePointIndices, outliers] = pcfitplane(pc, maxDistance, referenceVector);    
%     colorLabels(inPlanePointIndices) = greenIdx;
% 
%     pcWithoutGround = select(pc, outliers);
%     
%     % Find the points corresponding to obstacles
%     radius           = 10; % in meters
%     nearIndices      = findNeighborsInRadius(pcWithoutGround, sensorLocation, radius);    
%     nearPointIndices = outliers(nearIndices);
%     
%     colorLabels(nearPointIndices) = redIdx;
% 
%     % Find the ego-vehicle points.
%     nearIndices         = findPointsInROI(pcWithoutGround, selfCube);
%     vehiclePointIndices = outliers(nearIndices);
%     
%     colorLabels(vehiclePointIndices) = blackIdx;
%     
%     % Plot the results.
%     view(player, pc.Location, colorLabels);
% end

结果如下图:
1

  1. 绿色部分为使用RANSAC(随机采样一致)算法检测和匹配到的地面平面。
  2. 红色部分为半径15米内的障碍物
  3. 蓝色为未标记的点

去除蓝色和绿色部分如图:
2

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

处理点云数据(六):点云分割 的相关文章

随机推荐

  • Python中数组切片[:2],[1:],[2::-1]

    一维数组 一个参数 a i 返回与该索引相对应的单个元素 两个参数 b a i j i缺省时默认为0 即 a n 代表列表中的第一项到第n项 j缺省时默认为len alist 即a m 代表列表中的第m 1项到最后一项 当i j都缺省时 a
  • 电力系统

    欢迎来到本博客 目前更新 电力系统相关知识 期刊论文 算法 机器学习和人工智能学习 支持 如果觉得博主的文章还不错或者您用得到的话 可以关注一下博主 如果三连收藏支持就更好啦 这就是给予我最大的支持 本文目录如下 目录 1 概述 2 数学模
  • 使用chatGPT + AI 绘图生成自己的专属头像

    案例介绍 微信头像是朋友认识我们时的第一印象 或许是可爱 妖娆 或许是帅气 成熟 还有自然 厚重 调皮 我们都有自己独特的故事 独特的思想 独特的爱好 对于头像当然有着自己独到的设计眼光 接下来请允许我向大家展示如何使用chatGPT AI
  • 手把手教你独立完成毕业设计程序!

    又到一年毕业季 大多数计算机院校的毕业生需要开发出一个小项目来完成自己的毕业设计 大学没认真学 代码不是很会写 有一定基础 那么毕业设计程序的确很让人头疼 很多人开始通过各种方式来获取毕业设计程序代码 自己懂的 其实我们花点时间做出所谓毕业
  • 如何通俗理解设计模式及其思想?

    本文由玉刚说写作平台提供写作赞助 原作者 却把清梅嗅 版权声明 本文版权归微信公众号玉刚说所有 未经许可 不得以任何形式转载 术与道 数据结构 算法 设计模式被认为是程序员必备技能的三叉戟 如果说编程语言的语法特性和业务编码能力是 术 那么
  • 【SSH】~/.ssh/config 基本配置

    Host example com HostName 203 0 113 1 Port 2222 User myusername IdentityFile ssh id rsa 下面是一些常见的配置选项 HostName 指定要连接的远程主机
  • React 4 种状态类型及 N 种状态管理

    React 是一个视图层框架 其核心思想是 UI f state 即 UI 是 state 的投影 state 自上而下流动 整个 React 组件树由 state 驱动 当一个 React 应用程序足够复杂 组件嵌套足够深时 组件树中的状
  • VUE前后分离调起微信支付

    第一步 VUE 需要安装 微信支付模块 npm install weixin js sdk 加入需要引入的模块 import wx from weixin js sdk 第二步 封装 微信支付方法 wexinPay data cb erro
  • ssh实现ubuntu免密登录

    生成公钥和私钥 ssh keygen 按三下ENTER 公私钥默认保存在 ssh 文件夹中 cd ssh 发送公钥给另一台电脑 ssh copy id 用户名 ip 然后通过ssh链接就不需要输入密码了
  • .PLY文件格式剖析(二)

    在很多书上介绍的三维图形数据都是 obj 3ds格式 dxf等格式的 真正讲解如何读取的就只有 obj格式文件的 但是我现在所做的内容 要求从 ply文件中读取初始塞维图形数据 这我就不会了 虽然对 ply文件格式有了了解 Ply文件格式是
  • Android GB28181接入端实时位置订阅和上报之-如何获取当前经纬度

    我们在做Android平台GB28181的时候 其中实时位置 MobilePosition 订阅和上报这块 涉及到实时经纬度的获取 特别是执法记录 车载系统的那个等场景 几乎就是标配 今天主要是分享一段实时获取位置的代码 CameraPub
  • 详解Ubuntu配置VSCode+CMake的C++开发环境

    搬运自详解Ubuntu18 04配置VSCode CMake的C 开发环境 Python技术站 原文写18 04 亲测20 04也能用 学slam十四讲的宝宝可以用这个方法去跑一下里面的代码 本文将会介绍如何在Ubuntu 配置VSCode
  • (一)Python数据类型

    1 字符串 使用单引号 使用双引号 使用三引号 2 布尔类型 bool False bool True 3 整数 int 20 4 浮点数 float 2 3 5 数字 int x base 将x转换为一个整数 float x 将x转换到一
  • C++递推经典案例No.3——爬楼梯的最小代价

    数组的每个下标作为一个阶梯 第 i 个阶梯对应着一个非负数的体力花费值 cost i 下标从 0 开始 每当爬上一个阶梯都要花费对应的体力值 一旦支付了相应的体力值 就可以选择向上爬一个阶梯或者爬两个阶梯 请找出达到楼层顶部的最低花费 在开
  • 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见 https blog csdn net mrcrack article details 86501716 信息学奥赛一本通 C 版 刷题 记录 http ybt ssoier cn 8088 http blog csdn net
  • C++:主要的关联容器类型:map

    目录 1 关联式容器 2 键值对 3 树形结构的关联式容器 4 map的特点 5 使用map 常用接口的使用 1 find 2 insert 3 erase 4 operator 6 multimap 1 关联式容器 与vector lis
  • KEIL - 下载调试出现“TRACE HW not present”

    使用st link调试遇到烧写完成之后不能进入调试状态 提示TRACE HW not present 点击确认 提示错误 Erron target DLL has been cancelled Debugger aborted 解决办法 第
  • 基于springboot开发项目架构之FastDFS

    fastDSF介绍 FastDFS是用c语言编写的一款开源的分布式文件系统 它是由淘宝资深架构师余庆编写并开源 FastDFS专为互联网量身定制 充分考虑了冗余备份 负载均衡 线性扩容等机制 并注重高可用 高性能等指标 使用FastDFS很
  • Centos 7 归档和压缩文件

    1 tar命令进行文件的归档和压缩 1 1归档和压缩 归档和压缩文件的好处 节约硬盘的资源 加快文件传输速率 tar命令的作用就是打包 压缩文件 用法 tar 选项 压缩成文件的名称 源文件名称 例如 tar czvf passwd tar
  • 处理点云数据(六):点云分割

    展示了如何在三维激光雷达数据中检测地平面和发现附近的障碍物 clear clc for img idx 181 446 fid fopen sprintf D KITTI data set 2011 09 26 2011 09 26 dri