【点云处理技术之open3d】第三篇:点云的高级操作篇

您所在的位置:网站首页 对角边框怎么切割出来 【点云处理技术之open3d】第三篇:点云的高级操作篇

【点云处理技术之open3d】第三篇:点云的高级操作篇

2024-07-09 15:48:14| 来源: 网络整理| 查看: 265

文章目录 1. 点云边界框2. 凸包(convex hull)3. DBSCAN聚类4. RANSAC平面分割5. 隐点移除(Hidden point removal) 本文是 上一篇文章的延续,也是open3d处理点云的高级操作篇。本文将依次介绍open3d如何处理点云边界框、凸包、DBSCAN、RANSCA和隐点移除等操作。

1. 点云边界框

点云几何类型和其他类型一样,也有包围框。当前,open3d实现了两个包围框接口,AxisAlignedBoundingBox 和 OrientedBoundingBox,它们区别如下表所示。同时他们也可以用来裁剪几何图形。

函数名称说明图形说明AxisAlignedBoundingBox轴对齐边界框aabb每条边都有平行的轴在这里插入图片描述OrientedBoundingBox定向边界框obb边和轴有一定的夹角在这里插入图片描述 import open3d as o3d import numpy as np #*******************************包围框*********************************** pcd = o3d.io.read_point_cloud("../test_data/fragment.ply") # 读取ply或者pcd文件 #读取裁剪的文件 vol = o3d.visualization.read_selection_polygon_volume( "../test_data/Crop/cropped.json") chair = vol.crop_point_cloud(pcd)#裁剪椅子 # o3d.visualization.draw_geometries([chair]) #显示椅子 aabb = chair.get_axis_aligned_bounding_box() #轴对其包围盒 aabb.color = (1, 0, 0) #红色 obb = chair.get_oriented_bounding_box() obb.color = (0, 1, 0) # 绿色 o3d.visualization.draw_geometries([chair, aabb, obb], zoom=0.7, front=[0.5439, -0.2333, -0.8060], lookat=[2.4615, 2.1331, 1.338], up=[-0.1781, -0.9708, 0.1608])

在这里插入图片描述

2. 凸包(convex hull)

点云的凸包是包含所有点的最小凸集,open3d实现了计算凸包的方法compute_convex_hull,这个接口的实现基于Qhull。

import open3d as o3d import numpy as np #*******************************凸包*********************************** pcd = o3d.io.read_point_cloud("../test_data/fragment.ply") # 读取ply或者pcd文件 # 裁剪点云 vol = o3d.visualization.read_selection_polygon_volume( "../test_data/Crop/cropped.json") chair = vol.crop_point_cloud(pcd) # 计算点云的凸包 hull, _ = chair.compute_convex_hull() hull_ls = o3d.geometry.LineSet.create_from_triangle_mesh(hull) hull_ls.paint_uniform_color((1, 0, 0)) #凸包的颜色 o3d.visualization.draw_geometries([chair, hull_ls])

在这里插入图片描述

3. DBSCAN聚类

open3d实现了DBSCAN[Ester1996]算法,这是一种基于密度的聚类算法。该算法需要两个参数。

labels = np.array(pcd.cluster_dbscan(eps=0.02, min_points=10, print_progress=True)) 入参: eps: 定义到聚类相邻点云的距离min_points: 定义形成聚类所需的最小点数。 出参:

该函数返回一个标签,其中标签-1表示噪音。

import open3d as o3d import numpy as np import matplotlib.pyplot as plt #*******************************DBSCAN*********************************** pcd = o3d.io.read_point_cloud("../test_data/fragment.ply") with o3d.utility.VerbosityContextManager( o3d.utility.VerbosityLevel.Debug) as cm: labels = np.array( pcd.cluster_dbscan(eps=0.02, min_points=10, print_progress=True)) max_label = labels.max() print(f"point cloud has {max_label + 1} clusters") colors = plt.get_cmap("tab20")(labels / (max_label if max_label > 0 else 1)) colors[labels ] 97% point cloud has 10 clusters

在这里插入图片描述

4. RANSAC平面分割

Open3D还支持使用RANSAC从点云分割算法,其中segment_plane用于平面分割算法,该算法的有三个参数:

distance_threshold:inlier的最大距离阈值ransac_n:随机采样的平面点数num_iterations:表示最小迭代次数。 import open3d as o3d pcd = o3d.io.read_point_cloud("../test_data/fragment.pcd") plane_model, inliers = pcd.segment_plane(distance_threshold=0.01, ransac_n=3, num_iterations=1000) [a, b, c, d] = plane_model print(f"Plane equation: {a:.2f}x + {b:.2f}y + {c:.2f}z + {d:.2f} = 0") # 显示 inlier_cloud = pcd.select_by_index(inliers) inlier_cloud.paint_uniform_color([1.0, 0, 0]) # inliers为红色 outlier_cloud = pcd.select_by_index(inliers, invert=True) o3d.visualization.draw_geometries([inlier_cloud, outlier_cloud], zoom=0.8, front=[-0.4999, -0.1659, -0.8499], lookat=[2.1813, 2.0619, 2.0999], up=[0.1204, -0.9852, 0.1215])

输出:

Plane equation: -0.06x + -0.10y + 0.99z + -1.06 = 0

在这里插入图片描述

5. 隐点移除(Hidden point removal)

由于点云分辨率的问题,如果你只想看前景点,就需要滤掉背景点。为此,我们可以应用隐藏点移除(Hidden point removal)算法。该方法可以近似的给出一个视角下的可视点云。

import open3d as o3d import numpy as np pcd = o3d.io.read_point_cloud("../test_data/fragment.ply") # 读取ply或者pcd文件 diameter = np.linalg.norm( np.asarray(pcd.get_max_bound()) - np.asarray(pcd.get_min_bound())) o3d.visualization.draw_geometries([pcd]) print("Define parameters used for hidden_point_removal") camera = [0, 0, diameter] # 定义用于隐藏点删除的参数,获取从给定视图中可见的所有点,可视化结果 radius = diameter * 100 print("Get all points that are visible from given view point") _, pt_map = pcd.hidden_point_removal(camera, radius) print("Visualize result") pcd = pcd.select_by_index(pt_map) o3d.visualization.draw_geometries([pcd])

输出:

Define parameters used for hidden_point_removal Get all points that are visible from given view point Visualize result

原始视角下的视图: 在这里插入图片描述 经过隐点移除之后的视图: 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭