点云的处理

news2024/9/22 1:36:15

一、激光点云

       激光点云指的是由三维激光雷达设备扫描得到的空间点的数据集,每一个点云都包含了三维坐标(XYZ)和激光反射强度(Intensity),其中强度信息会与目标物表面材质与粗糙度、激光入射角度、激光波长以及激光雷达的能量密度有关。

 

上述自定义数据包中的自定义点云(CustomPoint)格式 :

uint32 offset_time      # offset time relative to the base time
float32 x               # X axis, unit:m
float32 y               # Y axis, unit:m
float32 z               # Z axis, unit:m
uint8 reflectivity      # reflectivity, 0~255
uint8 tag               # livox tag
uint8 line              # laser number in lidar

 Livox雷达驱动程序发布点云格式CustomMsg、PointCloud2、pcl::PointXYZI、pcl::PointXYZINormal解析_代码多少钱一两的博客-CSDN博客

二、基于python的点云相加及保存

2.1 两个单独点云

 
# coding:utf-8
import open3d as o3d
import numpy as np
 
# --------------------------- 加载点云 ---------------------------
print("->正在加载点云... ")
pcd1 = o3d.io.read_point_cloud("lidar1.pcd")
pcd2 = o3d.io.read_point_cloud("lidar2.pcd")
 
print("原始点云pcd1:", pcd1)
print("原始点云pcd2:", pcd2)
 
pcd_all = pcd2 + pcd1
print("原始点云pcd_all:", pcd_all)
# ==============================================================
o3d.visualization.draw_geometries([ pcd_all], window_name="wechat 394467238 ")
path_new = '/home/nvidia/LVI_ws/src/r3live_tools/calib/pcds/final_4.pcd'
o3d.io.write_point_cloud(path_new, pcd_all)

2.2 文件夹下所有点云相加

 
# coding:utf-8
import open3d as o3d
import numpy as np
import glob
import os
import shutil
import sys


def find_glob(pathname):
    # type:(str) -> list
    """Find files by glob."""
    files = glob.glob(pathname)
    if len(files) > 0:
        return files
    else:
        print("Error: " + pathname + " is not found")
        exit()
# --------------------------- 加载点云 ---------------------------
print("->正在加载点云... ")
pcd_dir = "/home/nvidia/LVI_ws/src/r3live_tools/calib/pcds/"
pcd_files = find_glob(pcd_dir + "out_*.pcd")
print(len(pcd_files))
pcd_all=o3d.io.read_point_cloud(pcd_files[0])
for i in range(1,len(pcd_files)):
    print(pcd_files[i])
    pcd_dir_single = pcd_files[i]
    pcd= o3d.io.read_point_cloud(pcd_dir_single)
    print("原始点云pcd:", pcd)
    pcd_all=pcd_all+pcd

print("原始点云pcd_all:", pcd_all)
# ==============================================================
o3d.visualization.draw_geometries([ pcd_all], window_name="wechat 394467238 ")
path_new = '/home/nvidia/LVI_ws/src/r3live_tools/calib/pcds/final_5.pcd'
o3d.io.write_point_cloud(path_new, pcd_all)

存在的问题:该点云相加的方法,没有办法完成强度信息的载入,对激光雷达进行相加会丢失轻度信息。

三、基于c++的点云相加

3.1 简单的点云的输出

CMakeLists.txt

cmake_minimum_required(VERSION 2.6)

project(pcl_test)

find_package(PCL REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})

link_directories(${PCL_LIBRARY_DIRS})

add_definitions(${PCL_DEFINITIONS})

add_executable(pcl_test pcl_test.cpp)

target_link_libraries (pcl_test ${PCL_LIBRARIES})

install(TARGETS pcl_test RUNTIME DESTINATION bin)

pcl_test.cpp

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

 
int main (int argc, char** argv)
{
  pcl::PointCloud<pcl::PointXYZ> cloud;
 
  // Fill in the cloud data
  cloud.width    = 5;
  cloud.height   = 1;
  cloud.is_dense = false;
  cloud.points.resize (cloud.width * cloud.height);
 
  for (size_t i = 0; i < cloud.points.size (); ++i)
  {
    cloud.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
    cloud.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
    cloud.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
  }
 
  pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud);
  std::cerr << "Saved " << cloud.points.size () << " data points to test_pcd.pcd." << std::endl;
 
  for (size_t i = 0; i < cloud.points.size (); ++i)
    std::cerr << "    " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << std::endl;
 
  return (0);
}

2.2 带强度信息的点云的读取和保存

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>//pcd 读写类相关的头文件。
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>//PCL中支持的点类型头文件。
#include <boost/thread/thread.hpp>


using namespace std; 


void viewerOneOff(pcl::visualization::PCLVisualizer& viewer)
{
    viewer.setBackgroundColor(0.0, 0.5, 0.0);//设置背景颜色
}
int main (int argc, char** argv)
{
  typedef pcl::PointXYZI PointType;
  typedef pcl::PointCloud<PointType> PointCloud;
  std::string filename = "/home/nvidia/LVI_ws/src/r3live_tools/calib/pcds/out_1681117387928485.pcd";
  std::string pcd_file = "/home/nvidia/LVI_ws/src/r3live_tools/calib/pcds/01.pcd";
  PointCloud::Ptr cloud_in(new PointCloud);
  //pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
  if (-1 == pcl::io::loadPCDFile<PointType>(filename, *cloud_in))
  {
      std::cout << "Load pcd file fail!" << std::endl;
      return -1;
  }
  std::cout << cloud_in->points.size() << std::endl;
  pcl::PCDWriter writer;
  writer.write(pcd_file, *cloud_in); 
  std::cout << "从点云数据中读取: " << (*cloud_in).width * (*cloud_in).height <<
        "字节,数据中所包含的有效字段为: " << pcl::getFieldsList(*cloud_in) << std::endl;
  std::cout << (*cloud_in).points.size() << std::endl;
  // pcl::visualization::CloudViewer viewer("First Cloud Viewer");
  // viewer.showCloud(cloud_in);//显示
  // viewer.runOnVisualizationThreadOnce(viewerOneOff);
  // std::cout << "PCL Test OK!\n";
 
}

 

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

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

相关文章

基于imx8m plus开发板全体系开发教程3:Ubuntu 20.04 编译

前言&#xff1a; i.MX8M Plus 开发板是一款拥有 4 个 Cortex-A53 核心&#xff0c;运行频率 1.8GHz;1 个 Cortex-M7 核心&#xff0c;运行频率 800MHz;此外还集成了一个 2.3 TOPS 的 NPU&#xff0c;大大加速机器学习推理。 全文所使用的开发平台均为与NXP官方合作的FS-IMX8…

websorm启动vue项目修改内容后自动运行内存溢出

手动启动vue项目正常运行&#xff0c;修改部分内容保存后会自动重新run一下&#xff0c; 这个时候就报错内存溢出&#xff0c;然后很悲伤的需要再手动重启一下。 &#xff08;在网上查了好多方法就不单独加链接了&#xff09; 前3个方法都试过对于我的项目无效&#xff0c;第4…

017 - C++ 中的静态(static)

本期我们将讨论 C 中的 static&#xff08;静态&#xff09;。 static 关键字在 C 中有两个意思&#xff0c;这个取决于上下文。 简单了解 第一种情况是在类或结构体外部使用 static 关键字&#xff0c;另一种是在类或者结构体内部使用 static。 基本上我们可以这样理解&am…

背包问题基础与应用

背包问题 理论基础 01背包 背包中的每个物品只能用一次 物品编号重量价值物品1115物品2320物品3430 定义&#xff1a;dp[i][j]表示从下标0-i的物品中任取&#xff0c;放进容量为j的背包的最大价值 初始化&#xff1a; dp [[0] * (bag_size 1) for _ in range(len(weigh…

Java程序内存占用优化实践

目录背景堆内存调整内存还会继续上涨减少线程数量TomcatDubboLogback野线程背景 上了微服务的当&#xff0c;喜欢将服务各种拆分&#xff0c;公有云模式下服务器比较多&#xff0c;还能玩得转。到了私有化部署&#xff0c;有的客户连个技术人员都没有&#xff0c;只想一键启动…

java——《面试题——基础篇》

1、 Java语言有哪些特点 1、简单易学、有丰富的类库 2、面向对象&#xff08;Java最重要的特性&#xff0c;让程序耦合度更低&#xff0c;内聚性更高&#xff09; 3、与平台无关性&#xff08;JVM是Java跨平台使用的根本&#xff09; 4、可靠安全 5、支持多线程 2、面向对象…

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCVSharp实现Mono12和Mono16位深度的图像保存(C#)

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCVSharp实现Mono12和Mono16位深度的图像保存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机保存位深度12/16位图像的技术背景代码案例分享1&#xff1a;引用合适的类文件2&#xff1a;BGAPI SDK在图像回调中联合O…

【GCU体验】基于PaddlePaddle + GCU跑通模型并测试GCU性能

一、环境 地址&#xff1a;启智社区:https://openi.pcl.ac.cn/ 二、计算卡介绍 云燧T20是基于邃思2.0芯片打造的面向数据中心的第二代人工智能训练加速卡&#xff0c;具有模型覆盖面广、性能强、软件生态开放等特点&#xff0c;可支持多种人工智能训练场景。同时具备灵活的可…

STM32理论 —— 定时器、时钟

文章目录 1. 定时器1.1 分类与简介1.1.1 分类与主要功能特点1.1.2 三种常用的定时器简介1.1.3 三种计数模式1.1.4 定时器计数原理 1.2 时钟来源1.3 通用定时器简介1.4 计数溢出时间公式1.4 定时器中断的原理1.5 输入捕获1.6 核心代码1.6.1 通用定时器初始化1.6.2 高级定时器初始…

【Python_Scrapy学习笔记(十三)】基于Scrapy框架的图片管道实现图片抓取

基于Scrapy框架的图片管道实现图片抓取 前言 本文中介绍 如何基于 Scrapy 框架的图片管道实现图片抓取&#xff0c;并以抓取 360 图片为例进行展示。 正文 1、Scrapy框架抓取图片原理 利用 Scrapy 框架提供的图片管道类 ImagesPipeline 抓取页面图片&#xff0c;在使用时需…

领域驱动设计理论实践

战略设计 战略设计是将“混沌”解构成“清晰”的过程&#xff0c;在该过程从开始到结束的历程之中&#xff0c;我们会划分出领域、界定通用语言范围、确定出系统限界上下文以及上下文之间的映射方式。 领域划分 战略设计在领域驱动设计中起着关键作用&#xff0c;因为其决定了…

使用Bazel构建前端Sass

注&#xff1a;本文假设对Bazel有一定的了解。本文基于Bazel 4.2.2 版本 在web前端领域&#xff0c;前端样式&#xff0c;web浏览器只认CSS样式语言。而CSS样式语言又过于低级。于是有人发明了更高级的语言&#xff1a;Sass[1]&#xff0c;用于生成CSS代码。 这样的方案&#x…

【C++】队列模拟问题

文章目录队列模拟问题12.7.1 ATM问题12.7.2 队列类12.7.3 Queue类的接口12.7.4 **Queue类的实现**12.7.5 是否需要其他函数&#xff1f;12.7.6 Customer类queue.hqueue.cpp12.7.7 ATM模拟main.cpp队列模拟问题 12.7.1 ATM问题 Heather银行打算在Food Heap超市开设一个自动柜员…

【C++STL精讲】vector的基本使用与常用接口

文章目录&#x1f490;专栏导读&#x1f490;文章导读&#x1f337;vector是什么&#xff1f;&#x1f337;vector的基本使用&#x1f337;vector常用函数接口&#x1f490;专栏导读 &#x1f338;作者简介&#xff1a;花想云&#xff0c;在读本科生一枚&#xff0c;致力于 C/C…

HAL库版FreeRTOS(上)

目录 FreeRTOS 简介初识FreeRTOS什么是FreeRTOS?为什么选择FreeRTOS&#xff1f;FreeRTOS 的特点商业许可 磨刀不误砍柴工查找资料FreeRTOS 官方文档Cortex-M 架构资料 FreeRTOS 源码初探FreeRTOS 源码下载FreeRTOS 文件预览 FreeRTOS 移植FreeRTOS 移植移植前准备添加FreeRTO…

浏览器断点调试说明

断点调试 断点调试面板 功能按钮介绍 描述&#xff1a;继续执行脚本 或者叫&#xff08;逐过程执行&#xff09; 快捷键 &#xff08;F8&#xff09;或者是&#xff08;Ctrl\&#xff09; 作用&#xff1a;打断点了的地方&#xff08;比如有是三个断点地方&#xff09;就会 第一…

大数据能力提升项目|学生成果展系列之四

导读 为了发挥清华大学多学科优势&#xff0c;搭建跨学科交叉融合平台&#xff0c;创新跨学科交叉培养模式&#xff0c;培养具有大数据思维和应用创新的“π”型人才&#xff0c;由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

13.vue-cli

单页面应用程序&#xff1a;所有的功能只在index.html中完成 vue-cli是vue版的webpack 目录 1 安装vue-cli 2 创建项目 3 使用预设 4 删除预设 5 开启项目 6 项目文件内容 6.1 node_moduls 中是项目依赖的库 6.2 public 6.2.1 favicon.ico 是浏览器页签内部…

尚融宝——整合OpenFeign与Sentinel实现兜底方法——验证手机号码是否注册功能

一、整合过程 在项目添加依赖&#xff1a;添加位置 <!--服务调用--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> 在需要的服务中添加启动注…

spring中常见的注解

DI(依赖注入中常见的注解) Autowired&#xff1a;按类型自动装配Resource&#xff1a;按名称或类型自动装配&#xff0c;Qualifier&#xff1a;按名称自动装配&#xff0c;Value &#xff1a;注入int、float、String等基本数据类型&#xff0c;只能标注在成员变量、setter方法上…