open3d剩余内容有关函数详情(笔记10)

本次笔记包括网格变形(Mesh deformation)内在形状特征(Intrinsic shape signatures)ISS光线投射(Ray Casting)距离查询(Distance Queries)内容。

1. 网格变形(Mesh deformation)

如果我们想根据少量约束对三角形网格进行变形,我们可以使用网格变形算法。Open3D 实现了 [SorkineAndAlexa2007] 的 as-rigid-as-possible 方法,该方法优化了以下能量函数

其中  是我们要优化的旋转矩阵, 分别是优化前后的顶点位置。是顶点  的邻居集合。我们的权重是余切权重。

Open3D 在deform_as_rigid_as_possible 中实现了这个方法。此方法的第一个参数是constraint_ids,它们引用三角形网格中的顶点。第二个参数 constint_pos 定义了优化后这些顶点应该在哪个位置。优化过程是一个迭代方案。因此,我们也可以通过 max_iter 定义迭代次数。

open3d.geometry.TriangleMesh

deform_as_rigid_as_possible(selfconstraint_vertex_indicesconstraint_vertex_positions

max_iterenergy=<DeformAsRigidAsPossibleEnergy.Spokes: 0>smoothed_alpha=0.01)

函数功能:

该函数使用 Sorkine 和 Alexa 的方法使网格变形,‘As-Rigid-As-Possible Surface Modeling’,2007

参数:

constraint_vertex_indices (open3d.utility.IntVector)应该由constraint_vertex_positions中的顶点位置约束的三角形顶点的索引

constraint_vertex_positions (open3d.utility.Vector3dVector)用于约束的顶点位置

max_iter (int)最大迭代次数以最小化能量泛函

(open3d.geometry.DeformAsRigidAsPossibleEnergy (energy) – 0>)变形过程中最小化的能量模型

optional – 0>)变形过程中最小化的能量模型

default=<DeformAsRigidAsPossibleEnergy.Spokes – 0>)变形过程中最小化的能量模型

smoothed_alpha (float, optional, default=0.01)正则化项的平滑能量函数的权衡参数

返回:

open3d.geometry.TriangleMesh

1.1 平滑ARAPA(Smoothed ARAP)

Open3D 还实现了 ARAP 目标的平滑版本,定义为

惩罚相邻旋转矩阵的偏差。  是正则化项的权衡参数, 是表面积。

通过使用带参数 Smoothed 的自变量能量,可以在 deform_as_rigid_as_possible 中使用平滑目标。


2. 内在形状特征(Intrinsic shape signatures)ISS

检测 3D 形状的 ISS 关键点。该实现基于于中提出的关键点检测模块,“Intrinsic Shape Signatures: A Shape Descriptor for 3D Object Recognition”2009

2.1 ISS关键点

ISS 显着性度量基于属于  支持的点的散布矩阵  的特征值分解 (EVD),即:

给定 ,它的降幅特征值在这里表示为 。在修剪阶段,保留两个连续特征值之间的比率低于阈值的点:

基本原理是避免在沿主要方向表现出相似分布的点处检测关键点,在这些点无法建立可重复的规范参考框架,并且,因此,后续的描述阶段几乎不会有效。其余点中,显着性由最小特征值的大小决定:

以便仅包括沿每个主要方向变化较大的点。

在检测步骤之后,如果一个点在给定邻域上具有最大显着值,则该点将被视为关键点。

注意:有关更多详细信息,请参阅原始出版物或 Tombari 等人的Performance Evaluation of 3D Keypoint Detectors

2.2 ISS关键点检测示例

o3d.geometry.keypoint.compute_iss_keypoint(pcd)


3. 光线投射(Ray Casting)

Open3D 中的 RaycastingScene 类提供基本的光线投射功能。展示如何创建场景并进行光线相交测试。您还可以使用 RaycastingScene 从网格(例如 CAD 模型)创建虚拟点云。

初始化

作为第一步,我们使用一个或多个三角形网格初始化 RaycastingScene

open3d.geometry.TriangleMesh

create_box(width=1.0height=1.0depth=1.0create_uv_map=False

map_texture_to_each_face=False)

函数功能:

创建一个盒子。正面的左下角将放置在 (0, 0, 0) 处,默认 UV 贴图,将整个纹理映射到每个面。

参数:

width (float, optional, default=1.0)x 方向长度

height (float, optional, default=1.0)y 方向长度

depth (float, optional, default=1.0)z方向长度

create_uv_map (bool, optional, default=False)将默认 uv 贴图添加到网格

map_texture_to_each_face (bool, optional, default=False)将整个纹理映射到每个面

返回:

open3d.geometry.TriangleMesh

o3d.t.geometry.RaycastingScene

add_triangles(self:open3d.geometry.RaycastingScene,vertex_positions:open3d.cpu.core.Tensor,

triangle_indices:open3d.cpu.pybind.core.Tensor) -> int

函数功能:

将三角形网格添加到场景中

参数:

vertices (open3d.core.Tensor)顶点作为 dim {N,3} 和 dtype Float32 的张量

triangles (open3d.core.Tensor)三角形作为 dim {M,3} 和 dtype UInt32 的张量

返回:

添加的网格的几何 ID(The geometry ID of the added mesh)

o3d.t.geometry.RaycastingScene

add_triangles(self:open3d.geometry.RaycastingScene,mesh: open3d.geometry.TriangleMesh)->int

函数功能:

将三角形网格添加到场景中

参数:

mesh (open3d.t.geometry.TriangleMesh)三角形网格

返回:

添加的网格的几何 ID(The geometry ID of the added mesh)

 投射光线

o3d.geometry.TriangleMesh

create_torus(torus_radius=1.0, tube_radius=0.5, radial_resolution=30, tubular_resolution=20)

函数功能:

用于创建环面网格的函数

参数:

torus_radius (float, optional, default=1.0)从圆环中心到管中心的半径

tube_radius (float, optional, default=0.5)管筒半径

radial_resolution (int, optional, default=30)沿径向的段数

tubular_resolution (int, optional, default=20)沿管状方向的段数

返回:

open3d.geometry.TriangleMesh

o3d.t.geometry.RaycastingScene

create_rays_pinhole(intrinsic_matrix:open3d.core.Tensor, extrinsic_matrix:open3d.core.Tensor,width_px:int,height_px:int) -> open3d.cpu.pybind.core.Tensor

函数功能:

为给定的相机参数创建光线

参数:

intrinsic_matrix (open3d.core.Tensor)形状为 {3,3} 的上三角内在矩阵

extrinsic_matrix (open3d.core.Tensor)4x4 世界到相机 SE(3) 变换矩阵

width_px (int)图像的宽度(以像素为单位)

height_px (int)图像的高度(以像素为单位)

返回:

带有光线的形状为 {height_px, width_px, 6} 的张量

o3d.t.geometry.RaycastingScene

create_rays_pinhole(fov_deg:float,center:open3d.core.Tensor,eye:open3d.core.Tensor,

up:open3d.core.Tensor,width_px:int,height_px:int) -> open3d.cpu.pybind.core.Tensor

函数功能:

为给定的相机参数创建光线

参数:

fov_deg (float)以度为单位的水平视野

center (open3d.core.Tensor)相机以 {3} 形状注视的点

eye (open3d.core.Tensor)形状为 {3} 的相机的位置

up (open3d.core.Tensor)形状为 {3} 的上向量

width_px (int)图像的宽度(以像素为单位)

height_px (int)图像的高度(以像素为单位)

返回:

带有光线的形状为 {height_px, width_px, 6} 的张量


4.  距离查询(Distance Queries)

Open3D 中的 RaycastingScene 类提供了一组距离查询,可用于将三角形网格转换为隐式函数,查询到表面的距离或确定一个点是否在网格内。

4.1 将网格转换为隐式表示

o3d.t.geometry.RaycastingScene

compute_distance(self: open3d.geometry.RaycastingScene, query_points: open3d.core.Tensor, 

nthreads: int = 0) →open3d.core.Tensor

函数功能:

计算到场景表面的距离

参数:

query_points (open3d.core.Tensor)具有 >=2 暗度、形状 {.., 3} 和 Dtype Float32 描述查询点的张量。{..} 可以是任意数量的维度,例如,组织查询点以创建 3D 网格,形状可以是 {depth, height, width, 3}。最后一个维度必须为 3,格式为 [x, y, z]

nthreads (int)要使用的线程数。设置为 0 表示自动

返回:

具有到表面距离的张量。形状是 {..}

o3d.t.geometry.RaycastingScene

compute_signed_distance(self: open3d.t.geometry.RaycastingScene, 

query_points: open3d.core.Tensor, nthreads: int = 0) → open3d.core.Tensor

函数功能:

计算到场景表面的有符号距离。

此函数计算到场景中网格的有符号距离。该函数假定所有网格都是水密的,并且网格之间没有相交,即,必须明确定义内部和外部。该函数通过计算从查询点开始的射线的交点来确定距离的符号

参数:

query_points (open3d.core.Tensor)一个具有 >=2 暗度、形状 {.., 3} 和 Dtype Float32 的张量,用于描述 query_points。{..} 可以是任意数量的维度,例如,组织查询点以创建 3D 网格,形状可以是 {depth, height, width, 3}。最后一个维度必须为 3,格式为 [x, y, z]

nthreads (int)要使用的线程数。设置为 0 表示自动

返回:

到表面的有符号距离的张量。形状是 {..}。负距离意味着一个点在一个封闭的表面内

o3d.t.geometry.RaycastingScene

compute_occupancy(self: open3d.t.geometry.RaycastingScene, query_points: open3d.core.Tensor, 

nthreads: int = 0) → open3d.core.Tensor

函数功能:

计算查询点位置的占用率

此函数计算查询点是在内部还是外部。该函数假定所有网格都是水密的,并且网格之间没有交叉点,即必须明确定义内部和外部。该函数通过计算从查询点开始的射线的交点来确定一个点是否在内部。

参数:

query_points (open3d.core.Tensor)具有 >=2 暗度、形状 {.., 3} 和 Dtype Float32 描述查询点的张量。{..} 可以是任意数量的维度,例如,组织查询点以创建 3D 网格,形状可以是 {depth, height, width, 3}。最后一个维度必须为 3,格式为 [x, y, z]。

nthreads (int)要使用的线程数。设置为 0 表示自动

返回:

具有占用值的张量。形状是 {..}。值为 0 或 1。如果值为 1,则点被占用或在内部

o3d.t.geometry.RaycastingScene

compute_closest_points(self: open3d.t.geometry.RaycastingScene, 

query_points: open3d.core.Tensor, nthreads: int = 0) → Dict[str, open3d.core.Tensor]

函数功能:

计算场景表面上的最近点

参数:

query_points (open3d.core.Tensor)具有 >=2 暗度、形状 {.., 3} 和 Dtype Float32 描述查询点的张量。{..} 可以是任意数量的维度,例如,组织查询点以创建 3D 网格,形状可以是 {depth, height, width, 3}。最后一个维度必须为 3,格式为 [x, y, z]。

nthreads (int)要使用的线程数。设置为 0 表示自动

返回:

返回的字典包含:

   points: 具有最近表面点的张量。形状是 {..}

   geometry_ids:具有几何 ID 的张量。形状是 {..}

   primitive_ids:具有原始 ID 的张量,对应于三角形索引。形状是 {..}

o3d.t.geometry.RaycastingScene

count_intersections(self: open3d.t.geometry.RaycastingScene, rays: open3d.core.Tensor, 

nthreads: int = 0) → open3d.core.Tensor

函数功能:

计算光线与场景的交点数

参数:

rays (open3d.core.Tensor)一个具有 >=2 暗度、形状 {.., 6} 和 Dtype Float32 描述光线的张量。 {..} 可以是任意数量的维度,例如,为了组织光线以创建图像,形状可以是 {height, width, 6}。最后一个维度必须为 6,格式为 [ox, oy, oz, dx, dy, dz],以 [ox,oy,oz] 为原点,[dx,dy,dz] 为方向。没有必要规范化方向。

nthreads (int)要使用的线程数。设置为 0 表示自动

返回:

具有交点数的张量。形状是 {..}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值