当前位置:   article > 正文

3.Halcon3D点云处理-点云常用滤波方式_halcon 点云处理

halcon 点云处理

对点云进行滤波的主要意义和目的有以下几点:

  1. 去除噪声和异常值:由于设备本身的误差或环境因素的影响,采集到的点云数据中可能会包含一些噪声和异常值。这些噪声和异常值会影响后续的点云处理和分析,因此需要通过滤波处理加以去除。
  2. 提高数据质量:滤波处理可以有效地提高点云数据的质量和精度,使得点云数据更加准确和可靠。这对于后续的点云处理和分析具有重要的意义。
  3. 局部计算与调整:点云滤波主要通过局部计算的方式,获得一个响应值,然后根据响应值调整点云,比如位置调整,保留或删除某点。

总体而言,对点云进行滤波处理是点云处理中不可或缺的一步,对于提高点云数据的准确性和可靠性,以及后续的点云处理和分析具有重要的意义。

点云滤波在以下场景中会用到:

  1. 无人驾驶:在无人驾驶汽车中,需要对激光雷达(LIDAR)获取的点云数据进行滤波处理,以去除噪声和异常值,提高数据质量,并提取出有用的特征信息,以实现精确的感知和定位。
  2. 三维重建:在三维重建中,需要对获取的点云数据进行滤波处理,以去除噪声和异常值,并提取出有用的特征信息,以实现精确的三维重建。
  3. 人脸识别:在人脸识别中,需要对获取的人脸图像进行滤波处理,以提取出人脸的特征信息,并进行比对和识别。
  4. 机器视觉:在机器视觉中,需要对获取的图像进行滤波处理,以去除噪声和异常值,提高图像质量,并提取出有用的特征信息,以实现精确的识别和分类。
  5. 环境监测:在环境监测中,需要对获取的大气、水质等环境数据进行滤波处理,以去除噪声和异常值,并提取出有用的特征信息,以实现精确的环境监测和保护。

总之,点云滤波被广泛应用于各种需要处理三维数据的场景中,如三维视觉、自动驾驶感知定位、三维场景重建、AR/VR、姿态估计等。

在使用halcon处理三维数据的过程中,我们会执行一些点云滤波的相关操作;

点云滤波作为常见的点云处理算法,一般是点云处理的第一步,对后续处理有很重要作用。滤波有很多方面也有很多种功能,比如去除噪声点、离群点、点云平滑以及空洞、数据压缩等。

为什么要对点云滤波?

一般下面这几种情况需要进行点云滤波处理:

(1)点云数据密度不规则需要平滑

(2)因为遮挡等问题造成离群点需要去除

(3)大量数据需要下采样

(4)噪声数据需要去除

点云噪声数据来自于:

一方面来自设备。比如我们用激光扫描仪、RGB-D相机等设备获取点云数据时,由于设备精度,电磁波的衍射特性等都会引入噪声的。另一方面来自环境因素带来的影响,比如被测物体表面性质发生变化。还有一个重要的方面就是操作者经验带来的影响,比如在处理点云数据拼接配准等操作过程中引入的一些噪声等。

一、点云数据下采样

为什么要进行下采样?

有些时候点云数据量巨大,存储、操作都很不方便,就需要进行下采样,即从大容量的点云数据样本中按一定规则选取具有代表性的样本来代替原来的大样本,可以简化操作、计算等。

sample_object_model_3d(操作员)

名字

sample_object_model_3d— 对 3D 对象模型进行采样。

签名

sample_object_model_3d( : : ObjectModel3D, Method, SampleDistance, GenParamName, GenParamValue : SampledObjectModel3D)

描述

sample_object_model_3d创建 3D 对象的采样版本 型ObjectModel3D它由具有 最小距离SampleDistance彼此之间。 创建的 3D 对象模型在 中返回SampledObjectModel3D.

如果点云复杂,建议使用 将被精简以加快后处理速度,或者如果要将基元 转换为点云。 请注意,如果 3D 对象模型是三角测量的,则应通过以下方式简化 尽可能保留其原始几何形状,sample_object_model_3dsimplify_object_model_3d应改用。

如果输入对象模型ObjectModel3D仅包含点, 有几种采样方法可供选择,可以使用 参数Method:

“快”:

默认方法“快”增加 输入模型中所有不是的点 接近之前添加到输出模型的任何点。 如果存在,法线、XYZ 映射和扩展点属性将复制到 输出模型。

“fast_compute_normals”:

方法“fast_compute_normals”选择相同的点 作为方法“快”,但另外计算 所选所有点的法线。 为此,输入对象模型必须包含法线,即 复制,或者它必须包含 XYZ 映射属性,从该属性 计算法线。计算法线的 z 分量 向量始终为正。XYZ 映射由xyz_to_object_model_3d.

“准确”:

方法“准确”穿过 3D 对象的点 型ObjectModel3D并计算是否有任何其他点 在半径为SampleDistance周围 检查点。 如果没有其他点,则存储原始点 在SampledObjectModel3D. 如果还有其他点,这些点的重心 点(包括原始点)存储在SampledObjectModel3D. 对剩余的点重复此过程,直到 没有积分了。 不会复制输入 3D 对象模型的扩展属性,但会复制 复制法线和 XYZ 映射。 对于此方法,可以通过指定 的值“min_num_points”在GenParamName和GenParamValue,这将删除所有 具有小于指定相邻点数的插值点 原始模型中的点。

“accurate_use_normals”:

方法“accurate_use_normals”需要法线在 输入 3D 对象模型并仅插入具有相似点的点 法线。 相似性取决于法线之间的角度。阈值 的角度可以在GenParamName和GenParamValue跟“max_angle_diff”. 默认值为 180 度。 此外,可以按照方法中所述删除异常值“准确”,通过设置泛型参数“min_num_points”.

“xyz_mapping”:

方法“xyz_mapping”只能应用于 3D 对象模型 包含 XYZ 映射(例如,如果它是使用xyz_to_object_model_3d). 此映射存储每个 3D 点的原始图像坐标。 方法“xyz_mapping”将这些原始图像细分为 带边长的正方形SampleDistance(在 像素),并为每个正方形选择一个 3D 点。该方法的行为类似于应用zoom_image_factor到 原始的 XYZ 图像。 请注意,此方法不使用点的 3D 坐标 点选择,只有它们的 2D 图像坐标。请务必注意,对于此方法,参数SampleDistance对应于以像素为单位的距离,而不是 与其他方法一样,3D 空间中的距离。

“xyz_mapping_compute_normals”:

方法“xyz_mapping_compute_normals”选择相同的点 作为方法“xyz_mapping”,但另外计算 所选所有点的法线。法线的 z 分量 向量始终为正。 如果输入对象模型包含法线,则会复制这些法线 到输出。 否则,将根据 XYZ 映射计算法线。

如果输入对象模型包含面(三角形或多边形)或 一个 3D 基元,表面是用给定的 距离。 在这种情况下,在Method被忽略。 计算法线的方向取决于 型。通常,面部的方向在一个内不会变化 CAD 模型,生成一组指向内部的法线 或向外。 请注意,平面和圆柱必须具有有限范围。 如果输入对象模型包含线条,则使用 给定的距离。

采样过程通过在 输出对象模型。 因此,将丢弃输入对象模型中的任何扩展属性。

对于混合输入对象模型,采样优先级为(从上到 底部)面、线、基元和点,即仅对象 对最高优先级进行采样。

参数SampleDistance接受任一值,即 然后用于传入的所有 3D 对象模型ObjectModel3D,或一个 每个输入对象模型的值。样本距离的单位是通常的 哈尔康-内部单元“米”.

执行信息

  • 多线程类型:可重入(与非独占运算符并行运行)。
  • 多线程范围:全局(可以从任何线程调用)。
  • 在没有并行化的情况下进行处理。

此运算符支持取消超时和中断。

参数

ObjectModel3D(input_control)object_model_3d(数组)→ (手柄)

要采样的 3D 对象模型的句柄。

Method(input_control)字符串→ (字符串)

在不同的子采样方法之间进行选择。

默认值:“ 快速”

值列表:“准确”、“accurate_use_normals”、“快”、“fast_compute_normals”、“xyz_mapping”、“xyz_mapping_compute_normals”

SampleDistance(input_control)实数(数组)→ (实数/整数)

采样距离。

元素数量: 采样距离 == 1 ||样本距离 == 对象模型3D

默认值:0.05

GenParamName(input_control)字符串数组→ (字符串)

可以调整的泛型参数的名称。

默认值:[]

值列表:“max_angle_diff”、“min_num_points”

GenParamValue(input_control)数字数组→ (实数/整数/字符串)

可以 调整。

默认值:[]

建议值:1、2、5、10、20、0.1、0.25、0.5

SampledObjectModel3D(output_control)object_model_3d(数组)→ (手柄)

包含 采样点。

元素数量: SampledObjectModel3D == ObjectModel3D

二、去除点云的离群点

什么是离群点?

离群点对应的英文是outliers,也叫外点,就是明显偏离“群众”的点,比如我们用激光扫描一面平坦的墙壁,正常情况下得到的应该是差不多也位于同一个平面的点云,但是由于设备测量误差等原因,会产生少量脱离群众的空间点,离本来的墙壁过远,我们就叫这部分点为离群点。离群点会使局部点云特征(如表面法线或曲率变化)的估计复杂化,从而导致错误的值,从而可能导致点云配准失败。而且这些离群点还会随着积累进行传导,所以要在滤波环节尽可能“消灭掉”。

————————————————

三、点云凸包计算

convex_hull_object_model_3d(操作员)

名字

convex_hull_object_model_3d— 计算 3D 对象模型的凸包。

签名

convex_hull_object_model_3d( : : ObjectModel3D : ObjectModel3DConvexHull)

描述

convex_hull_object_model_3d计算凸包 中给出的 3D 对象模型ObjectModel3D.运算符返回 凸包作为带手柄的 3D 对象模型ObjectModel3DConvexHull.

如果输入点的其中一个尺寸根本没有偏差, 结果将由直线而不是三角形组成。

执行信息

  • 多线程类型:可重入(与非独占运算符并行运行)。
  • 多线程范围:全局(可以从任何线程调用)。
  • 在没有并行化的情况下进行处理。

参数

ObjectModel3D(input_control)object_model_3d(数组)→ (手柄)

3D 对象模型的句柄。

ObjectModel3DConvexHull(output_control)object_model_3d(数组)→ (手柄)

描述的 3D 对象模型的句柄 凸包。

元素数量: ObjectModel3DConvexHull == ObjectModel3D

四、点云平滑

smooth_object_model_3d(操作员)

名字

smooth_object_model_3d— 平滑 3D 对象模型的 3D 点。

签名

smooth_object_model_3d( : : ObjectModel3D, Method, GenParamName, GenParamValue : SmoothObjectModel3D)

描述

操作员平滑 中的 3D 点smooth_object_model_3dObjectModel3D使用由 指定的方法Method.这 生成的平滑点在 中返回SmoothObjectModel3D. 目前,移动最小二乘法 (MLS) (Method=“毫升”) 是 唯一受支持的平滑方法。

对于每个点 P,MLS 平滑算法拟合平面 或到其邻域的高阶多项式曲面 (最近的点)。表面拟合是 本质上是标准的加权最小二乘参数估计 分别是平面或多项式曲面参数。这 P 的最近邻的贡献高于 其他点,由以下权重控制 带参数的函数kk:

然后将该点投影到表面上。重复此过程 所有点都会产生平滑的点集。拟合表面具有 定义良好的法线(即,它们可以很容易地从 表面参数)。因此,这些点由 相应的法线作为平滑的副作用。

通过设置GenParamName到以下值之一,附加 MLS特定参数可以通过以下方式设置GenParamValue:

“mls_kNN”:

指定最近邻数 用于将 MLS 表面拟合到每个点。k建议值:40, 60, 80, 100, 400(default)

“mls_order”:

指定 MLS 多项式曲面的顺序。为“mls_order”=1 表面是一个平面。建议值:1, 2 , 3(default)

“mls_abs_sigma”:

指定权重参数奥斯纳 以米为单位的固定绝对值。要选择的值取决于 点数据的比例。根据经验,可以选择为点 P 之间的典型距离 及其第 k/2 个邻居.请注意, 为具有变化的点数据设置绝对加权参数 密度可能会导致以下点的平滑结果不同 位于点数据中密度不同的部分。 此问题可以通过使用“mls_relative_sigma”相反,这是与规模无关的,这也使其更方便 指定邻域权重的方法。请注意,如果“mls_abs_sigma”被传递,在 中设置的任何值“mls_relative_sigma”被忽略。建议值:0.0001, 0.001, 0.01, 0.1, 1.0

“mls_relative_sigma”:

指定乘法因子用于计算对于一个点 P按公式计算:哪里是 的 k/2 个邻居 P. 请注意,与哪 是所有点的全局参数,为每个点 P 计算,因此调整 对其邻域的加权函数。这避免了以下问题: 尝试设置全局参数时可能会出现 (“mls_abs_sigma”) 到点数据 具有高度变化的点密度。但请注意,如果“mls_abs_sigma”已设置,“mls_relative_sigma”是 忽视。建议值:0.1, 0.5, 1.0 , 1.5, 2.0 (default)

“mls_force_inwards”:

如果此参数设置为“真”、所有曲面法线 定向使得它们指向“指向 起源”。用数学方式表示,可以确保 法向量与来自 指向原点的相应表面为正。这可能是 如果结果SmoothObjectModel3D被使用 对于基于表面的匹配,无论是作为模型中的模型create_surface_model或作为 3D 场景 find_surface_model,因为在这里,一致的方向 的法线对于匹配过程很重要。如果“mls_force_inwards”设置为“假”这 法向量是任意定向的。Possible values: “真” (default),“假”

执行信息

  • 多线程类型:可重入(与非独占运算符并行运行)。
  • 多线程范围:全局(可以从任何线程调用)。
  • 在内部数据级别自动并行化。

此运算符支持取消超时和中断。

参数

ObjectModel3D(input_control)object_model_3d(数组)→ (手柄)

包含 3D 点的 3D 对象模型的句柄 数据。

Method(input_control)字符串→ (字符串)

平滑方法。

默认值:“ mls”

值列表:“mls”

GenParamName(input_control)attribute.name 阵列→ (字符串)

通用平滑参数的名称。

默认值:[]

值列表:“mls_abs_sigma”、“mls_force_inwards”、“mls_kNN”、'mls_order'、“mls_relative_sigma”

GenParamValue(input_control)属性.值数组→ (实数/整数/字符串)

通用平滑参数的值。

默认值:[]

建议值:10, 20, 40, 60, 0.1, 0.5, 1.0, 2.0, 0, 1, 2

SmoothObjectModel3D(output_control)object_model_3d(数组)→ (手柄)

具有平滑 3D 的 3D 对象模型的手柄 点数据。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/267985?site
推荐阅读
相关标签
  

闽ICP备14008679号