如何利用open3D来生成OCC

config.yaml请添加图片描述

'depth': 10:#深度,设定为10,常用于决定处理或计算的层次或深入程度。
'min_density': 0.1:#最小密度,设置为0.1,用于过滤或选择的密度阈值。
'n_threads': -1:#线程数,设为-1,通常表示使用所有可用的处理器核心。
'downsample': False:#降采样,设为False,表示不进行降采样处理。
'voxel_size': 0.5:#体素大小,设置为0.5,用于定义空间网格的体素的尺寸。
'max_nn': 20:#最大邻居数,设为20,用于某些需要基于最近邻算法的计算。
'pc_range': [-50, -50, -5, 50, 50, 3]#点云范围,设置为从-50到50在X和Y方向上,从-5到3在Z方向上,用于界定处理或分析的空间区域。
'occ_size': [200, 200, 16]#占据格大小,设置为200x200x16,表示在三维空间中的格子数量。
'self_range': [3.0, 3.0, 3.0]#自身范围,设置为3.0x3.0x3.0,可能用于定义某种局部空间的大小。
def run_poisson(pcd, depth, n_threads, min_density=None):
    # 使用Poisson表面重建算法从点云创建三角形网格
    mesh, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(
        pcd, depth=depth, n_threads=n_threads
    )

    # 如果提供了最小密度阈值,则移除低于该阈值的顶点
    if min_density:
        vertices_to_remove = densities < np.quantile(densities, min_density)
        mesh.remove_vertices_by_mask(vertices_to_remove)

    # 计算网格顶点的法线
    mesh.compute_vertex_normals()

    return mesh, densities
print('run Poisson surface reconstruction')
with o3d.utility.VerbosityContextManager(
        o3d.utility.VerbosityLevel.Debug) as cm:
    mesh, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(
        pcd, depth=9)
print(mesh)
o3d.visualization.draw_geometries([mesh],
                                  zoom=0.664,
                                  front=[-0.4761, -0.4698, -0.7434],
                                  lookat=[1.8900, 3.2596, 0.9284],
                                  up=[0.2304, -0.8825, 0.4101])

在这里插入图片描述

泊松曲面重建还将在低点密度区域创建三角形,甚至外推到某些区域(请参见上面 eagle 输出的底部)。 create_from_point_cloud_poisson 函数有第二个 densities 返回值,该值指示每个顶点的密度。低密度值意味着顶点仅由输入点云中的少量点支持。

In the code below we visualize the density in 3D using pseudo color. Violet indicates low density and yellow indicates a high density.
在下面的代码中,我们使用伪彩色可视化 3D 密度。紫色表示低密度,黄色表示高密度。

源代码

 # 如果提供了最小密度阈值,则移除低于该阈值的顶点
    if min_density:
        vertices_to_remove = densities < np.quantile(densities, min_density)
        mesh.remove_vertices_by_mask(vertices_to_remove)

open3d 效果图

print('visualize densities')
densities = np.asarray(densities)
density_colors = plt.get_cmap('plasma')(
    (densities - densities.min()) / (densities.max() - densities.min()))
density_colors = density_colors[:, :3]
density_mesh = o3d.geometry.TriangleMesh()
density_mesh.vertices = mesh.vertices
density_mesh.triangles = mesh.triangles
density_mesh.triangle_normals = mesh.triangle_normals
density_mesh.vertex_colors = o3d.utility.Vector3dVector(density_colors)
o3d.visualization.draw_geometries([density_mesh],
                                  zoom=0.664,
                                  front=[-0.4761, -0.4698, -0.7434],
                                  lookat=[1.8900, 3.2596, 0.9284],
                                  up=[0.2304, -0.8825, 0.4101])

在这里插入图片描述

Surface normal estimation
表面法线估计

源码

mesh.compute_vertex_normals()

open3D 可视化

print("Computing normal and rendering it.")
mesh.compute_vertex_normals()
print(np.asarray(mesh.triangle_normals))
o3d.visualization.draw_geometries([mesh])

在这里插入图片描述
源码

def preprocess_cloud(pcd, max_nn=20, normals=None):
    # 复制点云数据
    cloud = deepcopy(pcd)

    # 如果需要估算法线
    if normals:
        params = o3d.geometry.KDTreeSearchParamKNN(max_nn)
        cloud.estimate_normals(params)

        # 将法线朝向相机位置
        cloud.orient_normals_towards_camera_location()

    return cloud

open3D

open3d.geometry.KDTreeSearchParamKNN(knn=20)                        # 计算近邻的20个点
import open3d
import numpy as np
import mayavi.mlab as mlab
# 4. 法向量的计算
def open3d_vector_compute():
    pcd_path = r"E:\xxxx\open3d_xxxx\ICP_data\cloud_bin_0.pcd"
    pcd = open3d.io.read_point_cloud(pcd_path)
    pcd.estimate_normals(
        search_param=open3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30)
    )
    normals = np.array(pcd.normals)    # 法向量结果与点云维度一致(N, 3)
    points = np.array(pcd.points)
    print(normals.shape, points.shape)
    # 验证法向量模长为1(模长会有一定的偏差,不完全为1)
    normals_length = np.sum(normals**2, axis=1)
    flag = np.equal(np.ones(normals_length.shape, dtype=float), normals_length).all()
    print('all equal 1:', flag)
    # 法向量可视化
    open3d.visualization.draw_geometries([pcd],
                                         window_name="Open3d",
                                         point_show_normal=True,
                                         width=800,   # 窗口宽度
                                         height=600)  # 窗口高度
if __name__ == '__main__':
    open3d_vector_compute()

在这里插入图片描述
参考连接

github :连接
open3D 官网

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

群晖(Synology)NAS 启用 SSH

群晖&#xff08;Synology&#xff09;NAS 是可以启用 SSH 的。 如果使用 SSH 命令&#xff0c;我们可以在 NAS 上运行相关的 Linux 命令&#xff0c;比如说在服务器网络传输数据上&#xff0c;就会有明显的优势了。 如何启用 进入 NAS 的服务器控制台&#xff0c;然后找到终…

LeetCode 349. 两个数组的交集

LeetCode 349. 两个数组的交集 1、题目 力扣题目链接&#xff1a;349. 两个数组的交集 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 […

锂电池寿命预测 | Matlab基于BiLSTM双向长短期记忆神经网络的锂电池寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池寿命预测 | Matlab基于BiLSTM双向长短期记忆神经网络的锂电池寿命预测 程序设计 完整程序和数据获取方式&#xff1a;私信博主回复Matlab基于BiLSTM双向长短期记忆神经网络的锂电池寿命预测。 参考资料 [1] h…

【菜狗学前端】npm i -g nodemon 遇到的下载卡住及运行权限问题解决记录

一、下载nodemon原因 nodemon作用&#xff1a;用node环境运行js文件时可以实时刷新运行出结果 (即修改js代码后不需再手动重新运行js文件) 二、下载卡住 reify:semver:timing reifyNode:node_modules/nodemon Completed 卡住位置&#xff1a;reify:semver: timing reifyNode…

力扣第20题有效的括号

typedef char STDataType; //动态栈 #define allocator_may_return_null 1typedef struct ST {STDataType* _a;int _top;//栈顶元素int _capacity;//最大容量 }Stack; //初始化栈 void StackInit(Stack *pst);//入栈 void StackPush(Stack* pst, STDataType x);//出栈 void Sta…

优思学院|2024年如何成为一名六西格玛黑带?

如果你总是觉得无论多么努力&#xff0c;职场上似乎难以有所突破&#xff0c;那么你应该知道&#xff0c;你并不是孤独的。 实际上&#xff0c;大量研究表明&#xff0c;高达90%的人对自己的工作感到不满&#xff0c;这意味着在你认识的每10人中&#xff0c;可能只有1人对其工…

CMC学习系列 (9):对侧半球可能支持中风后的恢复

对侧半球可能支持中风后的恢复 0. 引言1. 主要贡献2. 方法2.1 患者信息2.2 行为测试2.3 运动任务/实验范式 3. 结果3.1 对照参与者和卒中患者的相干图3.2 地形图上的CMC标签 4. 讨论5. 总结欢迎来稿 论文地址&#xff1a;https://www.sciencedirect.com/science/article/pii/S2…

认识OpenEuler操作系统

引言 在信息技术日新月异的时代&#xff0c;开源软件已成驱动创新的核心动能&#xff0c;其中&#xff0c;OpenEuler作为一款冉冉升起的开源操作系统典范&#xff0c;凭借其对开源精神的坚守与技术创新的不懈追求&#xff0c;自亮相以来便引发了全球关注。本文将全方位深挖Open…

QT文本操作

文本的操作 文本的读写流程 文本的读写流程 // 文本的读写流程// 1.打开文件》打到文本》QFileDialog::getOpenFileName返回的是// 一个字符串&#xff0c;包括了路径文件名字// open()方法打开文本// 2.读写文本// readAll(),readLine(),write()// 3.关闭文本 // close()使用…

2024很漂亮的个人主页HTML源码

源码介绍 很漂亮的个人主页HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 截图效果 源码下载 很漂亮的个人主页HTML源码

关于运行阿里云直播Demo报的错

flutter --version dart --version 如何使用Flutter框架推流_音视频终端 SDK(Apsara Video SDK)-阿里云帮助中心MediaBox音视频SDK下载指南_音视频终端 SDK(Apsara Video SDK)-阿里云帮助中心 终端输入 dart pub --trace get --no-precompile 打印详细报错信息 详细咨询…

Scrapy框架 进阶

Scrapy框架基础Scrapy框架进阶 【五】持久化存储 命令行&#xff1a;json、csv等管道&#xff1a;什么数据类型都可以 【1】命令行简单存储 &#xff08;1&#xff09;语法 Json格式 scrapy crawl 自定义爬虫程序文件名 -o 文件名.jsonCSV格式 scrapy crawl 自定义爬虫程…

【C#】 删除首/尾部字符

代码 static void Main(string[] args){string str "123abc";string strdelete "abc";string str1 str.Trim(1);string strc str1.Trim(c);string str11 str1.TrimStart(1);string strcc str1.TrimEnd(c);string strabc str.Trim(strdelete.ToCharA…

kylin java.io.IOException: error=13, Permission denied

linux centos7.8 error13, Permission denied_linux open error13-CSDN博客 chmod -R 777 /home/zengwenfeng/kkFileView-4.2.1 2024-04-15 13:15:17.416 WARN 3400 --- [er-offprocmng-1] o.j.l.office.LocalOfficeProcessManager : An I/O error prevents us to determine…

mybatis自制插件+注解实现数据脱敏

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 mybatis自制插件注解实现数据脱敏 前言数据脱敏的实现方式构思从哪个地方进行脱敏&#xff1f;它怎么知道我什么数据需要脱敏 项目实现拦截器实现注解实现枚举实现效果图展示 前言 在数字时代&#x…

C++初识

这里会对一些内容进行简单的提起&#xff0c;后面会详细讲解 一、注释 作用&#xff1a;在代码中加入一些说明和解释&#xff0c;方便自己或其他人阅读代码 两种格式&#xff1a; 1、单行注释&#xff1a; // 描述信息 通常放在一行代码的上方&#xff0c;或者一条语句的末…

LeetCode55题:跳跃游戏(原创)

【题目描述】 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&am…

k8s网络详解

一、Kubernetes网络基础 1、kubernetes的网络层级 节点网络&#xff1a;集群宿主机节点间的网络通信&#xff0c;并且负责打通与集群外部的通讯。pod网络&#xff1a;为集群上的pod提供网络&#xff0c;通过CNI网络插件来完成&#xff0c;如Fannel、Calico、Cilium等。servic…

小米汽车值得去吗?最终拒了 offer。

车企选择 今天逛某职场 App 时&#xff0c;无意间看到一篇寻求 offer 抉择意见的帖子&#xff1a; 这位同学刚从加班闻名&#xff08;但 CEO 强调既学华为狼性&#xff0c;也学华为分配&#xff09;的理想汽车离职。 经过了 6 轮面试&#xff0c;收到了小米 offer&#xff0c;但…

【VTKExamples::Meshes】第十期 Decimation

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例Decimation,并解析接口vtkDecimatePro,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO…