【点云抽稀】一种基于均匀分布随机数的点云抽稀算法

news2024/11/19 7:46:01

文章目录

  • 1. 背景
  • 2. 原理
  • 3. 实现
    • 3.1 定义Utils类
    • 3.2 加入预定义宏,确定层级
    • 3.3 函数实现

1. 背景

在大数据点云的存储中,常常要进行空间分区,一般的策略是构建四叉树或者八叉树。在构建树的过程中,一个不可避免的点就是点云的快速抽稀。

不同层级之间,下一层的数据永远比上一层的数据更加精细,即:上一层数据是从下一层通过某种抽稀算法筛选出来的。常规意义上的抽稀算法,是在内存中进行筛选,但由于大数据点云的特殊性(无法全部读进内存),这些抽稀算法均不满足要求,存在一下问题:

  1. 无法全部读进内存,因此抽稀之后不同分块(分块策略是前提)的效果不一;
  2. 抽稀效率比较低,需要预先将数据读进内存,再进行分层筛选;

某项目中,需要将*.las转换成自定义格式,其转换速率要求很高。而由于las文件在使用LASTools读写时,只能逐点读取,因此需要一种既能解决上述问题,又能保证效率的抽稀算法。

本文介绍的抽稀算法,原理上是利用伪随机数的均匀分布来实现,但同时能兼顾效率和效果。其局限性如下:

  1. 随机数表是存储在内存中,因此数据量过大的情况下,内存占用可能会很高;
  2. 抽稀效率随C++标准库的随机数生成算法影响;
  3. 数据量很小的时候,存在某层数据为空的可能;

2. 原理

基于以下出发点:

  1. 每读一个点,能立即得到该点所属层级——las的逐点读限制;
  2. las文件只需读一次,就能得到抽稀结果——O(n),n为点数;
  3. 保证抽稀结果均匀——加入随机数;

对于第一点,将las文件中的顶点数据,类比成一个存储了顶点的数组:

vvvvvvvvvvvvvvvv

LASTools的读操作器每一次读取的时候,都会将游标移到下一个点。对每一个点来说,本身并没有层级信息,因此需要人为地赋予其层级。

计算层级可以类比分类游戏:一堆小球从入口进入,中间穿插阻碍棒,最终落到容器内:
分类游戏
而将红色小球理解为点云的顶点,将下面的容器理解为结果,则中间的蓝色小球是我们的抽稀算法。

核心原理就是,每次获取一个随机数,这个随机数的值就是当前点所在的层级。而随机数的范围,就是按照n叉树的层级点数比例,计算出来的一个值。具体实现见后文。

3. 实现

3.1 定义Utils类

class Utils
{
private:
    Utils(int lvl);
    ~Utils();

public:
    static Utils &instance();
    int getLayer();

protected:
    char *m_lvl;
    int m_l;
};

3.2 加入预定义宏,确定层级

#ifndef DEFAULT_LEVEL_COUNT
#define DEFAULT_LEVEL_COUNT 7
#endif

3.3 函数实现

const std::size_t g_num[10] = {
    1, 4, 16, 64, 256, 1024, 4096, 16384, 65536, 262144};
const std::size_t g_sum[10] = {
    1,
    1 + 4,
    1 + 4 + 16,
    1 + 4 + 16 + 64,
    1 + 4 + 16 + 64 + 256,
    1 + 4 + 16 + 64 + 256 + 1024,
    1 + 4 + 16 + 64 + 256 + 1024 + 4096,
    1 + 4 + 16 + 64 + 256 + 1024 + 4096 + 16384,
    1 + 4 + 16 + 64 + 256 + 1024 + 4096 + 16384 + 65536,
    1 + 4 + 16 + 64 + 256 + 1024 + 4096 + 16384 + 65536 + 262144,
};

Utils::Utils(int lvl)
{
    m_lvl = new char[g_sum[lvl - 1]];

    std::size_t idx = 0;
    for (int i = 0; i < lvl; ++i)
    {
        std::size_t tms = g_num[i];
        // for (int j = 0; j < tms; ++j)
        // {
        //     m_lvl[idx + j] = (char)i;
        // }
        std::fill_n(m_lvl + idx, tms, (char)i);
        idx += tms;
    }
    m_l = lvl;
}

Utils::~Utils()
{
    delete[] m_lvl;
}

Utils &Utils::instance()
{
    static Utils s_ret(DEFAULT_LEVEL_COUNT);
    return s_ret;
}

int Utils::getLayer()
{
    static std::default_random_engine s_dre;
    static std::uniform_int_distribution<unsigned long> s_uid(g_sum[0], g_sum[m_l - 1]);

    return (int)(m_lvl[s_uid(s_dre)]);
}

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

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

相关文章

Text, Shapes, Colors 的使用

1. Text 的使用 // 多行文本 // Hello, World! This is the Swiftful Thinking Bootcamp. I am really enjoying this course and learning alot.// .lowercased() 文字小写 .uppercased() 文字大写 capitalized: 以单词形式显示 Text("Hello, World!".capitalized)…

test123

import matplotlib.pyplot as plt import pandas as pd # 从Power BI中获取输入数据 data pd.DataFrame({ Country: [USA, Canada, UK, Germany, France], Population: [328, 38, 66, 83, 67] }) # 使用Matplotlib绘制图表 plt.bar(data[Country], data[Population]…

Sentinel的另外三种流控模式(附代码详细介绍)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将详细介绍Sentinel的其他三种流控模式&#xff0c;后续文章将详细介绍Sentinel的其他知识。 如果文章有什么需要改进的地方还请大佬不吝赐教&#x1f44f;&#…

轻量应用服务器如何选择之阿里云和腾讯云PK哪个好?

阿里云和腾讯云都有轻量应用服务器&#xff0c;轻量服务器是一种轻量级开箱即用的云服务器&#xff0c;适合小型网站、博客或测试等单机应用&#xff0c;那么问题来了&#xff0c;轻量应用服务器到底是阿里云好还是腾讯云好&#xff1f;阿腾云来详细对比下阿里云轻量应用服务器…

find命令的结果顺序

文章目录 1. 目的2. 准备&#xff1a; 克隆 doxygen 源码3. ubuntu22.04 结果4. ubuntu16.04 结果5. git bash 结果6. 三路比较7. 保持一样的结果&#xff1a; 用自然排序8. References 1. 目的 在研读 doxygen 源码时&#xff0c; 在不同电脑、不同操作系统上使用了 find 命令…

vue2中provide/inject的使用

一般来说&#xff0c;组件之间有以下几种关系&#xff1a; A-B、A-C、B-D、B-E、C-F都是父子关系&#xff0c;B-C、D-E-F是兄弟关系&#xff0c;A-D、A-E、A-F是祖先与孙子关系。 vue2中provide/inject这对选项需要一起使用&#xff0c;以允许一个祖先组件向其所有子孙后代注…

私有化部署即时通讯工具能为企业提升工作沟通效率吗?

在疫情的影响下&#xff0c;越来越多的企业开始采用私有化部署的方式部署即时通讯工具&#xff0c;以提升工作沟通效率。私有化部署的即时通讯工具&#xff0c;能够为企业提供完善的人员管理、安全保障、灵活便捷等优势&#xff0c;帮助企业更好地管理人员、团队协作以及工作沟…

CAMx-Python融合技术与大气污染来源解析方法

详情点击链接&#xff1a;CAMx-Python融合技术应用与大气污染来源解析方法 CAMx模型是一个基于大气化学&#xff0c;针对臭氧、颗粒物和雾霾天气过程的大气污染物计算模型。 1、CAMx模式的区域空气质量模拟配置技术&#xff1b; 2、SMOKE模型的CAMx模式大气排放清单输入准备&…

Kubernetes 二进制部署高可用集群 失败 看报错

概述 openssl证书有问题导致失败&#xff0c;未能解决openssl如何创建私钥&#xff0c;可参考ansible 在私有局域网内完成Kubernetes二进制高可用集群的部署 ETCD Openssl > ca 证书 Haproxy Keepalived Kubernetes 主机规划 序号名字功能VMNET 1备注 1备注 2备注 3 备注…

拉线位移传感器可以用来做的工作

拉线位移传感器可以用来做的工作 拉线位移传感器&#xff0c;是做什么的呢&#xff1f;是测位移的一种传感器&#xff0c;它的使用方式是用拉线测量&#xff0c;所以我们又叫它拉线位移传感器或者拉绳位移传感器。 拉绳位移传感器的应用非常广泛&#xff0c;一般只要精度要求不…

Docker issue failed to solve: rpc error: code = unknown desc

完整错误&#xff1a;failed to solve: rpc error: code Unknown desc failed to solve with frontend dockerfile.v0: failed to create LLB definition: unexpected status code [manifests 8.0-alpine-v3.14-swoole]: 403 Forbidden 解决方案一 重启DockerDesktop或重新启…

JavaScript全解析-继承

继承 ●要知道什么是继承 ●要知道继承的方式有哪些 ●每种的继承方式是如何实现的 什么是继承 ●继承关系出现在构造函数和构造函数之间 ●当构造函数A 的实例使用了 构造函数B 的属性和方法 ●我们就说 构造函数A 继承自 构造函数B ○管 构造函数A 叫做子类 ○管 构造函数B 叫…

MATLAB算法实战应用案例精讲-【数模应用】生存曲线(补充篇)

目录 前言 几个相关概念 生存概率与死亡概率 生存率 生存曲线 事件、生存时间 中位生存时间 生存率的比较 生存数据 风险集 如何读懂KM曲线 应用案例 新药对患者总生存时间的影响-KM曲线 软件操作及结果解读 应用GraphPad Prism制作生存曲线 SPSS绘制生存曲线图 …

gRPC-go参数功能介绍1->WithBlock参数介绍

在gRPC-go框架中&#xff0c;当客户端使用 Dial() 方法连接到gRPC服务器时&#xff0c;可以使用 WithBlock() 选项来阻塞客户端&#xff0c;直到与服务器建立连接成功。 通常情况下&#xff0c;当客户端调用 Dial() 方法时&#xff0c;该方法会立即返回&#xff0c;并在后台异…

使用MinIO文件存储系统【完成图片上传保存】业务逻辑

目录 1&#xff1a;业务流程 2&#xff1a;接口实现 controller层 service层 1&#xff1a;业务流程 步骤一&#xff1a;前端进入上传图片的界面 步骤二&#xff1a;上传图片&#xff0c;请求到后端的媒资管理服务模块 步骤三&#xff1a;媒资管理服务将图片文件存储到m…

STM32---编写呼吸灯串口发送ON开LED,发送OFF关LED或者0X550X440XFF表示开灯,0X550X660XFF表示关灯

编写呼吸灯串口发送ON开LED&#xff0c;发送OFF关LED或者&#xff08;0X550X440XFF表示开灯&#xff0c;0X550X660XFF表示关灯&#xff09;注&#xff1a;包头 0X55 包尾&#xff1a;0XFF 数据&#xff1a;0X44表示开灯 0X66表示关灯 用到了重定向 //printf的重定向 int fpu…

使用SSD会提高游戏性能或FPS吗?

​“我在考虑要不要给电脑换个SSD&#xff0c;现在旧电脑上的HDD快满了&#xff0c;正好我也喜欢打游戏&#xff0c;听说换SSD可以提高电脑性能以及游戏FPS&#xff0c;这是真的吗&#xff1f;如果是真的&#xff0c;那我怎么样可以把旧硬盘上的数据迁移到新硬盘呢&#xff1f;…

【Web3.0大势所趋】下一代互联网的未来

前言 Web3.0 是一个越来越受到关注的话题&#xff0c;它被认为将会带来天翻地覆的变化。本文我们一起来谈谈 Web3.0 的概念、特点和优势&#xff0c;并探讨它为什么如此重要和具有革命性的。 文章目录 前言Web3.0是什么区块链技术智能合约总结 Web3.0是什么 Web3.0: 是下一代互…

达梦数据库的安装DM8

文章目录 一、达梦数据库的安装1、环境需求2、达梦的官方安装文档3、达梦数据库的安装包下载3.1、DM8的下载3.2、DM7的下载 4、开始操作4.1、使用xftp传dm8到虚拟机里4.2、下载依赖包4.3、拷贝dm8的iso文件到指定目录&#xff0c;并挂载4.4、创建DM安装用户和安装用户组并初始化…

提前熟知领英被限制被封因素,避免踩坑

领英在什么情况下容易被封 01.同一个人注册使用多个领英帐号。 02.多个人共同使用同一个领英帐号。 03.虚假资料注册领英账号&#xff0c;常见于注册领英账号的时候初始姓名随便填写或胡编乱造&#xff0c;注册时使用了网络虚拟的手机号码或邮箱等。 04.领英帐号的个人档案资料…