PCL显示double类型的点云方案

news2024/9/29 23:29:46

前言

我们知道,PCL和OpenGL等三维可视化软件一样,为了兼顾性能需求,只支持加载Float类型的点云数据,但是当我们对精度要求太高时,Float类型支持不了我们的精度要求,我们的数据必须用Double类型存储才可以,要怎么解决呢?

解决方法 一

网上一个比较流行的解决方法是使用一个自定义的PCL数据类型 ,例如这样

// 自定义点云类型
namespace pcl
{
#define PCL_ADD_UNION_POINT4D_DOUBLE \
union EIGEN_ALIGN16 { \
        double data[4]; \
        struct { \
            double x; \
            double y; \
            double z; \
    }; \
};

struct _PointXYZDouble
{
    PCL_ADD_UNION_POINT4D_DOUBLE; // This adds the members x,y,z which can also be accessed using the point (which is float[4])

    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};

struct EIGEN_ALIGN16 PointXYZDouble : public _PointXYZDouble
{
    inline PointXYZDouble(const _PointXYZDouble& p)
    {
        x = p.x; y = p.y; z = p.z; data[3] = 1.0;
    }

    inline PointXYZDouble()
    {
        x = y = z = 0.0;
        data[3] = 1.0;
    }

    inline PointXYZDouble(double _x, double _y, double _z)
    {
        x = _x; y = _y; z = _z;
        data[3] = 1.0;
    }

    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
}

POINT_CLOUD_REGISTER_POINT_STRUCT(pcl::_PointXYZDouble,
                                  (double, x, x)
                                  (double, y, y)
                                  (double, z, z)
                                  )
POINT_CLOUD_REGISTER_POINT_WRAPPER(pcl::PointXYZDouble, pcl::_PointXYZDouble)

然后在加载点云时使用pcl::XYZDouble这个自定义类型即可。
但是这个有个弊端,因为我还要使用PCL的其他函数接口,例如鼠标点击事件的回调函数,这些函数不支持我自定义的数据格式,如果要完美适配我的自定义数据类型,需要大范围的修改源码才行,工作量巨大。

解决方法二

这里我参考了一个大名鼎鼎的点云显示软件:CloudCompare
当使用CloudCompare加载精度较大的点云时,会提示
在这里插入图片描述

这里我引入官方的解释:

在这里插入图片描述

大致意思就是:
因为CloudCompare和OpenGL都使用32位浮点值。与64位值相比,这允许增加速度和50%的存储器增益。然而,32位表示具有有限的分辨率,也就是精度。可以说,数字越大,可以存储的小数就越少。然而,如果在地理参考坐标系中表示的点坐标非常大,在这种情况下,数据表示精度上升到1或10厘米,32位浮点值支持不了这么高的精度,这就是为什么在CloudCompare中加载文件时“移动"点非常重要的原因。否则,原始精度将丢失。

它的移动规则也很简单, 默认情况下,CloudCompare尝试自动猜测最佳偏移向量(通常在加载文件时,CloudCompare将使用第一个点坐标作为偏移量)。后面的点都使用相同的偏移量。用TX、TY、 TZ 分别表示x、y、z坐标的偏移量,S表示倍数,LX、LY、LZ表示计算后的坐标,用公式表示就是:

L X = ( X + T X ) ∗ S L_X=(X+T_X)*S LX=X+TXS
L Y = ( Y + T Y ) ∗ S L_Y=(Y+T_Y)*S LY=Y+TYS
L Z = ( Z + T Z ) ∗ S L_Z=(Z+T_Z)*S LZ=Z+TZS

在CloudCompare中这个偏移量默认是以第一个坐标计算得到的,倍数默认为1倍。
偏移量计算的时候没有特定公式,我举几个例子大家应该就知道是怎么回事了。

  • 原始坐标是 1850351.79723,那么偏移量就是 -1850300,偏移后的坐标是51.79723
  • 原始坐标是 -1850351.79723,那么偏移量就是 1850300,偏移后的坐标是51.79723
  • 原始坐标是 446.100006,那么偏移量就是-400,偏移后的坐标是46.100006,当然由于这个坐标比较小,偏移量也可以设置为0.00,这样偏移后的坐标和原来一致。

为什么以第一个坐标计算偏移量呢?因为大部分情况下,我们的点云坐标都是非常非常密集的,坐标的最大值和最小值差距很小,使用第一个坐标计算得到的偏移量往往是适用于所有坐标的。当然你也可以取平均值来计算偏移量。计算的时候要根据具体的数据来确定偏移量的数量级,说了这些,大家应该都知道偏移量怎么计算了吧?

那么剩下的就简单了,我就可以在PCL读取我的数据的时候,先将原始的x、y、z坐标分别存放到三个double类型的变量中,然后根据我的数据情况,来分别确定x、y、z的偏移量的正负符号和数量级,最终分别得到我x、y、z的偏移量,然后让我全部的原始坐标加上这个偏移量即可。
原始坐标记得也要存放起来,这样就可以实现这样的效果:PCL可视化的点云坐标是我偏移后的坐标,鼠标点击显示的坐标是我的原始坐标,是不是很6😁

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

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

相关文章

Vue 3 开发中遇到的问题及解决方案(fix bug)

开发环境:mac系统,node版本: 16.15.0 版本兼容问题 vite v3.2.4 building for development... hasInjectionContext is not exported by node_modules/pinia/node_modules/vue-demi/lib/index.mjs, imported by node_modules/pinia/dist/pini…

【MySQL命令】show slave status\G 超详细全面解释

这个命令是DBA日常运维中常用来查看主从状态的命令,很多备份,监控工具也会使用到该命令监控主从状态是否正常,主从延迟,获取位点信息等。作为常用日常命令,一定要完全理解该命令的输出。今天主要结合 官方文档 和 实际…

AndroidStudio使用小技巧(持续更新中)

改过一次后,当时还记着;再拿起来,就忘记了。还是记下来吧。 使用鼠标滚轮设置文本的字体大小 左上角 File->Setting->Editor 启动时设置是否自动打开项目 老版本AS会有 Reopen last project on startup新版本AS有 Reopen projects o…

Stable Diffusion - High-Resolution Image Synthesis with Latent Diffusion Models

Paper name High-Resolution Image Synthesis with Latent Diffusion Models Paper Reading Note Paper URL: https://arxiv.org/abs/2112.10752 Code URL: https://github.com/CompVis/latent-diffusion TL;DR 2021 年 runway 和慕尼黑路德维希马克西米利安大学出品的文…

《从入门到精通:AJAX基础知识解析,前端开发中利器》基础篇

目录 学习目标: 学习目录: 学习时间: 学习内容: 什么是 AJAX? 怎么用 AJAX ? 认识 URL 协议 域名 资源路径 获取 - 新闻列表 URL 查询参数 axios-查询参数 常用请求方法和数据提…

【docker】镜像使用(Nginx 示例)

查看本地镜像列表 docker images删除本地镜像 # docker rmi [容器 ID]docker rmi a6bd71f48f68 查找镜像 docker search nginx 参数介绍 NAME: 镜像仓库源的名称DESCRIPTION: 镜像的描述OFFICIAL: 是否 docker 官方发布STARS: 点赞、喜欢AUTOMATED: 自动构建。 拉去镜像 …

动态雨滴个人主页导航页

资源入口 动态雨滴玻璃掉落主页,和之前的两个一个性质,css全部重构,canvas绘制的下雨背景,可以自己去换图片。 原版: 已二次开发(可添加多个导航格及自适应手机端) ------本页内容已结束&#x…

DHTMLX Suite v8.3发布!深化JavaScript UI小部件库使用体验

DHTMLX UI 组件库允许您更快地构建跨平台、跨浏览器 Web 和移动应用程序。它包括一组丰富的即用式 HTML5 组件,这些组件可以轻松组合到单个应用程序界面中。 DHTMLX Suite v8.3已于近日正式发布啦!这个更新附带了一组新特性和改进,旨在促进您…

销售技巧培训之如何提升网络销售技巧

销售技巧培训之如何提升网络销售技巧 随着互联网的普及,网络销售已经成为了一种重要的销售方式。对于许多企业来说,网络销售已经成为了一种重要的销售渠道。但是,要想在网络销售中取得成功,就需要掌握一些网络销售技巧。本文将介…

php 和 python 跨界 合作 phpy搭建 已解决

需求介绍 1、在日常功能开发中,难免会使用python的计算库,同时自己要是一名PHP开发工程师。就在最近有相应的需求,索性使用phpy来进行功能开发 安装 windows版本 phpy 是识沃团队最新推出的开源项目,目标是为 PHP 引入 Python 生…

『App自动化测试之Appium应用篇』| 元素定位工具uiautomatorviewer从简介、特点、启动到使用的完整过程

『App自动化测试之Appium应用篇』| 元素定位工具uiautomatorviewer从简介、安装、配置到使用的完整过程 1 uiautomatorviewer简介2 uiautomatorviewer特点3 uiautomatorviewer启用4 Work Bar5 Screenshot6 控件布局7 控件属性8 连接设备9 Error while obtaining UI问题排查 1 u…

客户端游戏开发者要不要学习服务端开发的相关技能?

引言 大家好,今天继续分享点个人经验。 玩过游戏的小伙伴都知道,游戏会有单机和联网之分。 单机游戏通常以高质量3A大作著称,它的特点是独立的运行环境,不受网络的限制。 联机游戏则以全球互联、实时同步以及社交互动等特点发…

2023.12.12 关于 Java 反射详解

目录 基本概念 定义 用途 反射相关的类 反射基本原理 Class 类中的相关方法 常用获得类相关的方法 常用获得类中属性相关的方法 常用获得类中构造器相关的方法 常用获得类中方法相关的方法 实例理解 反射优缺点 基本概念 定义 Java 的反射(reflection&a…

Unity 置顶OpenFileDialog文件选择框

置顶文件选择框 🌭处理前🥙处理后 🌭处理前 🥙处理后 解决方案

持续集成交付CICD:CentOS 7 安装SaltStack

目录 一、理论 1.SaltStack 二、实验 1.主机一安装master 2.主机二安装第一台minion 3.主机三安装第二台minion 4.测试SaltStack 一、理论 1.SaltStack (1)概念 SaltStack是基于python开发的一套C/S自动化运维工具,通信采用了zerom…

【谭浩强C语言:前八章编程题(多解)】

文章目录 第一章1. 求两个整数之和(p7) 第二章2. 求三个数中的较大值&#xff08;用函数&#xff09;(p14、p107)3.求123...n(求n的阶乘&#xff0c;用for循环与while循环)(P17)1.循环求n的阶乘2.递归求n的阶乘(n< 10) 4.有M个学生&#xff0c;输出成绩在80分以上的学生的学…

【JVM从入门到实战】(六)类加载器的双亲委派机制

一、双亲委派机制 在Java中如何使用代码的方式去主动加载一个类呢&#xff1f; 方式1&#xff1a;使用Class.forName方法&#xff0c;使用当前类的类加载器去加载指定的类。 方式2&#xff1a;获取到类加载器&#xff0c;通过类加载器的loadClass方法指定某个类加载器加载。 …

VR虚拟现实的七大应用领域

一、工业领域 园区利用虚拟现实技术优化生产管理与节能减排&#xff0c;实现提质增效降本。发展支持多人协作和模拟仿真的虚拟现实开放式服务平台&#xff0c;打通产品设计与制造环节&#xff0c;构建虚实融合的远程运维新型解决方案&#xff0c;适配各类先进制造技术的员工技…

Linux——MySQL数据库的使用

访问MySQL数据库 MySOL数据库系统也是一个典型的C/S&#xff08;客户端/服务器&#xff09;架构的应用&#xff0c;要访问MySOL数据库 需要使用专门的客户端软件&#xff0c;在Linux系统中&#xff0c;最简单、易用的MySQL.客户端软件是其自带的mysql 命令工具。 登录到MySQL服…

经典基本电路

USB电路 USB差分走线的阻抗为90欧:差分对10mil宽的走线以及5mil的间距,两边包地15/20mil以上厚度(SI9000计算阻抗) USB2.0接口电路&#xff1a; USB3.0接口电路&#xff1a; USB HUB电路: HDMI电路 HDMI差分走线的阻抗为100欧:差分对6mil宽的走线以及5mil的间距,两边包地15/20…