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

2023-11-30 22:36

本文主要是介绍学习记录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;
}

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

这篇关于学习记录PCL-1 通过哈希表进行三维点云的虚拟格网划分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/438807

相关文章

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

mysql查询使用_rowid虚拟列的示例

《mysql查询使用_rowid虚拟列的示例》MySQL中,_rowid是InnoDB虚拟列,用于无主键表的行ID查询,若存在主键或唯一列,则指向其,否则使用隐藏ID(不稳定),推荐使用ROW_NUM... 目录1. 基本查询(适用于没有主键的表)2. 检查表是否支持 _rowid3. 注意事项4. 最佳实

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项