1.open3d处理点云数据的常见方法

news2025/5/24 13:18:54

1. 点云的读取、可视化、保存

在这里是读取的点云的pcd文件,代码如下:

import open3d as o3d


if __name__ == '__main__':

    #1.点云读取
    point= o3d.io.read_point_cloud("E:\daima\huawei\img\change2.pcd")
    print("====>",point)
    
    #2.点云可视化
    o3d.visualization.draw_geometries([point])

    # 4.保存点云
    o3d.io.write_point_cloud("1.pcd", point, write_ascii=True)

2. 常见的点云处理方法

2.1 显示点云法向量

代码如下:

  #3.显示法向量
  
  radius=0.01 # 搜索半径
  max_nn=30 # 邻域内用于估算法线的最大点数
 
  pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius,max_nn))
  o3d.visualization.draw_geometries([pcd],window_name="o3d",width=1920,height=1080,
                                  #left=50,top=50,point_show_normal=True)

2.2 素体质心下采样

       原理:体素下采样(Voxel downsampling)采用规则体素格网从输入点云中创建分布均匀的下采样点云,是许多点云处理任务的预处理步骤。该算法主要分为两步:创建指定大小(分辨率)的体素网络;当点云中至少有一个点落在某个体素内,则认为该体素被占用,体素的颜色(属性)是该体素内所有点的平均值。

计算如下:

代码如下:

downpcd = point.voxel_down_sample(voxel_size=0.05)#voxel_size表示体素网格的距离,对该距离范围内的所有点求平均值,即为密度为1的质心
o3d.visualization.draw_geometries([downpcd])

2.3 点云的正态分布

原理:离散的数据匹配,包括图像,点云等数据,很难基于匹配的连续的评估函数,使之难以匹配到一个可微的优化框架中求解。为了解决该问题,我们希望能够为离散的数据形式建立一个相对连续的表示形式,并得到连续可导的评价函数。基于此,NDT被提出。其具体步骤为:

1). 将离散数据划分在不同的区域中;

2). 在每一个区域,求中点:

3). 计算子区域中基于每一个点到中点差值的协方差矩阵:

4). 得到针对于离散数据的NDT表示形式N,具体表示为:

可以看到,NDT的形式是一个基于概率分布的表示形式。下图给出一个直观的示例,来实现对NDT的可视化。

之前我们提到,之所以建立这样一种形式,是为了得到一个针对匹配评估的一个连续的函数形式,以方便建立优化。基于NDT的表示形式,这个评估函数就能够被构建:

Score代表我们希望得到的评估函数,p是自变量,也是匹配希望获得的变换矩阵。与ICP一致,p由旋转与平移组成:

整个NDT算法的步骤可以精简为6步:

1). 对一个点云P1或图像建立其NDT表示形式;

2). 初始化参数p(赋0或某一个间隔数据);

3). 将另外一个准备匹配的点云P2或图像的点按照p变换;

4). 计算Score (xi为P2的一个点,xi‘为xi经过p变换后的位置),如果满足退出条件,则退出;

5). 使用牛顿法建立对p的更新;

6). Loop step 3。

在交互页面,可以通过N查看点法线,+,-控制法线长度。

作为点云的基本操作之一,点云正态估计通过指定算法参数估测每个点可能的法向量,estimate_normals查找指定搜索半径内的临近点,通过这些临近点的协方差计算其主轴,从而估计法向量。正常情况下会产生两个方向相反的法向量,在不知道几何体的全局结构下,两者都可以是正确的。Open3D会尝试调整法线的方向,使其与原始法线对齐。

代码如下:

downpcd.estimate_normals(
        search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
    o3d.visualization.draw_geometries([downpcd],
                                      zoom=0.3412,
                                      front=[0.4257, -0.2125, -0.8795],
                                      lookat=[2.6172, 2.0475, 1.532],
                                      up=[-0.0694, -0.9768, 0.2024],
                                      point_show_normal=True)

2.4 引导滤波

原理:引导滤波 Guilter Filter:主要作用是消除或减少噪声,同时保留对目标有用的关键信息。引导滤波器通常会利用一部分已经分类或者标记的点云数据(通常被称为“引导点”或“引导数据”)来指导滤波过程,通过优化这些引导点的分布来达到滤波的效果。这种方法可以有效地减少滤波过程中的噪声,同时保留对目标有用的关键信息。
具体来说,引导滤波器可以用于以下情况:

1.减少噪声:引导滤波器通过利用一部分已知的、可靠的点云数据来指导滤波过程,可以有效地减少噪声的影响,提高点云的精度和准确性。
2.简化数据结构:引导滤波器可以自动地选择并删除不重要的点,从而简化点云数据结构,降低数据处理和分析的难度。
3.提高特征提取的准确性:引导滤波器可以通过去除无关或冗余的点,提高后续特征提取的准确性,从而更好地进行3D物体识别、检测和建模等任务。

代码如下:

import open3d as o3d
import numpy as np


if __name__ == '__main__':
    # 1.首先读取原始点云和求异点云
    point= o3d.io.read_point_cloud("E:\daima\huawei\img\change2.pcd",remove_nan_points=True,remove_infinite_points=True)
    point2 = o3d.io.read_point_cloud("1.pcd", remove_nan_points=True,
                                    remove_infinite_points=True)

    dist = point2.compute_point_cloud_distance(point)
    idx = [i for i, distance in enumerate(dist) if distance > 0.5]

    # 最后将点云中相同的部分和不同的部分分别取出来进行显示
    same_part = point2.select_by_index(idx)
    diff_part = point2.select_by_index(idx, invert=True)
    same_part.paint_uniform_color([0, 0, 1])
    diff_part.paint_uniform_color([1, 0, 0])
    o3d.visualization.draw_geometries([same_part, diff_part])
    

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

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

相关文章

SpringMVC(一)【入门】

前言 学完了大数据基本组件,SpringMVC 也得了解了解,为的是之后 SpringBoot 能够快速掌握。SpringMVC 可能在大数据工作中用的不多,但是 SSM 毕竟是现在就业必知必会的东西了。SpringBoot 在数仓开发可能会经常用到,所以不废话学吧…

全网最好的JVM总结:有生命周期的JVM

1.编译 1.1 java中编译器有哪些? 前端编译器 javac后台即时编译器 JIT编译器静态提前编译器 (一步到位,直接把java编译成二进制) 2.2 编译过程是怎么样? 解析与填充符号表,生成语法树 (编译…

java学习之路-继承

文章目录 前言 目录 1.1继承的概念 1.2继承有什么好处,为何要继承 1.3继承的语句 1.4父类成员的访问 1.4.1 子类中访问父类的成员变量 1.4.2 子类中访问父类的成员方法 1.5 super关键字 2.子类构造方法 2.1如何创建构造方法 2.2创建构造方法 3.super和this 【相同点…

Centos7 K8S 集群 - kubeadm搭建方式

机器准备 搭建环境是centos7, 四核心4G内存四台机器 一个master节点,一个etcd,两台node 机器名称IP 地址master192.168.1.127node1192.168.1.129node2192.168.1.130node3192.168.1.131 机器时间同步 各节点时间要求精确同步,可以直接联网…

web自动化测试系列-selenium xpath定位方法详解(六)

1.xpath介绍 XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。而html中也应用了这种语言 ,所以 ,我们定位html页面元素时也会用到xpath这种方法 。 2.xpath定位方式 xpath主要通过以下四种方法定位 &#…

【第二十九篇】BurpSuite杂项综合

文章目录 Intruder模块URL编码Grep检索提取logger日志模块Intruder模块URL编码 假设我们需要对GET请求包中的URL目录进行爆破FUZZ: example.com/xxxx(文件名)Intruder模块会自动对我们的文件名字典进行URL编码 例如payload为1.txt时,burp对其进行URL编码并连接到example.c…

VMware安装Red Hat7.9

1、下载Red Hat Enterprise Linux7.9版本 【百度网盘下载】 链接:https://pan.baidu.com/s/1567NfZRF48PBXfUqxumvDA 提取码:bm7u 2、在虚拟机中创建Red Hat7.9 【点击创建虚拟机】 【自定义高级】 【选择光盘映像安装】 全名自定义即可 【虚拟机命…

Windows环境下删除MySQL

文章目录 一、关闭MySQL服务1、winR打开运行,输入services.msc回车2、服务里找到MySQL并停止 二、卸载MySQL软件1、打开控制模板--卸载程序--卸载MySQL相关的所有组件 三、删除MySQL在物理硬盘上的所有文件1、删除MySQL的安装目录(默认在C盘下的Program …

【截至2023年底】语言模型的发展

什么是大语言模型LLM?ChatGPT、LLAMA各自有什么优势? from: https://www.youtube.com/watch?vt6qBKPubEEo github: https://github.com/Mooler0410/LLMsPracticalGuide 来自这篇survey,但据说还在更新,到…

王道汽车4S企业管理系统 SQL注入漏洞复现

0x01 产品简介 王道汽车4S企业管理系统(以下简称“王道4S系统”)是一套专门为汽车销售和维修服务企业开发的管理软件。该系统是博士德软件公司集10余年汽车行业管理软件研发经验之大成,精心打造的最新一代汽车4S企业管理解决方案。 0x02 漏洞概述 王道汽车4S企业管理系统…

etcd相关知识整理归纳 —— 筑梦之路

什么是etcd? Etcd 是 CoreOS 团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,Etcd基于 Go 语言实现。 名字由来,它源于两个方面,unix的“/etc”文件…

【ARM 裸机】汇编 led 驱动之编译程序

编译程序这一节分为四个步骤: 1、将 .s .c 文件变成 .o 文件,使用 arm-linux-gnueabihf-gcc; arm-linux-gnueabihf-gcc -g -c leds.s -o led.o上述命令就是将 leds.s 编译为 led.o,其中“ -g ”选项是产生调试信息,G…

lua学习笔记19(面相对象学习的一点总结)

print("*****************************面相对象总结*******************************") object{} --实例化方法 function object:new()local obj{}self.__indexselfsetmetatable(obj,self)return obj end-------------------------如何new一个对象 function object:…

Redis入门(常用命令、spring-boot-starter-data-redis)

Redis redis是一个基于内存的key-value的结构数据库 启动: redis-server.exe redis.windows.conf 客户端链接:redis-cli.exe [-h 目标ip] [-p 端口] [-a 密码] 修改链接密码: 在redis.windows.conf中的requirepass 123456 常用的数据类…

事务隔离级别的无锁实现方式 -- MVCC

MVCC的全称是Multiversion Concurrency Control(多版本并发控制器),是一种事务隔离级别的无锁的实现方式,用于提高事务的并发性能,即事务隔离级别的一种底层实现方式。 在了解MVCC之前,我们先来回顾一些简单的知识点:…

leetCode刷题 27. 移除元素

目录 1.思路: 2.解题方法: 3.复杂度: 4.Code 题目: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须…

商城系统必备营销功能——分销裂变

电商流量红利已经过去,现在的电商营销,重点在于私域用户,在于客户资源裂变。人们通过分销裂变挖掘客户资源,能降低获客成本,对于需要解决成本困扰的企业来说,确实是个不错的选择。今天,我们就来…

FFmpeg: 自实现ijkplayer播放器--09音频重采样输出

文章目录 流程图音视设备输出回调函数重采样写入音频流因SDL输出音频采样格式为S16(一个采样点2个字节),而音频解码后采样格式通常为float planar(一个采样点4个字节),故需要重采样 重采样的条件:音频解码后的任意一个参数和需要的参数不同时,进行重采样,参数为: 采样格…

Nginx健康检查

Nginx健康检查nginx_upstream_check_module nginx健康检查介绍: ​ 主动健康检查,nignx定时主动地去ping后端的服务列表,当发现某服务出现异常时,把该服务从健康列表中移除,当发现某服务恢复时,又能够将该服务加回健…

Java并发--内存结构图及线程安全

内存结构图 内存-> (开辟的数组) -> (方法区,堆,栈,程序计数器,本地方法栈) 堆:几乎所有的对象实例都在这里分配内存。堆中每个对象的头信息都标属着他属于哪个类。 方法区它用于存储已被虚拟机加载的类型信息…