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

news2024/12/27 10:48:55

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

参考博客:
点云侠的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.coloradmin.cn/o/1273613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

揭示堆叠自动编码器的强大功能 - 最新深度学习技术

简介 在不断发展的人工智能和机器学习领域&#xff0c;深度学习技术由于其处理复杂和高维数据的能力而获得了巨大的普及。在各种深度学习模型中&#xff0c;堆叠自动编码器[1]作为一种多功能且强大的工具脱颖而出&#xff0c;用于特征学习、降维和数据表示。本文探讨了堆叠式自…

影视网站影视介绍评论网站

基于Boostrap的响应式电影网站影视网站移动技术应用开发一、考核要求1、考核内容本课程的成绩主要依据平时表现、文档、答辩&#xff08;设计讲解、操作演示等&#xff09;等方面评定。运用所学知识&#xff0c;独立设计并开发一个影视介绍评论网站&#xff0c;具体要求如下&am…

凯旋泥巴佬正式全面亮相,Triumph TF 250-X

之前给大家曝光过凯旋将要进军越野车领域&#xff0c;并且发动机和车架都已经造出来了&#xff0c;还要去参加赛事想要获得比赛的荣誉和名次&#xff0c;就在今日凯旋的一台越野车TF 250-X正式亮相&#xff0c;售价9995美元。 这是凯旋真正意义上的第一台竞赛级越野车&#xff…

特征选择的方法:包裹法之递归特征消除

1.递归特征消除法的基本原理 递归特征消除法是一种贪婪的优化算法&#xff0c;致力于通过反复创建模型的方式找到性能最佳的特征子集。 首先将筛选的K个特征作为初始特征子集&#xff0c;开展机器学习计算得到每个特征的重要性&#xff0c;利用交叉验证方法得到初始特征子集的…

智慧水务系统在流域水环境规划中起到什么作用?

智慧水务系统在流域水环境规划中扮演着越来越重要的角色。作为一款集信息化、自动化、智能化、智慧化于一体的水务管理系统&#xff0c;智慧水务系统不仅能够提高水环境规划的效率&#xff0c;还能为水资源的保护和利用提供有力支持。 在流域水环境规划中&#xff0c;智慧水务系…

Windows10设置定时提醒

文章目录 Windows10设置定时提醒创建提醒文件新建文本文档修改文件编码和后缀双击测试 创建文件夹创建任务测试运行 Windows10设置定时提醒 创建提醒文件 新建文本文档 修改文件编码和后缀 双击测试 创建文件夹 创建任务 创建触发器 选择程序 测试运行 弹窗正常

16.Oracle数据库Row_number() over()函数排序使用方法

1.原始数据(部分) SELECT * FROM SCOTT.EMP ; 2.使用Row_number() over() 函数,排序 SELECT EMPNO,ENAME,SAL,DEPTNO,Row_number() over( order by sal) rs FROM SCOTT.EMP ; 根据工资排序并添加序号 3.使用Row_number() over() 函数,分组并排序 SELECT EMPNO,ENAME,SAL,DEPTN…

深眸科技|AI+机器视觉加速进入工业制造,成为提升智能制造必选项

随着人工智能技术的飞速发展&#xff0c;AI视觉与机器视觉技术正在加速进入工业制造中。机器视觉技术赋予机器新活力与新智慧&#xff0c;不仅让机器实现精密工作的完成&#xff0c;还让其能够代替部分脑力活动&#xff0c;具有更高的智慧与能力。 深眸科技CEO周礼表示&#x…

自动伸缩:解密HPA、VPA、CA和CPA智能调整应用大小和数量

关注【云原生百宝箱】公众号&#xff0c;快速掌握云原生 Kubernetes提供了多种自动伸缩机制&#xff0c;例如HPA&#xff08;Horizontal Pod Autoscaling&#xff09;&#xff0c;可以根据不同情况动态调整Pod副本数量。此功能使 Pod 能够有效地处理当前流量&#xff0c;而无需…

Android启动系列之进程杀手--lmkd

本文概要 这是Android系统启动的第三篇文章&#xff0c;本文以自述的方式来讲解lmkd进程&#xff0c;通过本文您将了解到lmkd进程在安卓系统中存在的意义&#xff0c;以及它是如何杀进程的。&#xff08;文中的代码是基于android13&#xff09; 我是谁 init&#xff1a;“大…

P8A004-系统加固-磁盘访问权限

【预备知识】 访问权限&#xff0c;根据在各种预定义的组中用户的身份标识及其成员身份来限制访问某些信息项或某些控制的机制。访问控制通常由系统管理员用来控制用户访问网络资源&#xff08;如服务器、目录和文件&#xff09;的访问&#xff0c;并且通常通过向用户和组授予…

字节的“游戏心脏”,真的停止跳动了吗?

字节跳动在游戏行业的宏大叙事&#xff0c;终究变成了一场游戏一场梦。 近日&#xff0c;朝夕光年首次公开回应此前的裁员传闻&#xff0c;明确表示会有业务方向和组织调整&#xff0c;游戏业务将迎来大规模收缩&#xff0c;未来会更加聚焦部分创新型游戏及相关技术的探索。 …

管理类联考——写作——考点+记忆篇——论说文——记忆

文章目录 整体文字提炼/目录大纲法图像畅想/记忆宫殿法 审题立意论说文-历年真题命题类型总结 写作结构论说文-万能写作结构 分析段标题开头段结尾过渡段和措施段 整体 整体用记忆宫殿法、绘图记忆法等 文字提炼/目录大纲法 利用书本的目录、大纲&#xff0c;一本好书&#xff…

增加F110 付款方式的随手记录

随便记录一下&#xff0c;基本上有这些信息可以了 为了保持PRD与测试机一致的银行代码&#xff0c;需要先在DEV&#xff0c;QAS 改成4 外部给号 主要都是在FBZP 开户行维护-FI12_HBANK/FI12 S4hana 里面有的没有办法在FI12 维护只能去NWBC NWBC&#xff1a;维护银行账户并关联…

MatchPyramid实现文本匹配

引言 今天利用MatchPyramid实现文本匹配。 原论文解析→点此←。 MatchPyramid 核心思想是计算两段文本间的匹配矩阵&#xff0c;把它当成一个图形利用多层卷积网络提取不同层级的交互模式。 匹配矩阵是通过计算两段输入文本基本单元(比如字或词)之间相似度得到的&#xf…

Verilog 入门(三)(表达式)

文章目录 操作数操作符算术操作符关系操作符相等关系操作符逻辑操作符按位操作符条件操作符 操作数 操作数可以是以下类型中的一种&#xff1a; 常数参数线网寄存器位选择部分选择存储器单元函数调用 操作符 Verilog HDL中的操作符可以分为下述类型&#xff1a; 算术操作符…

a-select:远程搜索——防抖节流处理——基础积累

a-select:远程搜索——防抖节流处理——基础积累 效果图下拉筛选数据&#xff1a;远程搜索功能&#xff1a; 效果图 下拉筛选数据&#xff1a; <a-selectshow-searchv-model"form.jobPositionCode"placeholder"请选择岗位"style"width: 100%"…

改进LiteOS中物理内存分配算法(详细实验步骤+相关源码解读)

一、实验要求 优化TLSF算法&#xff0c;将Best-fit策略优化为Good-fit策略&#xff0c;进一步降低时间复杂度至O(1)。 优化思路&#xff1a; 1.初始化时预先为每个索引中的内存块挂上若干空闲块&#xff0c;在实际分配时避免分割&#xff08;split&#xff09;操作&#xff…

leetcode面试经典150题——34 有效的数独(矩阵)

题目&#xff1a; 有效的数独 描述&#xff1a; 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出…

加速产品成长:待完成工作框架如何改变游戏规则

待完成的工作 (JTBD) 框架旨在认识到客户心中有特定的目标&#xff0c;我们将这些目标称为工作。然后&#xff0c;客户“租用”产品或服务来帮助他们实现特定目标。该产品成为客户试图完成的工作的解决方案。如果一种产品或服务有效地帮助客户实现目标&#xff0c;他们就更有可…