学习记录PCL-1 通过哈希表进行三维点云的虚拟格网划分

直接对整个场景的点云进行特征提取,效果很差,因此通过划分区域格网进行划分。格网划分有很多种方式,在这里尝试使用哈希表进行格网链接,后续通过在每个格网内基于点云特征进行提取。

参考博客:
点云侠的PCL 点云分块_pcl 点云按网格分块_点云侠的博客-CSDN博客

点云学徒的PCL点云处理之创建二维格网组织点云数据(六十四)_哈希表 c++ pcl 点云_点云学徒的博客-CSDN博客

使用了c++的哈希表代替了的qt库中哈希表


代码如下:

#include <iostream>
#include <fstream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/pca.h>
#include <pcl/common/common.h>
#include <unordered_map>
#include <list>
#include <functional>
#include <cstdlib>
#include <pcl/point_cloud.h>using namespace std;
using namespace Eigen;int main(int argc, char** argv) {// 定义点云容器pcl::PointCloud<pcl::PointXYZI>::Ptr PC(new pcl::PointCloud<pcl::PointXYZI>);  // 原始点云容器// 读入原始点云if (pcl::io::loadPCDFile<pcl::PointXYZI>("iScan.pcd", *PC) == -1) {cout << "打开失败" << endl;return false;}// 根据原始点云坐标最值创建格网pcl::PointXYZI minPt, maxPt;  // 存储点云最值int RowNum = 2;               // 格网的行数int ColNum = 2;               // 格网的列数pcl::getMinMax3D(*PC, minPt, maxPt);cout << " 格网创建完成 " << endl;// 哈希表存储点云unordered_map<unsigned int, pcl::PointCloud<pcl::PointXYZI>> Point2dHash;  // 存放点云的二维哈希表list<unsigned int> no_empty_List;                                          // 判断二维格网内部是否有点的链表 将有点格网对应的哈希号存储进去int row, col;                                                               // 点云对应的格网行、列号size_t TempIndex;                                                           // 哈希键  意思就是将二维索引变成一维索引for (size_t Index = 0; Index < PC->points.size(); Index++) {// 计算点云所在的行、列row = int(RowNum * (PC->points[Index].x - minPt.x) / (maxPt.x - minPt.x));col = int(ColNum * (PC->points[Index].y - minPt.y) / (maxPt.y - minPt.y));// 防止越界row = max(0, min(row, RowNum - 1));col = max(0, min(col, ColNum - 1));TempIndex = row * ColNum + col;if (find(no_empty_List.begin(), no_empty_List.end(), TempIndex) == no_empty_List.end()) {no_empty_List.push_back(TempIndex);}Point2dHash[TempIndex].push_back(PC->points[Index]);}cout << " 哈希表完成 " << endl;// 显示每个格网内的点云数量for (const auto& entry : no_empty_List){size_t count = Point2dHash[entry].size();cout << "Grid[" << entry << "] has " << count << " points." << endl;}// 将每个格网内的点云合并保存为新的点云文件pcl::PointCloud<pcl::PointXYZI>::Ptr resultCloud(new pcl::PointCloud<pcl::PointXYZI>);for (const auto& entry : no_empty_List) {if (!Point2dHash[entry].empty()) {*resultCloud += Point2dHash[entry];}}// 将每个格网内的点云合并保存为新的点云文件 pcd格式有坐标偏移的现状pcl::PCDWriter writer;string base_path = "G:\\test\\";  // 指定基本路径for (const auto& entry : no_empty_List) {if (!Point2dHash[entry].empty()) {string file_path = base_path + "result_cloud_grid_" + to_string(entry) + ".pcd";writer.write<pcl::PointXYZI>(file_path, Point2dHash[entry], true);cout << "Grid[" << entry << "] saved to " << file_path << endl;}}return 0;
}

​​​​​运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/235784.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库管理-第119期 记一次迁移和性能优化(202301130)

数据库管理-第119期 记一次迁移和性能优化&#xff08;202301130&#xff09; 1 迁移 之前因为DV组件没有迁移成功的那个PDB&#xff0c;后来想着在目标端安装DV组件迁移&#xff0c;结果目标端装不上&#xff0c;而且开了SR也没看出个所以然来。只能换一个方向&#xff0c;尝…

虚假IP地址攻击的溯源方法

随着网络技术的迅速发展&#xff0c;网络攻击行为也日益猖獗。其中&#xff0c;虚假IP地址攻击是一种较为常见的网络攻击方式&#xff0c;它利用虚假的IP地址&#xff0c;通过互联网对目标进行攻击和入侵。这种攻击方式不仅难以追踪&#xff0c;而且往往会给企业和个人带来巨大…

迭代实现二叉树的遍历

关卡名 理解树的前中后序遍历&#xff0c; 以及如何基于迭代方式实现 我会了✔️ 内容 1.迭代实现二叉树树的前序遍历 ✔️ 2.迭代实现二叉树的中序遍历 ✔️ 3.迭代实现二叉树的后序遍历 ✔️ 理论上&#xff0c;递归能做的迭代一定能做&#xff0c;但可能会比较复杂。上…

CentOS7.5搭建Hadoop-3.3.6集群的详细操作流程-实操版本

一、准备工作 1、安装 VMware&#xff0c;已安装的&#xff0c;跳过此步骤即可 官方正版VMware下载&#xff08;16 pro&#xff09;&#xff1a;https://www.aliyundrive.com/s/wF66w8kW9ac 安装&#xff1a;选一下安装地址&#xff0c;一直下一步即可。&#xff08;可能会要…

MIT_线性代数笔记:第 10 讲 四个基本子空间

目录 四个子空间 Four subspaces基和维数 Basis& Dimension新向量空间 New vector space 本讲讨论矩阵的四个基本子空间以及他们之间的关系。 四个子空间 Four subspaces 任意的 m x n 矩阵 A 都定义了四个子空间。 列空间 Column space C(A) 矩阵 A 的列空间是 A 的列向…

深度学习(三):pytorch搭建卷积神经网络

1.常用函数介绍 0 设备准备 device torch.device("cuda:0" if torch.cuda.is_available() else "cpu")这行代码是用来选择设备的&#xff0c;根据是否有可用的 CUDA 设备来选择使用 GPU 还是 CPU 进行计算。 更详细的解释如下&#xff1a; torch.cuda.…

3.Ansible的file模块,我最常用的文件操作

1.file 模块的用法 1.1 官方概念 Set attributes of files, symlinks or directories. Alternatively, remove files, symlinks or directories. Many other modules support the same options as the file’ module - including [copy], [template], and [assemble]. For Wi…

机械臂仿真之vrep如添加视觉传感器

基于视觉的机械臂作业任务&#xff0c;如何在vrep中加入视觉传感器&#xff0c;并获取画面&#xff1f;

Linux常用命令——pwd命令

文章目录 简介pwd命令的参数常见用法及实例1. 基本用法2. 使用 -P 参数3. 使用 -L 参数注意事项 结论 简介 pwd&#xff08;Print Working Directory&#xff09;是Linux和Unix系统中的一个常用命令&#xff0c;用于显示当前工作目录的完整路径。这个命令对于定位用户当前所在…

centos7下执行yum命令报错

前言 在Linux系统中&#xff0c;安装nginx时候&#xff0c;需要先安装环境。 Nginx是使用C语言开发&#xff0c;安装nginx需要先从官网上将源码下载&#xff0c;然后编译&#xff0c;编译需要gcc环境,但是在安装gcc环境的时候&#xff0c;执行命令报错。 yum install –y gcc-…

【驱动】串口驱动分析(一)-软件架构

区分不同的终端类型 串行端口终端&#xff08;/dev/ttySn&#xff09; 串行端口终端&#xff08;Serial Port Terminal&#xff09;是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。 有段时间这些串行端口设备通常被称为终端设备&#xff0…

快速了解ChatGPT(大语言模型)

目录 GPT原理&#xff1a;文字接龙&#xff0c;输入一个字&#xff0c;后面会接最有可能出现的文字。 GPT4 学会提问&#xff1a;发挥语言模型的最大能力 参考李宏毅老师的课快速了解大语言模型做的笔记&#xff1a; Lee老师幽默的开场&#xff1a; GPT&#xff1a;chat Ge…