halcon3D学习备份

目录
xyz_to_object_model_3d 1
gen_object_model_3d_from_points 1
object_model_3d_to_xyz 2
segment_object_model_3d 2
prepare_object_model_3d 4
distance_object_model_3d 5
area_object_model_3d 7
project_object_model_3d 8
surface_normals_object_model_3d 9
sample_object_model_3d 10
simplify_object_model_3d 11
moments_object_model_3d 13
edges_object_model_3d 13
fuse_object_model_3d 14
intersect_plane_object_model_3d 15
connection_object_model_3d 15
set_object_model_3d_attrib 16
projective_trans_object_model_3d 17
render_object_model_3d 17
rigid_trans_object_model_3d 17

xyz_to_object_model_3d
操作符xyz_to_object_model_3d将包含3D点的X、Y和z坐标的图像三元组转换为3D对象模型。只使用三幅图像相交区域中的点。创建的3D对象模型的句柄在ObjectModel3D中返回。创建的3D对象模型包含这些点的坐标,以及一个映射属性,该属性包含每个3D点的原始行和列。其中一个坐标为无穷大或“非数字”(NaN)的点被忽略,不添加到3D对象模型中。
注意,如果不再需要3D对象模型或应该重写,则必须首先通过调用操作符clear_object_model_3d来释放内存。

gen_object_model_3d_from_points

gen_object_model_3d_from_points创建一个表示点云的3D对象模型。这些点用参数x、y和Z中的x-、y-和Z坐标来描述。

object_model_3d_to_xyz
cartesian笛卡尔的
首先,使用给定的姿态将每个点转换为摄像机坐标系统。然后,将这些坐标投影到基于摄像机内部参数CamParam的图像坐标系中。
相机内部参数CamParam描述了相机的投影特性(参见calibrate_cameras)。姿态描述了世界坐标系相对于摄像机坐标系的位置和方向。
变换后的点的X-, Y-和z -坐标被写进投影位置对应的图像。如果多个点投影到相同的图像坐标上,则将z值最小的点写为(移除隐藏点)。返回图像的尺寸由相机参数定义。
返回的图像显示物体在指定姿势下使用指定摄像机时的样子。
from_xyz_map
只有使用操作符xyz_to_object_model_3d创建3D对象模型时,此转换模式才有效。它使用存储在3D对象模型中的映射属性,将每个3D点写入其最初来源的图像坐标。
参数CamParam和Pose被忽略。返回的图像的尺寸等于xyz_to_object_model_3d用于创建3D对象模型的原始图像的尺寸。
这种转换模式比“笛卡尔”转换模式要快。例如,它适用于可视化使用segment_object_model_3d完成的分段结果。

segment_object_model_3d
将一组三维点分割成具有相似特征的子集。
操作符segment_object_model_3d将3D对象模型给出的一组3D点分段为相邻3D点的几个子集,这些3D点具有类似的特征,如相同的法线方向或曲率。默认情况下,该操作符将尝试将一个3D原语,即一个简单的3D形状(如平面、球体或圆柱体)放入这些子集中。因此,该操作符返回一个表示3D点的各个子集(ObjectModel3DOut)的3D对象模型句柄元组。在这些三维对象模型中存储了与拟合成功、拟合的三维基元的类型和参数有关的信息。这个信息可以通过get_object_model_3d_params从单个3D对象模型中查询。
在调用segment_object_model_3d之前,应该使用操作符prepare_object_model_3d准备输入的3D对象模型,并将参数目的设置为“segmentation”。如果输入3D对象模型不是以这种方式准备的,那么在segment_object_model_3d内部调用操作符prepare_object_model_3d,以使用3D对象模型中不显式但仅隐式包含的属性扩展3D对象模型。
为了控制分段和拟合,可以调整GenParamName和GenParamValue中的一些泛型参数。但请注意,对于许多应用程序,默认值就足够了,不需要调整。GenParamName和GenParamValue可以取值如下:
max_orientation_diff:最大法向量方向偏差
该参数指定允许的两个相邻3D点(以弧度计)的点法线之间的最大角度,以便这两个点属于3D点的同一子集。对于圆柱体或球体,参数值取决于对象的尺寸和相邻3D点的距离。例如,如果圆柱体或球体的半径很小,或者3D点不是很密集,则必须选择更高的值。对于一个平面,该值独立于对象的维度,可以设置为一个小值。
max_curvature_diff:最大曲率偏差
该参数指定了允许的两个相邻3D点的曲面曲率之间的最大差值,从而使这两个点属于3D点的同一子集。该值取决于3D点的噪声。也就是说,如果3D点的噪声水平非常高,就必须设置一个更高的值。一般来说,由于更多的3D点被合并到3D点的子集中,生成的3D对象模型的数量会随着值的增加而减少。
min_area:最小面积(低于该面积滤去)
该参数指定分割返回的连通3D点的子集所需的最小3D点数量。因此,对于具有较少点的子集,将删除这些点,并且不创建输出句柄。

Fitting:在分割了之后会进行拟合
该参数指定分割后的3D基元是否被拟合到3D点的子集中。如果’fitting’被设置为’true’(这是默认值),那么拟合将被计算,并且带有结果句柄的3D对象模型将包含相应的3D基元的参数。圆柱、球体或平面的输出参数是用操作符fit_primitives_object_model_3d描述的。如果拟合为false,则只进行分割,输出的3D对象模型包含3D点分割后的子集。以后可以使用操作符fit_primitives_object_model_3d执行拟合。
‘output_xyz_mapping’:
该参数决定是否将从分割的3D点到图像坐标的映射复制到输出3D对象模型。这些信息是需要的,例如,在分段后使用操作符object_model_3d_to_xyz(例如,用于可视化)时。如果’output_xyz_mapping’被设置为’true’,图像坐标映射将被复制。注意,只有在输入的3D对象模型中有图像坐标映射时,该参数才有效。如果您通过使用操作符copy_object_model_3d从包含这样一个映射的3D对象模型中复制输入3D对象模型,请确保也复制该映射。此外,该参数仅在3D点被复制到输出3D对象模型时有效,输出3D对象模型是通过参数’output_point_coord’设置的。如果’output_xyz_mapping’被设置为’false’,图像坐标映射将不会被复制。
‘primitive_type’,‘fitting_algorithm’, ‘min_radius’,‘max_radius’, ‘output_point_coord’
如果’fitting’被设置为’true’(这是默认值),则使用这些参数。这些参数的含义和使用由操作符fit_primitives_object_model_3d描述。
prepare_object_model_3d
为某个操作准备一个3D对象模型。(在后续需要多次使用的情况下,可以先调用这个算子)
操作符prepare_object_model_3d为目的中给出的下列操作准备3D对象模型ObjectModel3D。它计算操作所需的值并将它们存储在ObjectModel3D中,从而加快了下面的操作。不需要调用prepare_object_model_3d。然而,如果3D对象模型要多次用于相同的操作,那么这样做会更快。
shape_based_matching_3d
3D对象模型准备在create_shape_model_3d中使用。因此,没有要设置的泛型参数。
Segmentation:
3D对象模型准备在segment_object_model_3d中使用。为准备3D对象模型,必须有一个属性与面三角形和一个属性与3D点坐标。
如果三维对象模型没有面三角形的属性,则进行简单的三角剖分。为此,3D对象模型必须具有一个具有3D点坐标的属性,以及一个具有从点坐标到图像坐标映射的属性。只有来自相邻像素点的点被三角化。另外,图像区域中的洞可以用Delaunay三角剖分来填充(见下面的max_area_holes)。只有完全被图像区域包围的孔被关闭。
△:会计算模型的网格(Delauney三角剖分)

distance_computation
3D对象模型准备在distance_object_model_3d中使用。
OverwriteData参数定义了是否删除一个已经准备好的3D对象模型的现有数据。如果OverwriteData设置为true,则覆盖使用参数Purpose定义的准备数据。如果“OverwriteData”设置为“false”,表示不覆盖准备的数据。参数OverwriteData可用于选择另一组泛型参数GenParamName和GenParamValue。如果参数Purpose设置为’shape_based_matching_3d’,则参数OverwriteData没有影响,因为为此,没有要设置的通用参数。
参数设置:
可以选择性地使用泛型参数来影响准备。如果需要,可以分别使用GenParamName和GenParamValue指定这些参数及其对应的值。GenParamName的取值可能如下:
max_area_holes
此参数仅在“目的”设置为“分段”时有效。该参数指定在一个简单的Delaunay三角剖分过程中关闭点坐标的区域孔。只有完全被图像区域包围的孔被关闭。如果“max_area_holes”设置为0,则不进行三角剖分。如果参数“max_area_holes”被设置为大于或等于1像素,则面积小于或等于“max_area_holes”的洞被网格闭合。
distance_to
该参数仅在“目的”设置为“distance_computation”时有效。参数指定计算距离的数据类型。distance_object_model_3d的文档中有更详细的描述。
Method
该参数仅在“目的”设置为“distance_computation”时有效。参数指定用于距离计算的方法。distance_object_model_3d的文档中有更详细的描述。
max_distance
该参数仅在“目的”设置为“distance_computation”时有效。参数指定距离计算的最大兴趣距离。如果设置为0,表示不使用最大距离。distance_object_model_3d的文档中有更详细的描述。
sampling_dist_rel
该参数仅在“目的”设置为“distance_computation”时有效。参数指定使用“voxel”方法计算到三角形的距离时的相对采样距离。distance_object_model_3d的文档中有更详细的描述。
sampling_dist_abs
该参数仅在“目的”设置为“distance_computation”时有效。当使用“voxel”方法计算到三角形的距离时,参数指定了绝对采样距离。distance_object_model_3d的文档中有更详细的描述。
distance_object_model_3d
计算一个3D对象模型的点到另一个3D对象模型的距离。
操作符distance_object_model_3d计算3D对象模型ObjectModel3DTo中点到点、三角形、多边形或原元的距离。在3D对象模型ObjectModel3DFrom中,距离作为一个名为“&distance”的扩展属性存储。随后可以使用get_object_model_3d_params查询该属性,或者使用select_points_object_model_3d或其他使用扩展属性的操作符处理该属性。
目标数据(点、三角形、多边形或原语)是基于ObjectModel3DTo中包含的属性选择的。它是根据数据的存在顺序选择的:原语、三角形、多边形和点。作为这种自动目标数据选择的替代方法,还可以使用泛型参数’distance_to’(见下文)来设置目标数据类型。一般情况下,非三角形多边形在计算到结果三角形的距离之前,由运算符内部三角化。因此,使用三角化对象调用运算符要比使用不同多边形面调用运算符快。
MaxDistance可用于限制要计算的距离值的范围。如果MaxDistance设置为0,则计算所有距离。如果将MaxDistance设置为另一个值,那么距离将超过MaxDistance的点将不处理,并将其设置为MaxDistance。因此,将MaxDistance设置为一个与0不同的值可以显著加快该操作符的执行。
如果Pose是一个非空元组,它必须包含一个在计算距离之前应用于ObjectModel3DFrom中的点的姿态。可以使用泛型参数’invert_pose’(见下文)来反转姿态。
根据目标数据类型(点、三角形或原语),有几种计算距离的方法可用。其中一些方法在ObjectModel3DTo的元素上计算数据结构,以加快距离计算。可以使用操作符prepare_object_model_3d预先计算这些数据结构。这允许对distance_object_model_3d进行多次调用来重用数据结构,从而节省了每次调用重新计算它的时间。
对于具有非三角形多边形面的对象,操作符prepare_object_model_3d可以额外执行三角剖分并将其保存到对象中,以进一步加速distance_object_model_3d操作符。只有当通用参数’distance_to’被设置为’三角形’时,才会执行这种三角剖分。注意,与操作符triangulate_object_model_3d相反,这种三角剖分不会清除polygon属性。
当计算到点或三角形的距离时,操作符可以通过将通用参数’store_closest_index’设置为’true’(见下面),可选择返回ObjectModel3DFrom中每个点的最近点或三角形的索引。在3D对象模型ObjectModel3DFrom中,索引被存储为名为’&closest_index’的扩展属性。注意,当使用“体素”方法时,不能计算最接近的索引。如果一个点到它最近的元素的距离超过MaxDistance中设置的最大距离,那么最近的索引将被设置为-1。
可选地,可以计算到点、三角形或原语的带符号距离。因此,泛型参数’signed_distance ‘必须设置为’true’。注意,当使用“体素”方法结合点对点的距离时,带符号的距离不能计算。
下面将对不同的目标类型和方法进行说明,并对其优缺点进行说明。注意,操作符根据目标数据类型自动选择默认方法。可以使用泛型参数’method’重写此方法。
Distance to points:
计算点到点的距离有以下几种方法:
对于ObjectModel3DFrom中的每个点,计算到ObjectModel3DTo中所有点的距离,并使用最小的距离。这种方法不需要预先计算的数据结构,并且对于ObjectModel3DTo中的少量点来说是最快的。
KD-Tree:
ObjectModel3DTo中的点被组织在一个KD-Tree中,这加快了对最近点的搜索。这棵树的建造非常高效。搜索时间近似于ObjectModel3DTo中的点数的对数。但是,搜索时间不是恒定的,并且可能会根据ObjectModel3DFrom中查询点的位置发生显著变化。
Voxel:
ObjectModel3DTo中的点以体素结构组织。这种体素结构允许在几乎恒定的时间内搜索,即独立于ObjectModel3DFrom中的查询点的位置和ObjectModel3DTo中的点的数量。
注意,准备这个数据结构需要几秒钟或几分钟。但是,可以在ObjectModel3DTo上使用prepare_object_model_3d执行预计算,目的设置为’distance_computation’。

Distance to primitive:
由于ObjectModel3DTo只能包含一个原语,因此从查询点到这个原语的距离是线性计算的。创建或使用数据结构是不可能的。
请注意,计算与segment_object_model_3d或fit_primitives_object_model_3d拟合的基元平面的距离可能会比较慢,因为这些平面包含用于拟合平面的点的复杂凸包。如果只需要到平面的距离,并且忽略边界,建议使用get_object_model_3d_params和参数’primitive_parameter_pose’获取平面姿态,并使用gen_plane_object_model_3d创建新的平面。
除了上述参数外,还可以设置以下参数以影响距离计算。如果需要,可以分别使用GenParamName和GenParamValue指定这些参数及其对应的值。以下参数均为可选参数。
distance_to:
此参数可用于显式设置计算距离的目标数据。
(默认值)自动设置目标数据。将查询以下属性列表,列表中第一个出现的属性将用作目标数据:Primitive、Triangle、Point。
‘primitive’
计算到ObjectModel3DTo中包含的原语的距离。
points
计算到ObjectModel3DTo中包含的点的距离。
signed_distances
Distance to primitive:
当计算到圆柱形、球形或盒形基元的带符号距离时,在基元内部的3D对象模型ObjectModel3DFrom的点获得负距离,而其他所有点获得正距离。当计算到平面的符号距离时,平面下的所有点都得到一个负距离,而其他所有点都有一个正距离。

area_object_model_3d
计算3D对象模型中所有面的面积。3D对象模型需要面或三角形。结果区域在area中返回。
计算一个3D对象模型的面下相对于一个平面的体积。平面由plane中给出的姿态的x-y平面定义。
对于ObjectModel3D,必须提供三角剖分或多边形列表。在默认设置下,如果网格是水密且有序的,操作员将计算3D对象模型的实际体积。为了还包括网格未关闭或面排序不一致的情况,体积的计算可以受参数Mode和UseFaceOrientation的影响。

首先,操作者计算棱镜的体积,这些棱镜是通过将每个面投射到平面上而构成的。
棱镜的个体体积可以是正的或负的,这取决于表面的方向(远离平面或朝向平面)或表面的位置(高于平面或低于平面)。这可以用参数UseFaceOrientation来控制。
然后,根据模态参数将棱镜的体积相加。
“volume”中返回的volume是计算的总和的绝对值。
例子:
gen_box_object_model_3d ([0,0,0,0,0,0,0],3,2,1, ObjectModel3D)
convex_hull_object_model_3d (ObjectModel3D, ObjectModel3DConvexHull)
volume_object_model_3d_relative_to_plane (ObjectModel3DConvexHull,
[0,0,0,0,0,0,0], ‘signed’,
‘true’, Volume)

project_object_model_3d
将3D对象模型投影到图像坐标中。
操作符project_object_model_3d将一个3D对象模型投射到图像坐标系统中,并在ModelContours中返回投影的轮廓。这个操作符对于三维对象模型的可视化特别有用。注意,原语没有被投影,而是被静默忽略。在三维世界坐标系中给出了三维对象模型的坐标。首先,使用给定的姿态将它们转换为摄像机坐标系统。然后,将这些坐标投影到基于摄像机内部参数CamParam的图像坐标系中。
相机内部参数CamParam描述了相机的投影特性(参见calibrate_cameras)。姿态描述了世界坐标系相对于摄像机坐标系的位置和方向。
‘data’: List of values: ‘auto’, ‘faces’, ‘lines’, ‘points’
该参数指定3D对象模型的哪个几何数据应该被投影。如果data设置为faces,则3D对象模型的faces被投影。这些面在模型轮廓中由它们的边界线表示。如果data设置为lines,则投影3D对象模型的3D线。如果“data”设置为“points”,则3D对象模型的点被投影。投影的点可以在modelcontour中以不同的方式表示。点表示可以通过使用通用参数’point_shape’(见下文)来选择。最后,如果“data”设置为“auto”,HALCON会自动选择3D对象模型中可用的最具描述性的几何数据进行可视化。
point_shape
此参数指定在输出轮廓模型轮廓中如何表示点。因此,这个参数只有在选择3D对象模型的点进行投影时才有效果(见上)。如果’point_shape’被设置为’circle’,点将被圆圈表示,而如果’point_shape’被设置为’cross’,点将被十字架表示。在这两种情况下,点的大小(即圆的大小或叉的大小)都可以通过泛型参数‘point_size’(见下文)来指定。十字的方向可以通过泛型参数’point_orientation’(见下文)来指定。
point_size
此参数指定输出轮廓ModelContours中点表示的大小,即圆的大小或十字的大小取决于所选的“point_shape”。因此,这个参数只有在选择3D对象模型的点进行投影时才有效果(见上)。大小必须以像素为单位。如果’point_size’设置为0,每个点都由一个包含单个轮廓点的轮廓表示。
union_adjacent_contours
此参数指定是否应连接相邻的投影轮廓。激活这个选项相当于在这个操作符之后调用union_adjacent_contours_xld,但是要快得多。
hidden_surface_removal
此参数可用于开启或关闭隐藏表面的移除。如果’hidden_surface_removal’被设置为’true’,只有那些不被3D对象模型的面隐藏的投影边缘被返回。如果’hidden_surface_removal’被设置为’false’,则返回所有投影的边缘。这比’hidden_surface_removal’设为’true’的投影要快。
如果系统变量(参见set_system)‘opengl_hidden_surface_removal_enable’被设置为’true’(如果可用,这是默认值),‘hidden_surface_removal’被设置为’true’,模型的投影将使用显卡加速。根据显卡的不同,这比非加速算法要快得多。请注意,OpenGL投影的结果与解析投影略有不同。值得注意的是,只有通过CamParam可见的轮廓在这种模式下被投影。

surface_normals_object_model_3d
计算三维物体模型的三维表面法线。
操作符surface_normals_object_model_3d使用method指定的方法计算对象ObjectModel3D的3D表面法线。计算的法线被附加到输入对象,结果对象在ObjectModel3DNormals中返回。
对于mls方法,采用了移动最小二乘法(mls)。法线估计的MLS方法与smooth_object_model_3d所使用的MLS方法基本相同,只是surface_normals_object_model_3d中3D点没有被平滑,即ObjectModel3D原始的3D点保持不变。
有关MLS的更多细节,以及支持的MLS参数的完整列表和描述,请参考smooth_object_model_3d。
如果对象ObjectModel3D包含三角形,则可以使用“三角形”方法从与点相邻的三角形的法线获取点法线。相邻三角形的法线根据三角形在点处的夹角加权。
如果对象ObjectModel3D包含一个2D映射(例如,使用xyz_to_object_model_3d创建的3D对象模型),那么可以使用方法“xyz_mapping”从2D映射中的点的邻域获取点法线。在二维映射中点的5x5邻域内,通过相应的3D点拟合一个平面。然后该平面的法线会在与2D映射一致的方向上切换,例如沿着传感器的观察方向或相反的方向。
注意,对于法向量无法估计的点,它被设置为零向量。例如,如果3D对象模型包含一个相同的点多于’mls_kNN’的次数,就会发生这种情况。

smooth_object_model_3d

平滑3D对象模型的3D点
操作符smooth_object_model_3d使用method指定的方法平滑ObjectModel3D中的3D点。生成的平滑点在SmoothObjectModel3D中返回。目前,移动最小二乘(MLS) (Method=’ MLS ')是唯一支持的平滑方法。
对于每个点P, MLS平滑算法将一个平面或一个更高次的多项式曲面拟合到它的k-邻域(最近的k个点)。曲面拟合本质上是对平面或多项式曲面参数的标准加权最小二乘参数估计。P的最近邻比其他点的贡献更高,由以下带参数的权函数控制:

然后将点投影在表面上。这一过程对所有点重复,从而得到一个平滑的点集。拟合的表面有很好的定义的法线(即,它们可以很容易地从表面参数计算)。因此,作为平滑的副作用,这些点被相应的法线增广。
mls_abs_sigma
将加权参数指定为一个固定的绝对值。要选择的值取决于点数据的规模。根据经验法则,可以选择点P与其第k/2个相邻点之间的典型距离。需要注意的是,对不同密度的点数据设置绝对加权参数,可能会导致位于不同密度点数据部分的点的平滑结果不同。这个问题可以通过使用与尺度无关的’mls_relative_sigma’来避免,这也使它成为一种更方便的指定邻域权重的方法。请注意,如果传递了’mls_abs_sigma’,则忽略’mls_relative_sigma’中设置的任何值。
mls_force_inwards
如果此参数设置为“true”,则所有表面法线的方向都指向“原点的方向”。用数学方法表示,可以保证法向量和从各自的曲面点到原点的向量之间的标量积(点积)是正的。如果生成的SmoothObjectModel3D用于基于表面的匹配,这可能是必要的,无论是作为create_surface_model中的模型,还是作为find_surface_model中的3D场景,因为在这里,法线的一致方向对于匹配过程很重要。如果’mls_force_inwards’被设置为’false’,则法向量是任意方向的。

sample_object_model_3d
△:sample是插值,比如说有一个盒子的原语,只有8个点,在采样之后,会相隔一个采样距离,插入一个点。
sample_object_model_3d创建3D对象模型ObjectModel3D的采样版本,该模型由相互之间有最小距离SampleDistance的点组成。创建的3D对象模型在SampledObjectModel3D中返回。
如果要简化复杂的点云以实现更快的后处理,或者要将原元转换为点云,那么建议使用sample_object_model_3d。请注意,如果3D对象模型是三角化的,并且应该通过尽可能好地保留其原始几何形状来简化,则应该使用simplify_object_model_3d。
如果输入对象模型ObjectModel3D只包含点,那么可以使用参数Method选择几个采样方法。
默认方法“fast”将输入模型中不接近先前添加到输出模型中的任何点的所有点相加。如果存在,法线、xyz映射和扩展点属性将复制到输出模型中。
“fast_compute_normals”方法选择与“fast”方法相同的点,但另外计算所有被选择点的法线。为此,输入对象模型必须包含法线(要复制法线),或者必须包含一个XYZ-mapping属性,从这个属性计算法线。xyz映射由xyz_to_object_model_3d创建。
该方法“精确”地通过3D对象模型ObjectModel3D的点,并计算是否有任何其他点在一个球面内,其半径为SampleDistance。如果没有其他点,原始点存储在SampledObjectModel3D中。如果有其他点,这些点(包括原始点)的重心存储在SampledObjectModel3D中。对剩下的点重复这个过程,直到没有点剩下。不复制输入3D对象模型的扩展属性,但复制法线和xyz映射。对于这种方法,可以通过在GenParamName和GenParamValue中为’min_num_points’指定一个值来消除噪声,这将删除所有插入的点,这些点在原始模型中比指定的邻居点数量要少。
“accurate_use_normals”方法需要输入3D对象模型中的法线,并且只插值具有相似法线的点。相似度取决于法线之间的夹角。角度的阈值可以在GenParamName和GenParamValue中使用’max_angle_diff’来指定。缺省值为180度。此外,可以通过设置泛型参数’min_num_points’来删除方法’accurate’中描述的离群值。
如果输入对象模型包含面(三角形或多边形)或一个3D基元,则该表面将按照给定的距离进行采样。在这种情况下,方法中指定的方法将被忽略。请注意,平面和圆柱体必须有有限的范围。如果输入对象模型包含行,则以给定的距离对行进行采样。
采样过程通过在输出对象模型中创建新的点来近似曲面。因此,输入对象模型中的任何扩展属性都将被丢弃。
对于混合输入对象模型,采样优先级(从上到下)为面、线、基元和点,即只采样优先级最高的对象。
参数SampleDistance接受一个值,然后用于ObjectModel3D中传递的所有3D对象模型,或者每个输入对象模型接受一个值。样本距离的单位是通常的halcon内部单位“m”。
例子:
gen_box_object_model_3d ([0,0,0,0,0,0,0],3,2,1, ObjectModel3D)
sample_object_model_3d (ObjectModel3D, ‘fast’, 0.05, [], [],
SampledObjectModel3D)
*dev_open_window (WindowHandle)
dev_open_window(0, 0, 512, 512, ‘black’, WindowHandle)
visualize_object_model_3d (WindowHandle, [SampledObjectModel3D,ObjectModel3D],
[], [], [‘color_0’,‘color_1’,‘alpha_0’,‘alpha_1’], [‘red’,‘green’,0.5,0.5], [], [], [], PoseOut)
simplify_object_model_3d
△:可以用于减少模型计算量
simplify_object_model_3d通过删除模型点来简化三角形3D对象模型ObjectModel3D,并在SimplifiedObjectModel3D中返回结果。注意,与sample_object_model_3d相比,点被删除了,以便尽可能好地表示对象模型的原始几何形状。通常情况下,这意味着边被保留,而平滑部分内的点密度被降低。这可能会有帮助,例如,通过使用简化的3D对象模型来加快后续的操作符调用。(意思是samplify_object_model_3d是没有删除点)
相对于操作符sample_object_model_3d,保留了输入3D对象模型的三角剖分,该操作符将曲面采样到等距不连通的3D点。
目前,操作符只提供了一个简化方法(’ preserve_point_coordinates ‘),可以在method中设置。该方法确保简化对象模型SimplifiedObjectModel3D中的点与输入对象模型ObjectModel3D中的各个点具有相同的坐标。
Simplify_object_model_3d只适用于三角化对象模型。可以使用get_object_model_3d_params (GenParamName=’ has_三角形’)查询对象模型是否包含三角化。不包含三角剖分的对象模型必须事先进行三角剖分,例如使用triangulate_object_model_3d或prepare_object_model_3d(目的=‘分段’)。
△:prepare_object_model_3d可以用distance参数来三角剖分
简化程度可以通过Amount来设定。默认情况下,Amount指定应该包含在输出对象模型中的输入对象模型的百分比。因此,本例中选择的Amount值越小,对象模型的简化程度就越强。
简化程度可以通过Amount来设定。默认情况下,Amount指定应该包含在输出对象模型中的输入对象模型的百分比。因此,本例中选择的Amount值越小,对象模型的简化程度就越强。
也可以修改“数量”的含义。为此,泛型参数’amount_type’可以设置为以下值之一:
percentage_remaining
percentage_to_remove
num_points_remaining
num_points_to_remove
在简化过程中,三角网格有时会发生翻转,即其法向量方向发生180度的变化。这尤其发生在由平面部件组成的人工创建的CAD模型上。为了避免这种翻转,泛型参数’ avoid_triangle_flipps ‘可以设置为’true’(默认为’false’)。注意,在本例中,simplify_object_model_3d的运行时将增加。
注意,与简化程度较高的单个调用相比,简化程度较低的simplify_object_model_3d的多个调用可能会产生不同的简化对象模型。还要注意,孤立的(即非三角化的)点将被移除。这可能导致SimplifiedObjectModel3D中的许多点与Amount中指定的简化程度略有偏差。
dev_open_window(0, 0, 512, 512, ‘black’, WindowHandle)
read_object_model_3d (‘mvtec_bunny.om3’, ‘m’, [], [], ObjectModel3D, Status)
visualize_object_model_3d (WindowHandle, ObjectModel3D, [], [], [], [],
[], [], [], Pose)
simplify_object_model_3d (ObjectModel3D, ‘preserve_point_coordinates’,
5.0, ‘amount_type’, ‘percentage_remaining’,
SimplifiedObjectModel3D)
visualize_object_model_3d (WindowHandle, SimplifiedObjectModel3D, [],
Pose, [], [], [], [], [], Pose)
moments_object_model_3d
计算一个3D对象模型的二阶平均矩或中心矩。
moments_object_model_3d计算3D对象模型的二阶平均矩或中心矩。要计算3D对象模型的点的平均值,请选择momentstoccalculate中的’mean_points’。如果需要计算二阶中心矩,则选择central_moment_2_points。结果是x, y, z, x-y, x-z和y-z轴的方差。要计算3D对象模型的三个主轴,请选择momentstoccalculate中的‘principal_axes’。结果是一个以点的平均值为中心的姿态。与该姿态相对应的坐标系具有沿第一主轴的x轴,沿第二主轴的y轴和沿第三主轴的z轴。
gen_object_model_3d_from_points (rand(200), rand(200),
rand(200), ObjectModel3D)
moments_object_model_3d (ObjectModel3D, [‘mean_points’,
‘central_moment_2_points’,‘principal_axes’],
Moments)
edges_object_model_3d
在3D对象模型中找到边缘。
edges_object_model_3d在3D对象模型ObjectModel3D中找到3D边缘,并在3D对象模型ObjectModel3DEdges中返回它们。
该操作符仅支持从包含XYZ映射的3D对象模型中提取边缘,例如使用xyz_to_object_model_3d创建的模型,或者使用交付映射的传感器获得的模型。最小振幅定义了一个不连续点的最小振幅,以便将其划分为一条边。它在ObjectModel3D中使用的相同单元中给出。
提取的边是输入对象模型中点的子集。除了边缘的坐标外,ObjectModel3DEdges中的点法向量包含从视点到边缘点的每个3D边缘点的查看方向。同样,属性’edge_dir_x’, ‘edge_dir_y’和’edge_dir_z’包含一个垂直于边缘方向和查看方向的矢量。属性的设置使得3D对象模型可以在find_surface_model中用于基于边缘支持的表面匹配。
通用参数可以选择性地用于影响边缘提取。如果需要,可以使用GenParamName和GenParamValue指定这些参数及其对应的值。GenParamName的取值可能如下:
Viewpoint
此参数指定从哪个视角查看3D数据。它用于确定观察方向和边缘方向。它默认为3D数据的原点’0,0,0’。如果投影中心位于不同的位置,例如,如果3D对象模型使用rigid_trans_object_model_3d进行了转换,或者如果3D传感器执行了类似的转换,则必须设置原始的视点。为此,GenParamValue必须包含一个字符串,该字符串由视点的三个坐标(x、y和z)组成,用空格分隔。视点定义在与ObjectModel3D相同的坐标框架中。
“max_gap”:
此参数指定闭合的xyz图像中的最大间隙大小(以像素为单位)。大于此值的间隙将在其边界包含边,而小于此值的间隙将不包含边。这抑制了未被传感器重建的小块周围的边缘,以及不连续点较远部分的边缘。对于分辨率非常大的传感器,应增加该值以避免伪边缘。
fuse_object_model_3d
将3D对象模型融合到一个表面中。
fuse_object_model_3d将表示对象表面的多个点云融合为一个水密表面。该算子可用于简化已经注册在同一坐标系中的点云的后处理步骤。特别是,统一、异常值的抑制、平滑和保持边缘之间的权衡、等距子采样、洞填充和输出曲面的网格化往往可以得到很好的处理和高质量的处理。另一方面,这些优点是以高运行时间为代价的。
如果你想融合通过立体重建获得的3D点云,你应该使用reconstruct_surface_stereo而不是fuse_object_model_3d。
工作流程
1.获取点云并将其转换为一个公共坐标系,例如使用register_object_model_3d_pair和register_object_model_3d_global。
2.如果尚未可用,可以使用triangulate_object_model_3d或surface_normals_object_model_3d计算点云的三角形或点法线。如果你的表面有很多异常值或需要关闭的孔,那么三角剖分更合适。否则,为了表面清洁,你可以使用法线。
3.使用visualize_object_model_3d和GenParamName ‘disp_normals’或dev_inspect_ctrl检查输入模型的法线。点或三角形的法线必须始终指向物体的内部或外部。将NormalDirection设置为“向内”或“向外”。
4.在BoundingBox中指定感兴趣的卷。要获得BoundingBox的第一个猜测,使用get_object_model_3d_params,并将GenParamName设置为’bounding_box1’。
指定一组初始参数:粗分辨率(例如1/100)边界框(直径的大小),SurfaceTolerance至少有点大(例如5 *分辨率),MinThickness作为对象的最小厚度(如果输入点云只从一面代表对象,设置它很高,所以对象)边界框(切断的大小),平滑设置为1.0。
5.应用fuse_object_model_3d并重新调整参数以改进质量和运行时方面的结果,见下文。在调优其他参数时,使用足够好的分辨率来识别对象的细节,以避免长时间运行。还要考虑使用GenParamName中的附加参数。
intersect_plane_object_model_3d
intersect_plane_object_model_3d将一个3D对象模型与一个平面相交.
该平面由参数plane指定的姿态的x-y平面定义。姿态的z轴对应于平面的法线。
结果是一组由直线连接的3D点,在ObjectModel3DIntersection中作为3D对象模型返回。每一个与平面相交的三角形都会产生两个交点和两点之间的一条线。所得到的直线集是共面的。△:前面必须经过三角剖分

  1. disp_object_model_3d显示
  2. et_object_model_3d_params使用参数’lines’查询。
    例子:
    gen_object_model_3d_from_points (rand(20)-0.5, rand(20)-0.5,
    rand(20)-0.5, ObjectModel3D)
    convex_hull_object_model_3d (ObjectModel3D, ObjectModel3DConvexHull)
    intersect_plane_object_model_3d (ObjectModel3DConvexHull, [0,0,0,0,0,0,0],
    ObjectModel3DIntersection)
    dev_get_window (WindowHandle)
    visualize_object_model_3d (WindowHandle, [ObjectModel3DIntersection,
    ObjectModel3DConvexHull], [], [],
    [‘alpha_1’], [0.5], [], [], [], PoseOut)
    △:该处用convex_hull_object_model_3d对3D模型进行了三角剖分
    connection_object_model_3d
    确定3D对象模型的连接组件。
    connection_object_model_3d确定ObjectModel3D中给定的输入3D对象模型的连接组件。三维对象模型的两部分是否连接可以根据不同的属性和各自的距离函数来决定。属性和距离函数可以在Feature中选择:
    distance_3d
    对三维点集的点坐标之间的欧氏距离进行了检验。对于任何低于Value的距离,这些点被认为是连通的。
    Angle
    比较了三维物体模型中各点法线之间的夹角。如果相似的法线的角距离低于Value,则认为它们是连通的。值以弧度指定,并且应该在0和pi之间。
    前提条件:3D对象模型必须包含法线,可以通过surface_normals_object_model_3d进行计算。
    distance_mapping
    该映射度量存储在2D映射中的3D对象模型中点的像素坐标之间的距离。为value使用大于1.5的值来获得图像中8-邻域内的连接。
    前提条件:3D对象模型必须包含2D映射,如果使用xyz_to_object_model_3d创建了3D对象模型,则可以使用2D映射。
    Mesh
    返回三角形或多边形连接的3D对象模型的部分。值将被忽略。
    前提条件:3D对象模型必须提供三角剖分,三角剖分可以通过triangulate_object_model_3d获得。或者,如果3D对象模型已经包含2D映射,那么prepare_object_model_3d可以将目的设置为“分割”,以快速三角化3D对象模型。
    △:只有3D模型中包含2D映射的情况,可以用prepare_object_model_3d来快速三角化
    Lines
    返回对象模型中由行连接的部分。值将被忽略。
    前提条件:三维对象模型必须包含折线,折线可以通过intersect_plane_object_model_3d进行计算

或者,可以使用set_object_model_3d_attrib或set_object_model_3d_attrib_mod手动设置所需的属性。注意,3D对象模型可能已经包含了所需的属性,特别是当3D对象模型已经用read_object_model_3d读取,或者已经用deserialize_object_model_3d反序列化时。要检查所需属性是否可用,请使用get_object_model_3d_params。
例子:
gen_object_model_3d_from_points (rand(100), rand(100),
rand(100), ObjectModel3D)
connection_object_model_3d (ObjectModel3D, ‘distance_3d’, 0.2,
ObjectModel3DConnected)
visualize_object_model_3d (WindowHandle, [ObjectModel3DConnected], [], [], [‘colored’], [12], [], [], [], PoseOut)

set_object_model_3d_attrib
设置3D对象模型的属性。
set_object_model_3d_attrib将3D对象模型ObjectModel3D的AttribName中给定的标准属性或扩展属性设置为AttribValues中的值,并在ObjectModel3DOut中返回具有新属性值的3D对象模型。set_object_model_3d_attrib与set_object_model_3d_attrib_mod相同,不同之处是它创建了一个新的3D对象模型,并保持原来的3D对象模型不变。通过设置参数attachextattrbto,可以将扩展属性的值附加到3D对象模型中已经存在的标准属性。对于标准属性,attachextattrbto将被忽略。△:该函数创建了一个新的3D对象模型
如果AttribName中的属性不存在,则尽可能创建它们。如果已经设置了现有的属性,AttribValues的长度必须与现有的属性值匹配。在这种情况下,现有的属性值将被替换。如果使用attachextattrbto将扩展属性附加到已经存在的标准属性上,则attrbvalues的长度必须与现有属性值匹配。△:会将原有属性替换掉
Extended attributes
扩展属性是可以通过特殊操作符(例如distance_object_model_3d)从标准属性或用户定义属性派生的属性。扩展属性的名称是任意的,但必须以前缀’&‘开头,例如’& my_attrb '。扩展属性可以有任意数量的浮点值。
扩展属性可以通过设置参数attachextattrbto附加到3D对象模型中已经存在的标准属性。attachextattrbto可以取值如下:

projective_trans_object_model_3d
对3D对象模型应用任意投影3D变换
projective_trans_object_model_3d对3D对象模型的点应用任意投影3D转换,并返回转换后的3D对象模型的句柄。射影变换由HomMat3D中给出的齐次变换矩阵描述(参见projective_trans_point_3d)。
可以使用vector_to_hom_mat3d运算符创建转换矩阵。

render_object_model_3d
渲染3D对象模型以获得图像。
render_object_model_3d渲染ObjectModel3D的3D对象模型,并在图像image中返回结果。要设置要显示的场景,设置CamParam和对象的单独姿态。注意,Pose可以包含每个对象的一个姿势,也可以包含所有对象的一个姿势。
输出图像的视图与disp_object_model_3d生成的视图相同。参数和其他详细信息由disp_object_model_3d记录,但参数’object_index_persistence’和’disp_background’不能设置。

rigid_trans_object_model_3d
对3D对象模型应用刚性3D变换。
rigid_trans_object_model_3d对3D对象模型应用刚性3D转换,即旋转和平移,并返回转换后的3D对象模型的句柄。这些变换由"姿态"中给出的姿态来描述。
pose可以使用create_pose、pose_invert等操作符创建,也可以是get_object_model_3d_params的结果。
rigid_trans_object_model_3d转换一个或多个具有相同姿态的3D对象模型,如果在pose (N:1)中只传递了一个转换矩阵。如果在ObjectModel3D中传递了单个3D对象模型,那么它将与所有传递的姿态(1:N)进行转换。如果姿态数与三维对象模型的数量相对应,则每个三维对象模型分别以各自的姿态进行变换(N:N)。在这种情况下,N可以为零,即没有姿态或3D对象模型可以传递给操作员。在本例中,ObjectModel3DRigidTrans返回一个空元组。例如,这可以用于转换find_surface_model的结果,而不首先检查是否至少返回了一个匹配。
triangulate_object_model_3d
为3D对象模型创建一个表面三角剖分。
操作符triangulate_object_model_3d为3D对象模型ObjectModel3D生成一个三角形面的曲面,并在TriangulatedObjectModel3D中返回生成的曲面。目前,该操作符提供了四种三角剖分方法。
可以在Method中选择:‘polygon_triangulation’, ‘xyz_mapping’, ‘greedy’和’implicit’。“polygon_triangulation”是一个简单的方法,将多边形转换为三角形的面表示在三维对象模型。'xyz_mapping’根据2D映射对2D中的点进行三角剖分。
另外两种方法是比较复杂的算法,用于从纯三维点数据和未知的表面拓扑计算三角形面。“贪婪”算法和“隐式”算法的详细比较在下文“三角剖分方法的比较”一节中。
2D mapping triangulation
通过选择Method=‘xyz_mapping’,这些点将根据ObjectModel3D中包含的2D映射在2D中三角化。使用的方法与prepare_object_model_3d中的目的='segmentation’相同。如果没有2D映射可用,则会引发异常。
通过将GenParamName设置为以下值,可以使用GenParamValue设置2D映射三角剖分的附加参数:
xyz_mapping_max_area_holes
指定在一个简单的Delaunay三角测量中,点坐标的哪个区域的洞是封闭的。只有完全被图像区域包围的孔被关闭。如果’xyz_mapping_max_area_holes’设置为0,则没有三角剖分孔。该参数对应于prepare_object_model_3d的GenParamName ‘max_area_holes’。
△:和prepare_object_model_3d有对应关系

convex_hull_object_model_3d
convex_hull_object_model_3d计算ObjectModel3D中给出的3D对象模型的凸包。该操作符将凸包作为一个带有句柄ObjectModel3DConvexHull的3D对象模型返回。
如果输入点的某个维度没有任何偏差,那么结果将由直线组成,而不是三角形。

affine_trans_object_model_3d
对3D对象模型应用任意仿射3D变换。
affine_trans_object_model_3d对3D对象模型应用任意仿射3D转换,即缩放、旋转和平移,并返回转换后的3D对象模型的句柄。仿射变换用HomMat3D中给出的齐次变换矩阵来描述。△:和刚性变换相比,多了一个缩放
转换矩阵可以使用
1.hom_mat3d_identity、
2.hom_mat3d_scale、
3.hom_mat3d_rotate、
4.hom_mat3d_translate等操作符创建,
也可以是pose_to_hom_mat3d(参见affine_trans_point_3d)的结果。
通常,在基于形状的3D匹配上下文中,操作符affine_trans_object_model_3d是不必要的。相反,如果应该将3D对象模型旋转为参考方向,则应该将参数RefRotX、RefRotY、RefRotZ和OrderOfRotation的适当值传递给操作符create_shape_model_3d。
如果在HomMat3D (N:1)中只传递了一个转换矩阵,那么affine_trans_object_model_3d将使用相同的转换矩阵转换一个或多个3D对象模型。如果在ObjectModel3D中传递了单个3D对象模型,则使用所有传递的转换矩阵对其进行转换(1:N)。如果变换矩阵的个数与三维对象模型的个数相对应,则每个三维对象模型分别用各自的变换矩阵(N:N)进行变换。在这种情况下,N可以为零,即没有矩阵或3D对象模型可以传递给算子。在本例中,ObjectModel3DAffineTrans返回一个空元组。例如,这可以用于转换其他运算符的结果,而不首先检查是否至少返回了一个矩阵。
copy_object_model_3d
复制一个3D对象模型。
3D对象模型由一组属性组成。操作符copy_object_model_3d创建一个新的3D对象模型,并将输入3D对象模型的选定属性复制到这个新的输出3D对象模型。输入3D对象模型由句柄ObjectModel3D定义。该操作符返回新的3D对象模型的句柄CopiedObjectModel3D。操作符可以通过删除不需要的属性来节省内存空间。访问3D对象模型的属性是可能的,例如,通过操作符get_object_model_3d_params。
参数Attributes决定应该复制哪些属性。此外,可以使用前缀~来排除属性的复制。
注意,因为3D对象模型本身由一组属性组成,甚至点坐标也是模型的属性。这意味着,至少必须为copy_object_model_3d选择这个属性,否则要复制的对象模型将为空。因此,如果只有一个表示点云的3D对象模型需要复制,而没有进一步的属性,属性必须设置为’point_coord’。如果要复制的属性不可用或未选择任何属性,则会引发异常。
hom_mat3d_compose
将两个齐次三维变换矩阵相乘。
hom_mat3d_determinant
计算齐次三维变换矩阵的行列式。
om_mat3d_identity
生成相同三维变换的齐次变换矩阵。
hom_mat3d_invert
求一个齐次三维变换矩阵的逆。
hom_mat3d_project
将仿射三维变换矩阵投影到二维射影变换矩阵。

project_3d_point
将3D点投影到(子)像素图像坐标。
project_3d_point将一个或多个3D点(坐标为X、Y和Z)投影到图像平面(以像素为单位),并以行和列的形式返回结果。 坐标X, Y和Z在相机坐标系中给出,也就是说,它们描述了点相对于相机的位置。

  • Set internal camera parameters and pose of the world coordinate
  • system in camera coordinates.
  • Note that, typically, these values are the result of a prior
  • calibration.
    gen_cam_par_area_scan_division (0.01, -731, 5.2e-006, 5.2e-006,
    654, 519, 1280, 1024, CameraParam)
    create_pose (0.1, 0.2, 0.3, 40, 50, 60,
    ‘Rp+T’, ‘gba’, ‘point’, WorldPose)
  • Convert pose into transformation matrix.
    pose_to_hom_mat3d(WorldPose, HomMat3D)
  • Transform 3D points from world into the camera coordinate system.
    affine_trans_point_3d(HomMat3D, [3.0, 3.2], [4.5, 4.5], [3.8, 4.2], X, Y, Z)
  • Project 3D points into image.
    project_3d_point(X, Y, Z, CameraParam, Row, Column)
    gen_cam_par_area_scan_division
    生成一个摄像机参数元组的区域扫描摄像机建模失真的分割模型。
    gen_cam_par_area_scan_division生成camera参数元组CameraParam,用于分割模型建模的失真区域扫描相机。 为此,相机参数必须在Focus, Kappa, Sx, Sy, Cx, Cy, ImageWidth,和ImageHeight中传递。 有关参数的详细说明,请参见calibrate_cameras的文档。
    △:在用于3D模型中,只作用于显示方式的不同,修改像元大小是修改视野,修改图像主点是修改显示位置,要求焦距必须大于0,畸变系数可以为0。
    gen_cam_par_area_scan_telecentric_polynomial
    对具有远心镜头的区域扫描相机采用多项式模型进行畸变建模,并生成相机参数元组。
    gen_cam_par_area_scan_telecentric_多项式生成具有远心镜头的区域扫描相机的相机参数元组CameraParam。 为此,相机参数必须通过放大率,K1, K2, K3, P1, P2, Sx, Sy, Cx, Cy, ImageWidth,和ImageHeight。

gen_cam_par_area_scan_tilt_division
生成带有倾斜透镜的区域扫描相机参数元组,并通过分割模型对其进行畸变建模。
gen_cam_par_area_scan_tilt_division为带有倾斜镜头和由分割模型建模的失真的区域扫描相机生成相机参数元组CameraParam。 为此,相机参数必须在Focus, Kappa, ImagePlaneDist, Tilt, Rot, Sx, Sy, Cx, Cy, ImageWidth,和ImageHeight中传递。

calibrate_cameras
通过同时最小化过程确定所有摄像机参数。
算子calibrate_cameras计算calibrbdataid中指定的校准数据模型的内部和外部摄像机参数。 摄像机参数的详细说明请参见“摄像机参数”。

校准数据模型描述一个或多个摄像机的设置,并在创建数据模型时指定。 详见“准备校准输入数据”一节。

优化后投影的均方根误差(RMSE)返回error(以像素为单位)。 该错误给出了优化是否成功的一般指示。 有关详细信息,请参见“检查校准是否成功”一节。

为了成功校准,至少需要一个精确已知公制属性的校准对象,例如HALCON校准板。 在调用calibrate_cameras之前,拍摄校准对象在不同方向的一系列图像,确保覆盖整个视场或测量体积。 标定的成功与否很大程度上取决于标定对象和图像的质量。 因此,在获取校准图像期间,您可能需要特别注意。 参见“如何拍摄一组合适的图像?” ”详情。

由calibrate_cameras执行的校准取决于校准设置中涉及的摄像机类型。

对于带有投影区域扫描摄像机(
‘area_scan_division’,
’ area_scan_多项式’,
‘area_scan_tilt_division’,
‘area_scan_tilt_image_side_telecentric_division’,和’ area_scan_tilt_image_side_telecentric_多项式’)的设置,校准分四个步骤执行。 首先,该算法试图建立一个连接所有摄像机和标定对象姿态到参考摄像机的观测姿态链。

Sx,Sy:这对应于传感器上两个相邻单元之间的水平和垂直距离
Kappa:畸变系数用于建模径向透镜畸变(仅用于分割模型)。
Cx,Cy:图像主点(径向畸变中心)的列坐标(Cx)和行坐标(Cy)。
Focal length:焦距
find_surface_model
在3D场景中找到表面模型的最佳匹配

max_diameter_object_model_3d
计算3D对象模型的最大直径。 (AABB的斜对角线)
通过计算物体的凸包,搜索凸包上距离最大的点对,计算三维物体模型的最大直径。
△:3D模型存在的固有性质
fit_primitives_object_model_3d
操作符fit_primitives_object_model_3d将一个3D基元(即一个简单的3D形状)放入一个带有句柄ObjectModel3D的3D对象模型给出的一组3D点中。可作为3D原语使用的形状包括圆柱体、球体和平面。由于操作符没有对输入3D对象模型中包含的3D点集进行分割,因此必须确保包含的3D点已经对应于3D基元。可以执行分段,例如,使用操作符segment_object_model_3d。
fit_primitives_object_model_3d返回输出3D对象模型的句柄ObjectModel3DOut,其中包含有关的信息,例如拟合的3D原语的类型和参数。这个信息可以通过get_object_model_3d_params从3D对象模型中查询。注意,也可以使用get_object_model_3d_params查询平面和柱面类型的原语的范围。
圆柱体的参数是圆心的(x-, y-, z-)坐标,圆柱体主轴的赋范(x-, y-, z-)方向,以及圆柱体的半径。中心不一定位于圆柱体的重心(请参阅操作符gen_圆筒object_model_3d的参数MinExtent和MaxExtent的说明)。对于一个球,参数是中心的(x-, y-, z-)坐标和球的半径。一个平面由hessian标准形式的4个参数给出,即单位法向量(x-, y-, z-)和平面到坐标系原点的正交距离。海塞范式的符号是确定的,使法向量指向原点所在的平面的边,且距离不是正的。
如果没有基元可以拟合到3D点的集合,返回的对象模型将不包含基元。但是,根据’output_point_coord’和’output_xyz_mapping’(见下文)的参数值,返回的对象模型要么为空,要么包含3D点,要么包含3D点以及从3D点到输入对象模型ObjectModel3D的图像坐标的映射。
要控制拟合,可以调整GenParamName和GenParamValue中的一些泛型参数。但请注意,对于许多应用程序,默认值就足够了,不需要调整。GenParamName和GenParamValue可以取值如下:
primitive_type: ‘cylinder’, ‘sphere’, ‘plane’, ‘all’
fitting_algorithm:
参数指定用于拟合3D原语的算法。如果’fitting_algorithm’被设置为’least_squares’,该方法将使3D点与生成的基元之间的二次距离最小化。如果’fitting_algorithm’被设置为’least_squares_huber’,方法类似于’least_squares’,但是根据Huber的方法对点进行加权以减少离群值的影响(见下文)。如果’fitting_algorithm’被设置为’least_squares_tukey’,该方法也类似于’least_squares’,但是基于Tukey的方法会对点进行加权,并忽略离群值(见下)。
对于’least_squares_huber’和’least_squares_tukey’,使用鲁棒误差统计数据来估计从目标点到拟合原语的距离的标准差,而不包括离群值。Tukey算法删除了异常值,而Huber算法只衰减它们,或者更精确地说,线性加权它们。在实践中,建议采用Tukey方法。
output_point_coord
该参数确定用于拟合的3D点是否复制到输出的3D对象模型。如果’copy_point_coord’被设置为’true’, 3D点将被复制。如果’copy_point_coord’设置为’false’,则不复制3D点。
🔺:如果后续只用到了拟合的图元,可以不用返回用于拟合的3D对象模型,这样可以缩小占用的内存

变换流程:

  • 新建一个3*3的单位矩阵
    hom_mat2d_identity (HomMat2DIdentity)
  • 使得矩阵倾斜
    hom_mat2d_slant (HomMat2DIdentity, -SlantAngle, ‘x’, 0, 0, HomMat2DSlant)
    affine_trans_image (Image, ImageRectified, HomMat2DSlant, ‘constant’, ‘true’)

quat_to_hom_mat3d
将四元数转换为相应的旋转矩阵。
Conjugate共轭的

vector_to_hom_mat2d
从点对应近似仿射变换。
△:3点对应3点,最小二乘法

需要注意的是,齐次变换矩阵是指一般的右手数学坐标系。如果使用齐次变换矩阵来变换图像、区域、XLD轮廓或从图像中提取的任何其他数据,则必须在x坐标中传递变换的行坐标,而在y坐标中传递列坐标。因此,传递行坐标和列坐标的顺序遵循通常的顺序(行、列)。这一惯例对于获得用于图形数据转换的右手坐标系是至关重要的,从而特别确保在正确的数学方向上执行旋转。
△:此外,需要注意的是,如果使用一个齐次变换矩阵变换图像,区域,XLD轮廓,或任何其他数据从图像中提取,假定坐标系统的起源的齐次变换矩阵位于左上角的一个像素。但是,返回点坐标的图像处理算子假定原点位于像素中心的坐标系。因此,要得到一致的齐次变换矩阵,必须先在点坐标上加上0.5,再计算变换。(0.5意义:左上角(0,0)像素的中点(0.5,0.5))
例子:
hom_mat2d_translate (HomMat2D, 0.5, 0.5, HomMat2DTmp)
hom_mat2d_translate_local (HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)
affine_trans_image (Image, ImageAffineTrans, HomMat2DAdapted, ‘constant’, ‘true’)
偏移:

刚体:(旋转+偏移)

相似:(XY相同比例+旋转+偏移)

各向异性:(XY不同比例+旋转+偏移)

仿射:

vector_to_proj_hom_mat2d
计算一个射影变换矩阵使用给定的点对应。
△:射影和仿射的区别是,射影是透视变换,

hom_mat2d_to_affine_par

Segments:n.段,片段 v. 把…分割成段
fit_line_contour_xld
fit_line_contour_xld通过线段逼近XLD轮廓。它不执行分割的输入轮廓。因此,必须确保每个轮廓只对应一个线段。运算符为每个轮廓返回起始点(RowBegin, ColBegin)、结束点(RowEnd, ColEnd)和由直线的法向量(Nr, Nc)及其到原点的距离所给出的回归直线,即直线方程为。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Halcon 3D是一种三维视觉软件,能够进行三维物体检测、三维重建、三维匹配等操作。Halcon 3D源码是由该软件的开发团队开发的,可以通过官方网站获得。 Halcon 3D源码可以提供给开发人员进行自定义开发和定制,为用户提供更强大、灵活和个性化的功能。Halcon 3D源码包含了各种算法和数据结构,如匹配算法、三维重建算法等,开发者可以根据自己的需求进行调整和修改。 使用Halcon 3D源码需要具备一定的编程经验和计算机视觉知识,因为它需要使用C++语言进行开发。同时,也需要掌握一些计算机图形学、数学和物理学等方面的知识。但是,Halcon 3D源码提供了文档和实例代码,让开发者可以更快速更好地理解和使用它。 总之,Halcon 3D源码提供了一种高度自由的平台,用户可以基于此平台,快速地开发自己的三维视觉应用。同时,由于Halcon 3D源码是由专业的开发团队开发的,因此它具有高度稳定性和可靠性,可以满足各种商业应用的需求。 ### 回答2: Halcon 3D 源码是一种基于 HDevelop 的工具,用于处理三维视觉数据和成像分析。该源码提供了一种强大的方法和工具,可用于创建高质量的 3D 模型、进行形状分析、进行测量分析、进行物体定位和识别等应用。 Halcon 3D 源码主要包括以下几个部分: 1.三维图像采集:该部分包括从 3D 相机和激光扫描仪中获取数据的相关代码。 2.三维数据处理:该部分包括对 3D 数据进行预处理、分割、滤波、重构、注册等相关代码。 3.三维成像分析:该部分包括对 3D 模型进行形状分析、测量分析、物体定位和识别等相关代码。 4.三维可视化:该部分包括将处理得到的 3D 数据进行可视化表示的相关代码。 Halcon 3D 源码的使用需要一定的编程知识和实践经验,同时需要对 3D 图像处理和成像分析有一定的了解。对于初学者来说,建议先学习相关的基础知识,例如 3D 向量和矩阵运算、点云处理、三角剖分算法等。 总之,Halcon 3D 源码是一种非常强大的工具,可用于处理三维视觉数据和成像分析。它的使用需要一定的编程技能和实践经验,但值得潜心学习和掌握。 ### 回答3: Halcon 3D源码是一种基于Halcon软件,提供三维视觉处理的源码。Halcon软件是由MVTec公司开发的高性能计算机视觉库,提供了丰富的图像处理、分析和识别功能,广泛应用于工业自动化、医疗设备、安防监控等领域。 Halcon 3D源码通过Halcon软件的基本功能,结合三维立体几何变换,实现了三维测量、点云处理、三维重建、三维搜索和三维定位等功能。用户可以使用Halcon 3D源码来处理从不同传感器获得的三维数据,如激光扫描、TOF相机、结构光相机等,从而实现高效、精确、可靠的三维视觉处理。 Halcon 3D源码具有以下优点: 1.高性能:通过利用Halcon软件的高性能计算能力,能够处理大规模的三维数据,实现快速、准确的三维测量和分析。 2.开放性:Halcon 3D源码是一种开放的源码,用户可以根据自己的需求和特定应用场景进行定制和改进。 3.功能丰富:Halcon 3D源码提供了多种三维测量、重建、搜索和定位的功能,适用于不同场景下的应用需求。 4.易用性:Halcon 3D源码通过图形界面和API接口进行操作,用户可以方便地进行编程和应用开发。 总之,Halcon 3D源码是一种功能强大、性能优越的三维视觉处理源码,为工业自动化、医疗设备、安防监控等领域的应用提供了良好的支持。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值