C:\Users\Public\Documents\MVTec\HALCON-23.05-Progress\examples\hdevelop\3D-Object-Model\Features
select_object_model_3d.hdev
1、select_object_model_3d筛选
select_object_model_3d
是 HALCON 中的一个操作符,用于根据指定的条件从三维对象模型(3D Object Model)中选择满足条件的连通分量(Connected Components)。这个操作符通常用于基于某些特征(如体积、直径等)对三维物体进行筛选。
功能
- 选择连通分量:根据指定的特征条件,从输入的三维对象模型中选择满足条件的连通分量。
- 支持多种特征:可以选择基于体积、直径、颜色等特征进行筛选。
- 灵活的条件组合:可以组合多个条件,使用逻辑运算符(如
and
、or
)进行筛选。
参数
ObjectModel3D
:输入的三维对象模型句柄。Attributes
:用于选择的属性名称列表。可以是单个属性名称,也可以是多个属性名称的数组。Operation
:指定条件之间的逻辑运算符,可以是'and'
或'or'
。MinValues
:每个属性的最小值列表。MaxValues
:每个属性的最大值列表。ObjectModel3DSelected
:输出参数,存储选择后的三维对象模型的句柄。
支持的属性
'volume'
:基于体积进行选择。'diameter_object'
:基于最大直径进行选择。'color'
:基于颜色进行选择。'label'
:基于标签进行选择。- 其他扩展属性:可以使用用户定义的扩展属性进行选择。
使用示例
* 选择体积在 0.35 dm³ 到 1.0 dm³ 之间且最大直径在 185 mm 到 300 mm 之间的连通分量
MinVolume := 0.35e-003
MaxVolume := 1.0e-003
MinDiameter := 185.0e-003
MaxDiameter := 300.0e-003
select_object_model_3d (ObjectModel3D, ['volume', 'diameter_object'], 'and', [MinVolume, MinDiameter], [MaxVolume, MaxDiameter], ObjectModel3DSelected)
注意事项
- 属性匹配:
Attributes
、MinValues
和MaxValues
的长度必须一致。 - 逻辑运算符:
Operation
参数决定了条件之间的逻辑关系。如果设置为'and'
,则所有条件必须同时满足;如果设置为'or'
,则满足任意一个条件即可。 - 单位一致性:确保输入的最小值和最大值与模型中的数据单位一致。
应用场景
- 目标检测:在复杂场景中筛选出满足特定体积和尺寸的物体。
- 质量控制:在生产线上筛选出符合规格的零件。
- 数据清理:从点云数据中移除不符合条件的噪声或异常物体。
select_object_model_3d
是一个非常强大的工具,可以帮助用户根据特定的特征条件从三维对象模型中筛选出感兴趣的物体。
2、connection_object_model_3d连通域
connection_object_model_3d
是 HALCON 中的一个操作符,用于确定三维对象模型(3D Object Model)中的连通分量。以下是该操作符的详细说明:
功能
- 确定连通分量:根据指定的属性和距离函数,将输入的三维对象模型中的点或几何元素划分为不同的连通分量。
- 支持多种属性:可以基于不同的属性(如三维距离、角度、网格连接等)来判断连通性。
参数
ObjectModel3D
:输入的三维对象模型句柄。Feature
:用于计算连通分量的属性。可选值包括:'distance_3d'
:基于三维点坐标之间的欧几里得距离判断连通性。'angle'
:基于点的法向量之间的角度判断连通性。'distance_mapping'
:基于二维映射中的像素坐标距离判断连通性。'mesh'
:基于网格(三角形或多边形)判断连通性。'lines'
:基于线条判断连通性。
Value
:指定两个连通分量之间的最大距离值。对于某些属性(如'mesh'
和'lines'
),该参数被忽略。ObjectModel3DConnected
:输出参数,存储表示连通分量的三维对象模型的句柄。
使用示例
* 基于三维距离计算连通分量
connection_object_model_3d (ObjectModel3D, 'distance_3d', 0.2, ObjectModel3DConnected)
注意事项
- 属性要求:某些属性(如
'angle'
和'distance_mapping'
)需要模型中包含特定的数据(如法向量或二维映射)。 - 内存管理:如果不再需要某个三维对象模型,应使用
clear_object_model_3d
释放其占用的内存。
connection_object_model_3d
是一个强大的工具,可用于基于不同的几何属性对三维对象模型进行分割和分析。
3、volume_object_model_3d_relative_to_plane体积
volume_object_model_3d_relative_to_plane
是 HALCON 中的一个操作符,用于计算三维对象模型(3D Object Model)相对于指定平面的体积。以下是该操作符的详细说明:
功能
- 计算体积:计算三维对象模型相对于指定平面的体积。可以选择计算位于平面之上、平面之下或两者的组合体积。
- 支持带符号体积:可以选择是否考虑面的方向来影响体积的符号。
参数
ObjectModel3D
:输入的三维对象模型句柄。Plane
:指定平面的姿态,通常是一个包含位置和方向的数组。Mode
:指定如何组合位于参考平面上方和下方的体积。可选值包括:'negative'
:仅计算负体积(平面以下)。'positive'
:仅计算正体积(平面以上)。'signed'
:计算带符号的体积(考虑正负)。'unsigned'
:计算无符号的总体积。
UseFaceOrientation
:决定是否使用面的方向来影响体积的符号。可选值为'true'
或'false'
。Volume
:输出参数,存储计算出的体积。
使用示例
* 计算相对于平面的带符号体积
volume_object_model_3d_relative_to_plane (ObjectModel3D, [0,0,0,0,0,0,0], 'signed', 'true', Volume)
注意事项
- 平面定义:
Plane
参数定义了参考平面的位置和方向,通常是一个包含 7 个元素的数组。 - 面的方向:当
UseFaceOrientation
设置为'true'
时,面的方向会影响体积的符号。 - 体积符号:在
'signed'
模式下,体积可以是正数或负数,具体取决于模型相对于平面的位置。
volume_object_model_3d_relative_to_plane
是一个强大的工具,可用于基于特定平面分析三维模型的体积特征。
4、max_diameter_object_model_3d外接直径
max_diameter_object_model_3d
是 HALCON 中的一个操作符,用于计算三维对象模型(3D Object Model)的最大直径。最大直径是指模型中任意两点之间的最大距离。
功能
- 计算最大直径:计算三维对象模型中任意两点之间的最大距离。
- 支持多种输入:可以处理包含点、三角形或多边形的三维对象模型。
参数
ObjectModel3D
:输入的三维对象模型句柄。Diameter
:输出参数,存储计算出的最大直径。
使用示例
* 计算三维对象模型的最大直径
max_diameter_object_model_3d (ObjectModel3D, Diameter)
注意事项
- 模型要求:输入的三维对象模型必须包含点、三角形或多边形数据。如果模型为空或不包含这些数据,操作符将返回错误。
- 性能:计算最大直径可能需要一定的计算时间,具体取决于模型的复杂性和点的数量。
- 单位:计算结果的单位与输入模型的单位一致,通常是毫米(mm)。
应用场景
- 尺寸测量:在工业检测中,计算零件的最大尺寸以确保其符合规格。
- 模型分析:在三维建模中,评估模型的尺寸范围。
- 目标识别:在复杂场景中,通过最大直径筛选出符合特定尺寸要求的物体。
max_diameter_object_model_3d
是一个非常实用的操作符,可以帮助用户快速了解三维对象模型的尺寸特征。
5、xyz_to_object_model_3d
xyz_to_object_model_3d
是 HALCON 中的一个操作符,用于将包含三维点的 X、Y 和 Z 坐标的图像三元组转换为三维对象模型(3D Object Model)。以下是该操作符的详细说明:
功能
- 转换图像到3D模型:将包含三维点的 X、Y 和 Z 坐标的图像转换为一个三维对象模型。
- 支持映射属性:创建的三维对象模型包含点的坐标,以及每个三维点的原始行和列的映射属性。
- 忽略无效点:如果某个点的坐标为无穷大或“非数字”(NaN),则该点将被忽略,不会添加到三维对象模型中。
参数
X
:输入图像,包含三维点的 X 坐标。Y
:输入图像,包含三维点的 Y 坐标。Z
:输入图像,包含三维点的 Z 坐标。ObjectModel3D
:输出参数,返回创建的三维对象模型的句柄。
使用示例
* 将 X、Y 和 Z 坐标的图像转换为三维对象模型
xyz_to_object_model_3d (X, Y, Z, ObjectModel3D)
注意事项
- 图像大小一致:输入的 X、Y 和 Z 图像必须具有相同的大小。
- 内存管理:如果不再需要某个三维对象模型,应使用
clear_object_model_3d
释放其占用的内存。 - 映射属性:创建的三维对象模型包含映射属性,这些属性可以使用
get_object_model_3d_params
查询。
应用场景
- 3D点云处理:将从传感器获取的 X、Y 和 Z 坐标图像转换为三维对象模型,以便进行后续处理。
- 3D建模:在三维建模中,将图像数据转换为三维模型,用于进一步的分析和操作。
- 3D匹配和分割:在进行三维匹配或分割操作之前,使用该操作符将图像数据转换为三维对象模型。
xyz_to_object_model_3d
是一个非常重要的操作符,用于将图像数据转换为三维对象模型,为后续的三维处理任务提供基础。
6、prepare_object_model_3d
prepare_object_model_3d
是 HALCON 中的一个操作符,用于对三维对象模型(3D Object Model)进行预处理,以优化后续的处理和分析。这个操作符主要用于准备模型以便进行分割、匹配或其他高级操作。
功能
- 预处理模型:对输入的三维对象模型进行预处理,以优化后续操作的性能和结果。
- 支持多种模式:可以根据指定的模式进行不同的预处理操作,例如分割、匹配等。
参数
ObjectModel3D
:输入的三维对象模型句柄。Mode
:指定预处理的模式。可选值包括:'segmentation'
:准备模型以便进行分割操作。'matching'
:准备模型以便进行匹配操作。
GenParamName
和GenParamValue
:通用参数的名称和值,用于进一步配置预处理操作。这些参数的具体含义取决于Mode
的值。
使用示例
* 准备模型以便进行分割操作
prepare_object_model_3d (ObjectModel3D, 'segmentation', [], [])
注意事项
- 模式选择:根据具体需求选择合适的模式。例如,如果需要进行分割操作,应选择
'segmentation'
模式。 - 通用参数:
GenParamName
和GenParamValue
参数可以用于进一步配置预处理操作。具体参数的含义需要参考 HALCON 的官方文档。 - 性能优化:预处理操作可以显著提高后续操作的性能和结果质量,尤其是在处理复杂的三维模型时。
应用场景
- 分割操作:在进行三维对象模型的分割操作之前,使用
'segmentation'
模式进行预处理。 - 匹配操作:在进行三维对象模型的匹配操作之前,使用
'matching'
模式进行预处理。 - 模型优化:通过预处理操作,优化模型的结构和数据,以便进行更高效的分析和处理。
prepare_object_model_3d
是一个非常重要的操作符,可以帮助用户为后续的三维处理任务做好准备,提高处理效率和结果质量。
7、select_points_object_model_3d
select_points_object_model_3d
是 HALCON 中的一个操作符,用于根据指定的属性和阈值范围筛选三维对象模型中的点。
功能
- 筛选点云:根据指定的属性(如点的坐标、法向量等)和阈值范围,从三维对象模型中筛选出满足条件的点。
- 支持多种属性:可以基于点的 (X)、(Y)、(Z) 坐标,法向量的 (X)、(Y)、(Z) 坐标等属性进行筛选。
参数
ObjectModel3D
:输入的三维对象模型句柄。Attrib
:指定用于筛选的属性名称。默认值为'point_coord_z'
,表示基于点的 (Z) 坐标进行筛选。MinValue
:指定属性的最小值。MaxValue
:指定属性的最大值。ObjectModel3DThresholded
:输出参数,筛选后的三维对象模型句柄。
使用示例
* 基于点的 Z 坐标筛选点云
select_points_object_model_3d (ObjectModel3D, 'point_coord_z', 122, 150, ObjectModel3DThresholded)
此示例将筛选出 (Z) 坐标在 122 到 150 范围内的点。
注意事项
- 属性选择:
Attrib
参数可以指定多种属性,如'point_coord_x'
、'point_coord_y'
、'point_coord_z'
(点的坐标),或'normal_x'
、'normal_y'
、'normal_z'
(法向量坐标)。 - 阈值范围:
MinValue
和MaxValue
参数定义了筛选的阈值范围,只有满足此范围内的点才会被保留。
应用场景
- 点云处理:在处理点云数据时,可以根据特定的坐标范围或法向量方向筛选出感兴趣的点。
- 目标检测:通过筛选特定区域的点云,可以检测出目标物体。
- 数据清理:移除不符合条件的噪声点。
select_points_object_model_3d
是一个非常实用的操作符,可以帮助用户根据特定的属性和阈值范围对三维点云进行筛选,从而提取出感兴趣的部分。
8、get_object_model_3d_params
get_object_model_3d_params
是 HALCON 中的一个操作符,用于查询三维对象模型(3D Object Model)的各种参数和属性。这个操作符可以获取模型的标准属性、扩展属性以及与模型相关的其他信息。
功能
- 查询属性:获取三维对象模型的指定属性值。
- 支持多种属性:可以查询标准属性(如点的坐标、法向量、颜色等)或用户定义的扩展属性。
- 灵活的查询方式:可以通过指定属性名称来查询单个属性,也可以查询多个属性。
参数
ObjectModel3D
:输入的三维对象模型句柄。ParamName
:要查询的属性名称。可以是单个属性名称,也可以是多个属性名称的数组。ParamValue
:输出参数,存储查询到的属性值。
支持的属性
以下是一些可以通过 ParamName
参数查询的属性名称:
'point'
:查询模型中的点坐标。'point_normal'
:查询点的法向量。'point_color'
:查询点的颜色。'point_index'
:查询点的索引。'triangle'
:查询模型中的三角形。'triangle_normal'
:查询三角形的法向量。'triangle_index'
:查询三角形的索引。'polygon'
:查询模型中的多边形。'line'
:查询模型中的线。'extended_attribute'
:查询用户定义的扩展属性。'xyz_mapping'
:查询与图像坐标的映射。'pose'
:查询模型的姿态。'num_points'
:查询模型中的点数。'num_triangles'
:查询模型中的三角形数量。'num_polygons'
:查询模型中的多边形数量。'num_lines'
:查询模型中的线数量。
使用示例
* 查询模型中的点数
get_object_model_3d_params (ObjectModel3D, 'num_points', NumPoints)
* 查询模型中的点坐标
get_object_model_3d_params (ObjectModel3D, 'point', Points)
* 查询用户定义的扩展属性
get_object_model_3d_params (ObjectModel3D, 'extended_attribute', 'my_attribute', MyAttributeValue)
注意事项
- 属性存在性:如果查询的属性不存在,操作符会返回错误。因此,在查询之前可以使用
has_object_model_3d_params
检查属性是否存在。 - 返回值类型:查询到的属性值类型取决于属性本身,可能是数值、数组或字符串。
- 扩展属性:扩展属性是用户定义的属性,可以通过
set_object_model_3d_attrib
或set_object_model_3d_attrib_mod
设置。
应用场景
- 模型分析:在处理三维模型时,可以通过查询属性来获取模型的详细信息,例如点数、三角形数量等。
- 数据提取:从模型中提取特定的几何数据,例如点坐标、法向量等。
- 模型验证:在处理模型之前,可以通过查询属性来验证模型是否符合预期。
- 自定义属性:查询用户定义的扩展属性,用于存储和检索模型的自定义信息。
get_object_model_3d_params
是一个非常强大的工具,可以帮助用户获取三维对象模型的各种参数和属性,从而更好地理解和处理三维数据。
9、
hom_mat3d_identity
是 HALCON 中的一个操作符,用于生成一个 3D 单位齐次变换矩阵。这个矩阵在三维空间变换中非常基础且重要,因为它表示没有任何变换(即平移为零,旋转为零)的状态。以下是其详细说明和应用:
功能
- 生成单位矩阵:
hom_mat3d_identity
生成一个 4x4 的单位齐次变换矩阵。这个矩阵的所有对角线元素为 1,其余元素为 0。 - 基础变换矩阵:单位矩阵是所有变换的起点。任何变换矩阵都可以通过修改单位矩阵的元素来实现。
参数
HomMat3DIdentity
:输出参数,存储生成的单位齐次变换矩阵。
使用示例
hom_mat3d_identity (HomMat3DIdentity)
此代码将生成一个 4x4 的单位齐次变换矩阵,并将其存储在变量 HomMat3DIdentity
中。
在三维对象模型中的应用
- 初始化变换:在对三维对象模型进行变换之前,通常需要一个基础的变换矩阵。
hom_mat3d_identity
提供了这样一个基础矩阵,后续可以通过其他操作符(如hom_mat3d_translate
、hom_mat3d_rotate
)对其进行修改。 - 重置变换:如果需要重置一个变换矩阵到初始状态,可以使用
hom_mat3d_identity
。 - 组合变换:在组合多个变换时,单位矩阵可以用作初始状态或中间状态。
示例代码
以下是一个完整的示例,展示如何使用 hom_mat3d_identity
初始化一个变换矩阵,然后对其进行平移和旋转操作:
* 初始化单位变换矩阵
hom_mat3d_identity (HomMat3DIdentity)
* 对单位矩阵应用平移变换
hom_mat3d_translate (HomMat3DIdentity, 10, 20, 30, HomMat3DTranslate)
* 对平移后的矩阵应用旋转变换
hom_mat3d_rotate (HomMat3DTranslate, 45, [1, 0, 0], 0, 0, 0, HomMat3DRotate)
hom_mat3d_identity
是三维变换操作中的一个基础工具,广泛应用于初始化、重置和组合变换操作中。
10、hom_mat3d_translate
hom_mat3d_translate
是 HALCON 中的一个操作符,用于在三维空间中对齐次变换矩阵(Homogeneous Transformation Matrix)应用平移变换。齐次变换矩阵是一种 4x4 的矩阵,用于表示三维空间中的平移、旋转和缩放等变换。
功能
- 平移变换:对输入的齐次变换矩阵应用指定的平移变换。
- 修改矩阵:平移变换会修改输入矩阵的平移部分,而不影响旋转部分。
参数
HomMat3D
:输入的齐次变换矩阵。Tx
:沿 (X) 轴的平移量。Ty
:沿 (Y) 轴的平移量。Tz
:沿 (Z) 轴的平移量。HomMat3DTranslate
:输出参数,存储应用平移变换后的齐次变换矩阵。
使用示例
* 初始化单位变换矩阵
hom_mat3d_identity (HomMat3DIdentity)
* 应用平移变换
hom_mat3d_translate (HomMat3DIdentity, 10, 20, 30, HomMat3DTranslate)
此示例将初始化一个单位变换矩阵,然后沿 (X) 轴平移 10 个单位,沿 (Y) 轴平移 20 个单位,沿 (Z) 轴平移 30 个单位。
注意事项
- 单位一致性:平移量的单位应与模型的单位一致,通常是毫米(mm)。
- 矩阵修改:
hom_mat3d_translate
会直接修改输入的齐次变换矩阵。如果需要保留原始矩阵,可以先使用hom_mat3d_copy
创建一个副本。 - 组合变换:可以将平移变换与其他变换(如旋转、缩放)组合,以实现复杂的变换效果。
应用场景
- 三维对象变换:在三维空间中对对象进行平移操作。
- 机器人运动规划:在机器人路径规划中,对工具或关节进行平移变换。
- 三维建模:在三维建模中,对模型进行平移以调整其位置。
- 视觉系统校准:在视觉系统中,对相机或物体进行平移变换以调整其位置。
hom_mat3d_translate
是一个非常基础且重要的操作符,用于在三维空间中对齐次变换矩阵应用平移变换。
11、hom_mat3d_invert
hom_mat3d_invert
是 HALCON 中的一个操作符,用于计算齐次变换矩阵(Homogeneous Transformation Matrix)的逆矩阵。齐次变换矩阵是一种 4×4 的矩阵,用于表示三维空间中的平移、旋转和缩放等变换。逆矩阵可以用于撤销或反转这些变换。
功能
- 计算逆矩阵:计算输入的齐次变换矩阵的逆矩阵。
- 撤销变换:逆矩阵可以用于撤销或反转输入矩阵所表示的变换。
参数
HomMat3D
:输入的齐次变换矩阵。HomMat3DInvert
:输出参数,存储计算出的逆矩阵。
使用示例
* 初始化单位变换矩阵
hom_mat3d_identity (HomMat3DIdentity)
* 应用平移变换
hom_mat3d_translate (HomMat3DIdentity, 10, 20, 30, HomMat3DTranslate)
* 计算逆矩阵
hom_mat3d_invert (HomMat3DTranslate, HomMat3DInvert)
此示例首先创建一个单位变换矩阵,然后对其应用平移变换,最后计算该变换矩阵的逆矩阵。
注意事项
- 矩阵可逆性:只有可逆的矩阵(即行列式不为零的矩阵)才有逆矩阵。在大多数情况下,齐次变换矩阵是可逆的,但如果矩阵表示的变换是奇异的(例如,缩放因子为零),则可能无法计算逆矩阵。
- 逆矩阵的用途:逆矩阵可以用于撤销变换。例如,如果一个对象被平移和旋转,逆矩阵可以将对象恢复到原始位置和方向。
- 组合变换:如果需要对多个变换进行反转,可以先计算每个变换的逆矩阵,然后按相反的顺序组合它们。
应用场景
- 撤销变换:在三维建模或机器人运动规划中,撤销或反转对象的变换。
- 相机校准:在计算机视觉中,计算相机变换的逆矩阵以调整图像或点云数据。
- 路径规划:在机器人路径规划中,计算逆矩阵以调整工具或关节的位置和方向。
hom_mat3d_invert
是一个非常重要的操作符,用于计算齐次变换矩阵的逆矩阵,从而实现变换的反转。
12、affine_trans_object_model_3d
affine_trans_object_model_3d
是 HALCON 中的一个操作符,用于将任意仿射 3D 变换应用于 3D 物体模型。以下是其功能和使用方法的详细说明:
功能
- 应用仿射变换:对输入的 3D 物体模型应用指定的齐次变换矩阵(4×4 的齐次变换矩阵),实现平移、旋转、缩放等变换。
- 支持多种变换:可以对点云数据进行变换,但不支持对 3D 原语(如圆柱体、球体等)进行变换。
参数
ObjectModel3D
:输入的 3D 物体模型句柄。HomMat3D
:齐次变换矩阵,用于定义要应用的仿射变换。ObjectModel3DAffineTrans
:输出参数,存储变换后的 3D 物体模型句柄。
使用示例
* 初始化单位变换矩阵
hom_mat3d_identity (HomMat3DIdentity)
* 应用平移变换
hom_mat3d_translate (HomMat3DIdentity, 10, 20, 30, HomMat3DTranslate)
* 应用仿射变换到 3D 物体模型
affine_trans_object_model_3d (ObjectModel3D, HomMat3DTranslate, ObjectModel3DAffineTrans)
此示例首先创建一个单位变换矩阵,然后对其应用平移变换,最后将该变换应用到 3D 物体模型。
注意事项
- 变换矩阵的生成:需要先生成或计算出齐次变换矩阵,可以使用如
hom_mat3d_translate
、hom_mat3d_rotate
等操作符来构建。 - 模型类型限制:该操作符主要适用于包含点集的 3D 模型,对于由几何原语(如圆柱体、球体等)组成的模型可能不适用。
应用场景
- 三维建模:在三维建模中,对模型进行平移、旋转和缩放操作。
- 机器人运动规划:在机器人路径规划中,调整工具或关节的位置和方向。
- 视觉系统校准:在计算机视觉中,调整相机或物体的位置和方向。
affine_trans_object_model_3d
是一个强大的操作符,能够对 3D 物体模型进行复杂的仿射变换,广泛应用于各种三维处理任务中。
程序说明:
灰度和Z高度
decompose3 (Image, X, Y, Z)可以把图分为X,Y,Z平面
再用xyz_to_object_model_3d (X, Y, Z, ObjectModel3DID)
将X,Y,Z,转化为一个3D模型
- 为模型计算网格(Delauney 三角化)
prepare_object_model_3d (ObjectModel3DID, ‘segmentation’, ‘true’, [], [])
显示3D
上一个3D模型,筛选最小最大值Z区间。提取并显示select_points_object_model_3d
这里有points
MinValue := 0.500
MaxValue := 0.670
select_points_object_model_3d (ObjectModel3DID, ‘point_coord_z’,
MinValue, MaxValue, ObjectModel3DIDReduced)
提取Z范围
提取得到ObjectModel3DIDReduced,此3D物体
connection_object_model_3d (ObjectModel3DIDReduced, ‘distance_3d’,
0.010, ObjectModel3DIDConnections)
将上一步提取得到进行连通域,将 'distance_3d距离小于0.01的合并为一个连通域中,得到ObjectModel3DIDConnections
volume_object_model_3d_relative_to_plane (ObjectModel3DIDConnections,
[0, 0,MaxValue,0, 0, 0, 0],
‘signed’, ‘true’, Volume)
将ObjectModel3DIDConnections获取的连通域,计算到体积。
max_diameter_object_model_3d (ObjectModel3DIDConnections, Diameter)
将ObjectModel3DIDConnections获取的连通域,计算到外接直径。
静下心看看这一段
筛选到设定的体积和高度的物体并显示
* ************************************************************
*本示例程序展示了如何在 HALCON 中使用以下操作符:
* connection_object_model_3d 和 select_object_model_3d。
* 首先,对三维物体模型应用阈值操作。然后,基于几何距离计算连通分量。
* 最后,根据体积和直径选择连通分量,并显示结果。
* ************************************************************
* 关闭实时更新
dev_update_off ()
* 关闭当前窗口
dev_close_window ()
* 加载 X,Y,Z 数据,将其缩放到米,并生成一个三维物体模型
ImagePath := 'time_of_flight/'
read_image (Image, ImagePath + 'engine_cover_xyz_01')
scale_image (Image, Image, .001, .0)
zoom_image_factor (Image, Image, 2, 2, 'constant')
decompose3 (Image, X, Y, Z)
xyz_to_object_model_3d (X, Y, Z, ObjectModel3DID)
* 为模型计算网格(Delauney 三角化)
prepare_object_model_3d (ObjectModel3DID, 'segmentation', 'true', [], [])
*
* 准备可视化并显示三维物体模型
create_pose (0.058, -0.165, 0.660, 345.0, 355.0, 356.0, 'Rp+T', 'gba', 'point', Pose)
*
* * visualize_object_model_3d 的指令
Instructions[0] := 'Rotate: Left button'
Instructions[1] := 'Zoom: Shift + left button'
Instructions[2] := 'Move: Ctrl + left button'
* * 配置
gen_cam_par_area_scan_division (0.01, 0, 7e-6, 7e-6, 352, 288, 710, 576, CamParam)
GenParamName := ['color', 'disp_pose', 'alpha']
GenParamValue := ['green', 'false', 0.8]
* * 打开窗口
dev_open_window (0, 0, 510, 376, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
* * 显示三维物体模型
visualize_object_model_3d (WindowHandle, ObjectModel3DID, CamParam, Pose, GenParamName, GenParamValue, 'This scene will be segmented into single objects', [], Instructions, Pose)
*
** 对三维物体模型应用阈值
MinValue := 0.500
MaxValue := 0.670
select_points_object_model_3d (ObjectModel3DID, 'point_coord_z', MinValue, MaxValue, ObjectModel3DIDReduced)
visualize_object_model_3d (WindowHandle, ObjectModel3DIDReduced, CamParam, Pose, GenParamName, GenParamValue, 'Result after thresholding at z=' + (MaxValue * 1e3)$'.3' + 'mm from the camera', [], Instructions, Pose)
*
* 计算连通分量以及每个结果物体的体积和直径
GenParamName[0] := 'colored'
GenParamValue[0] := 12
connection_object_model_3d (ObjectModel3DIDReduced, 'distance_3d', 0.010, ObjectModel3DIDConnections)
volume_object_model_3d_relative_to_plane (ObjectModel3DIDConnections, [0, 0,MaxValue,0, 0, 0, 0], 'signed', 'true', Volume)
max_diameter_object_model_3d (ObjectModel3DIDConnections, Diameter)
*
* 显示结果
dev_open_window (0, 720, 400, 576, 'black', WindowHandle1)
set_display_font (WindowHandle1, 14, 'mono', 'true', 'false')
Indices := [0:|ObjectModel3DIDConnections| - 1]
disp_message (WindowHandle1, ['Features of the connected components:', ' ', ' '], 'window', 12, 12, 'white', 'false')
ResultMessage := ' # Max. diameter Volume'
Sequence := [0:|ObjectModel3DIDConnections| - 1]
ResultMessage := [ResultMessage,Sequence$' 3' + ' ' + (Diameter * 1e3)$'7.1f' + ' mm ' + (Volume * 1e3)$'7.3f' + ' dm³']
disp_message (WindowHandle1, ResultMessage, 'window', 50, 12, 'white', 'false')
dev_set_window (WindowHandle)
visualize_object_model_3d (WindowHandle, ObjectModel3DIDConnections, CamParam, Pose, GenParamName, GenParamValue, 'Found ' + |ObjectModel3DIDConnections| + ' connected components', '#' + Indices, Instructions, Pose)
*
* * 根据体积和最大直径选择组件
MinVolume := 0.35e-003
MaxVolume := 1.0e-003
MinDiameter := 185.0e-003
MaxDiameter := 300.0e-003
* *** 注意:
* select_object_model_3d 使用平面 [0,0,0,0,0,0]
* 进行体积计算!因此我们需要
* 转换三维物体模型,以便
* 参考平面(如前一个调用 volume_object_model_3d_relative_to_plane 中定义的)与
* 默认平面重合。
hom_mat3d_identity (HomMat3DIdentity)
hom_mat3d_translate (HomMat3DIdentity, 0, 0, -MaxValue, HomMat3DTranslation)
hom_mat3d_invert (HomMat3DTranslation, HomMat3DInvert)
affine_trans_object_model_3d (ObjectModel3DIDConnections, HomMat3DTranslation, ObjectModel3DTranslated)
* 为每个部分设置标签
for Index := 0 to |ObjectModel3DIDConnections| - 1 by 1
set_object_model_3d_attrib_mod (ObjectModel3DTranslated[Index], '&Index', [], Index)
endfor
*
volume_object_model_3d_relative_to_plane (ObjectModel3DTranslated, [0, 0, 0, 0, 0, 0, 0], 'signed', 'true', Volume1)
select_object_model_3d (ObjectModel3DTranslated, ['volume', 'diameter_object'], 'and', [MinVolume,MinDiameter], [MaxVolume,MaxDiameter], ObjectModel3DSelected)
*
Title := ['Parts selected by using the following features: ',' ' + (MinVolume * 1e3)$'3.1f' + ' dm³ <= volume <= ' + (MaxVolume * 1e3)$'3.1f' + ' dm³','and: ' + (MinDiameter * 1e3)$'.1f' + ' mm <= max. diameter <= ' + (MaxDiameter * 1e3)$'.1f' + ' mm']
* 创建标题
Label := []
for Index := 0 to |ObjectModel3DSelected| - 1 by 1
get_object_model_3d_params (ObjectModel3DSelected[Index], '&Index', FormerIndex)
Label := [Label,'#' + FormerIndex]
endfor
* * 如果有多个物体被选中,则显示
if (|ObjectModel3DSelected| > 1)
visualize_object_model_3d (WindowHandle, ObjectModel3DSelected, CamParam, [], GenParamName, GenParamValue, Title, Label, Instructions, Pose)
else
Message := 'No object left after using the following features: '
Message[1] := ' ' + (MinVolume * 1e3)$'3.1f' + ' dm³ <= volume <= ' + (MaxVolume * 1e3)$'3.1f' + ' dm³'
Message[2] := 'and: ' + (MinDiameter * 1e3)$'.1f' + ' mm <= max. diameter <= ' + (MaxDiameter * 1e3)$'.1f' + ' mm'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
endif
*
dev_set_window (WindowHandle1)
dev_close_window ()