官方英文文档原文:https://www.mvtec.com/doc/halcon/2005/en/find_box_3d.html
函数原型
find_box_3d( : : ObjectModel3DScene, SideLen1, SideLen2, SideLen3, MinScore, GenParam : GrippingPose, Score, ObjectModel3DBox, BoxInformation)
输入参数为:
ObjectModel3DScene,
SideLen1, SideLen2, SideLen3, MinScore, GenParam
输出参数为:GrippingPose, Score, ObjectModel3DBox, BoxInformation
find_box_3d函数的作用是
在3D场景ObjectModel3DScene
中寻找盒状物。为每个找到的盒子ObjectModel3DBox
返回抓取点的姿态 GrippingPose
、得分值Score
和盒子的相关信息,这些信息保存在字典BoxInformation
中。
对于输入参数 SideLen1
, SideLen2
, and SideLen3中。
每个长度由两个值的组成,表示该边的最小和最大长度。如果场景中只看到盒子的一个面,或者对盒子的第三维长度没有限制,SideLen3
可以将其设置为-1。
MinScore
该参数设置要返回的盒子的最低分数。分数小于此值的盒子将被舍弃。
ObjectModel3DScene
必须包含一个XYZ映射,例如可以使用函数 xyz_to_object_model_3d创建。
典型工作流程
关于返回值及Results
在GrippingPose
中返回抓取点的姿势。抓取点的Z轴和抓取面是根据点云的XYZ映射图得到的。如果仅能看到箱子的一个面,则抓握姿势的中心位于该面的中心,并且其Z轴的方向沿相机光轴远离视点的方向。如果一个视野里可以看到箱子的多个平面,则抓取姿势位于最垂直于视点的面的中心,( the gripping pose lies in the center of the side that is most parallel to the viewing point of the XYZ-mapping)。
Z轴定向为沿相机光轴远离视点的方向。抓取点的X轴方向为最平行于点云平面的列坐标的方向(The x-axis of the gripping pose is set to the box axis that is roughly the most aligned with the column direction of the XYZ-mapping. ) y轴是根据x轴和z轴计算的。
识别出来的盒子还以三角形式返回ObjectModel3DBox
。方便用来快速显示结果。
对于找到的每个盒子,在 Score返回值
中返回0到1之间的一个分数。该分数表示盒子及其边缘的可见程度的得分,以及找到的盒子与指定尺寸的匹配程度。
最后,有关结果的其他信息将在返回值BoxInformation
中返回。
Generic Parameters
可以在字典中将其他参数作为键/元组对传递, 以改善匹配结果。
'3d_edges'
:
允许手动设置3D场景边缘。参数必须是3D对象模型句柄。
'3d_edge_min_amplitude'
:
设置不连续的最小幅度,以便将其分类为边。请注意,如果使用通用参数手动传递了边,则将 忽略此参数。
Default value: 10% of the smallest box diagonal.
'remove_outer_edges'
:
设置为'true'时,删除最外面的边缘。例如,这对于从箱子中拣选应用程序很有帮助,以便删除外围箱子。
'max_num_boxes'
:
限制返回的框数。
'box_type'
:
设置要搜索的框的类型。对于“ full_box_visible”,仅返回可见面大于一个的箱子。如果设置了“ single_side_visible”,则仅搜索具有一侧可见面的箱子。如果仍然可以看到更多的盒子侧面,则将其忽略。对于“全部”,将返回两种类型。
Troubleshooting
要调试该算法,可以使用返回的字典中的数据来可视化一些内部使用的数据 。The sampled 3D scene can be extracted with the key 'sampled_scene'
.查找较小的盒子需要更密集的采样,从而减慢盒子的检测速度。采样的3D边缘可以利用参数'sampled_edges'
and 'sampled_edges_directions'来获得。它们
包含相同的点。但是,'sampled_edges' 包含法线向量为相机光轴方向,而 'sampled_edges_directions'包含边缘点的法线向量。请注意,边缘方向应垂直于边缘,并指向盒子的外部。
Improve performance:
如果花费的时间太长,则以下步骤可能有助于提高其性能。 find_box_3d
-
消除更多的背景和杂物:通常可以通过尽可能多地消除3D场景中的背景和杂物来显着提高运行时间和检测精度。
删除不需要的数据的最常见方法是:
- 增加最低分数:
- 增加可能的最小框:可能的最小框边越小,运行速度越慢 。例如,如果通常从一个侧面看到所有框,则将
SideLen3
设置为-1可能很有意义。此外,可以设置为限制搜索框的类型'box_type'。 - 手动计算和过滤边缘:可以使用手动提取场景的边缘
edges_object_model_3d
,并使用参数“ 3d_edges” 传递给场景 。因此,手动提取可用作进一步过滤边缘的方法。
个人总结:
find_box_3d 如果一个场景中都是同种箱子,很有优势,但是事先需要准确设定目标的长宽高范围 。如果一个场景中是不同长度的目标,可以使用多个查找表,但是速度会慢,误识别也会增多。