赞
踩
本次笔记包括网格变形(Mesh deformation)、内在形状特征(Intrinsic shape signatures)ISS、光线投射(Ray Casting)和距离查询(Distance Queries)内容。
如果我们想根据少量约束对三角形网格进行变形,我们可以使用网格变形算法。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(self, constraint_vertex_indices, constraint_vertex_positions, max_iter, energy=<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 |
Open3D 还实现了 ARAP 目标的平滑版本,定义为
惩罚相邻旋转矩阵的偏差。 是正则化项的权衡参数, 是表面积。
通过使用带参数 Smoothed 的自变量能量,可以在 deform_as_rigid_as_possible 中使用平滑目标。
检测 3D 形状的 ISS 关键点。该实现基于于中提出的关键点检测模块,“Intrinsic Shape Signatures: A Shape Descriptor for 3D Object Recognition”,2009。
ISS 显着性度量基于属于 支持的点的散布矩阵 的特征值分解 (EVD),即:
给定 ,它的降幅特征值在这里表示为 。在修剪阶段,保留两个连续特征值之间的比率低于阈值的点:
基本原理是避免在沿主要方向表现出相似分布的点处检测关键点,在这些点无法建立可重复的规范参考框架,并且,因此,后续的描述阶段几乎不会有效。其余点中,显着性由最小特征值的大小决定:
以便仅包括沿每个主要方向变化较大的点。
在检测步骤之后,如果一个点在给定邻域上具有最大显着值,则该点将被视为关键点。
注意:有关更多详细信息,请参阅原始出版物或 Tombari 等人的“Performance Evaluation of 3D Keypoint Detectors”。
o3d.geometry.keypoint.compute_iss_keypoint(pcd)
Open3D 中的 RaycastingScene 类提供基本的光线投射功能。展示如何创建场景并进行光线相交测试。您还可以使用 RaycastingScene 从网格(例如 CAD 模型)创建虚拟点云。
初始化
作为第一步,我们使用一个或多个三角形网格初始化 RaycastingScene。
open3d.geometry.TriangleMesh create_box(width=1.0, height=1.0, depth=1.0, create_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} 的张量 |
Open3D 中的 RaycastingScene 类提供了一组距离查询,可用于将三角形网格转换为隐式函数,查询到表面的距离或确定一个点是否在网格内。
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 表示自动 |
返回: 具有交点数的张量。形状是 {..} |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。