Halcon 3D 表面匹配基于形状

文章目录

  • prepare_object_model_3d 准备 3D 物体模型
  • read_shape_model_3d — 读取3D匹配模型
  • create_shape_model_3d 准备要匹配的3D模型
  • find_shape_model_3d ——发现匹配模型
  • project_shape_model_3d 将三维形状模型的边缘投影到图像坐标中。
  • 示例
    • 'ignore_part_polarity':忽略更大区域的极性变化,能显著加快纹理背景下的搜索速度
    • 'lowest_model_level'参数可减少内存需求
    • find_shape_model_3d 的 recompute_score 匹配精度
  • [Halcon 3D 表面匹配](https://blog.csdn.net/weixin_45672157/article/details/145792032)

prepare_object_model_3d 准备 3D 物体模型

prepare_object_model_3d( : : ObjectModel3D, Purpose, OverwriteData, GenParamName, GenParamValue : )ObjectModel3D类型: object_model_3d(-array)(integer)描述: 3D对象模型的句柄。这是对正在处理的3D对象的引用。Purpose(用途)类型: string → (string)描述: 3D对象模型的用途。默认值: 'shape_based_matching_3d'建议值: 'shape_based_matching_3d', 'segmentation', 'distance_computation'OverwriteData(覆盖数据)类型: string → (string)描述: 指定是否覆盖已存在的数据。默认值: 'true'可选值: 'false', 'true'GenParamName(通用参数名称)类型: attribute.name-array → (string / real / integer)描述: 通用参数的名称列表。默认值: []可选值: 'distance_to', 'max_area_holes', 'max_distance', 'method', 'sampling_dist_abs', 'sampling_dist_rel'GenParamValue(通用参数值)类型: attribute.value-array → (string / real / integer)描述: 通用参数的值列表。默认值: []建议值: 0, 1, 100, 'auto', 'triangles', 'points', 'primitive', 'kd-tree', 'voxel', 'linear', 0.01, 0.03ObjectModel3D: 表示3D对象模型的句柄。通常用于标识和操作特定的3D模型。
Purpose: 定义该3D模型的用途,例如基于形状的匹配 (shape_based_matching_3d)、分割 (segmentation) 或距离计算 (distance_computation)。
OverwriteData: 决定是否覆盖已有数据。如果设置为 'true',则会替换现有数据;如果为 'false',则保留原有数据。GenParamName 和 GenParamValue: 这两个参数成对出现,用于指定通用参数的名称和对应的值。例如:'distance_to': 计算距离的目标。'max_area_holes': 最大孔洞面积。'method': 使用的方法,如 'kd-tree''voxel'

read_shape_model_3d — 读取3D匹配模型

read_shape_model_3d( : : FileName : ShapeModel3DID)FileName类型: filename.read → (string)描述: 包含 3D 形状模型的文件名(包括路径)。文件扩展名: .sm3示例: "model.sm3""C:/models/example.sm3"输出参数 (Output Parameters)ShapeModel3DID类型: shape_model_3d → (integer)描述: 读取的 3D 形状模型的句柄。此句柄用于后续处理和操作。

create_shape_model_3d 准备要匹配的3D模型

create_shape_model_3d( : : ObjectModel3D, CamParam, RefRotX, RefRotY, RefRotZ, OrderOfRotation, LongitudeMin, LongitudeMax, LatitudeMin, LatitudeMax, CamRollMin, CamRollMax, DistMin, DistMax, MinContrast, GenParamName, GenParamValue : ShapeModel3DID)ObjectModel3D类型: object_model_3d → (integer)描述: 输入的 3D 对象模型句柄。用于标识和引用特定的 3D 模型。CamParam类型: campar → (real / integer / string)描述: 内部相机参数,用于定义相机的内参(如焦距、主点位置等)。RefRotX类型: angle.rad → (real)描述: 参考方向:绕 X 轴的旋转角度或 Rodriguez 向量的 X 分量(单位为弧度或无单位)。默认值: 0建议值: -1.57, -0.78, -0.17, 0., 0.17, 0.78, 1.57RefRotY类型: angle.rad → (real)描述: 参考方向:绕 Y 轴的旋转角度或 Rodriguez 向量的 Y 分量(单位为弧度或无单位)。默认值: 0建议值: -1.57, -0.78, -0.17, 0., 0.17, 0.78, 1.57RefRotZ类型: angle.rad → (real)描述: 参考方向:绕 Z 轴的旋转角度或 Rodriguez 向量的 Z 分量(单位为弧度或无单位)。默认值: 0建议值: -1.57, -0.78, -0.17, 0., 0.17, 0.78, 1.57OrderOfRotation类型: string → (string)描述: 参考方向中旋转值的意义。默认值: 'gba'可选值: 'abg', 'gba', 'rodriguez'LongitudeMin 和 LongitudeMax类型: angle.rad → (real)描述: 模型视图的最小和最大经度范围(单位为弧度)。默认值: LongitudeMin = -0.35, LongitudeMax = 0.35限制条件: LongitudeMax >= LongitudeMinLatitudeMin 和 LatitudeMax类型: angle.rad → (real)描述: 模型视图的最小和最大纬度范围(单位为弧度)。默认值: LatitudeMin = -0.35, LatitudeMax = 0.35限制条件: -π/2 <= LatitudeMin <= π/2, -π/2 <= LatitudeMax <= π/2, LatitudeMax >= LatitudeMinCamRollMin 和 CamRollMax类型: angle.rad → (real)描述: 模型视图的最小和最大相机滚转角(单位为弧度)。默认值: CamRollMin = -3.1416, CamRollMax = 3.1416限制条件: CamRollMax >= CamRollMinDistMin 和 DistMax类型: number → (real)描述: 模型视图的最小和最大相机到物体的距离。默认值: DistMin = 0.3, DistMax = 0.4限制条件: DistMin > 0, DistMax >= DistMinMinContrast类型: number → (integer)描述: 搜索图像中物体的最低对比度。默认值: 10建议值: 1, 2, 3, 5, 7, 10, 20, 30, 1000, 2000, 5000GenParamName 和 GenParamValue类型: attribute.name(-array)(string) 和 attribute.value(-array)(integer / real / string)描述: 控制操作行为的通用参数名称及其对应值。默认值: []示例名称: 'metric', 'min_face_angle', 'num_levels'示例值: 0, 1, 2, 'auto', 'ignore_local_polarity''ignore_local_polarity':忽略局部极性变化,适合一般场景'ignore_part_polarity':忽略更大区域的极性变化,能显著加快纹理背景下的搜索速度

find_shape_model_3d ——发现匹配模型

find_shape_model_3d(Image : : ShapeModel3DID, MinScore, Greediness, NumLevels, GenParamName, GenParamValue : Pose, CovPose, Score)
输入参数 (Input Parameters)Image类型: (multichannel-)image → object (byte / uint2)描述: 输入图像,用于在其中查找 3D 形状模型。可以是单通道或多通道图像。ShapeModel3DID类型: shape_model_3d → (integer)描述: 3D 形状模型的句柄。通常是通过 create_shape_model_3d 或 read_shape_model_3d 创建或加载的模型。MinScore类型: real → (real)描述: 找到的模型实例的最低得分阈值。只有得分高于此值的实例才会被返回。默认值: 0.7建议值: 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0典型范围: 0 ≤ MinScore ≤ 1最小增量: 0.01推荐增量: 0.05Greediness类型: real → (real)描述: 搜索启发式的“贪婪度”。值越小,搜索越安全但速度较慢;值越大,搜索越快但可能错过匹配。默认值: 0.9建议值: 0.0, 0.1, 0.2, ..., 1.0典型范围: 0 ≤ Greediness ≤ 1最小增量: 0.01推荐增量: 0.05NumLevels类型: integer-array → (integer)描述: 匹配过程中使用的金字塔层数。如果数组长度为 2,则表示最低和最高金字塔层。默认值: 0可选值: 0, 1, 2, ..., 10GenParamName 和 GenParamValue类型: attribute.name-array → (string) 和 attribute.value-array → (integer / real / string)描述: 控制操作行为的通用参数名称及其对应值。默认值: []示例名称: 'border_model', 'cam_roll_max', 'cam_roll_min', 'cov_pose_mode', ...示例值: -0.78, -0.35, 0.0, 'none', 'true', 'false', ...输出参数 (Output Parameters)Pose类型: pose(-array)(real / integer)描述: 找到的 3D 形状模型的姿态(位置和方向)。每个姿态由 6 个参数表示:3 个平移参数和 3 个旋转参数。CovPose类型: real-array → (real)描述: 姿态参数的 6 个标准差或 36 个协方差值,用于评估姿态估计的不确定性。Score类型: real-array → (real)描述: 找到的 3D 形状模型实例的匹配得分。分数越高,匹配质量越好。

project_shape_model_3d 将三维形状模型的边缘投影到图像坐标中。

project_shape_model_3d( : ModelContours : ShapeModel3DID, CamParam, Pose, HiddenSurfaceRemoval, MinFaceAngle : )
输出参数 (Output Parameters)ModelContours类型: xld_cont-array → object描述: 模型视图的轮廓表示。以 XLD(扩展线描述符)格式存储,可用于绘制或分析。输入参数 (Input Parameters)ShapeModel3DID类型: shape_model_3d → (integer)描述: 3D 形状模型的句柄。通常是通过 create_shape_model_3d 或 read_shape_model_3d 创建或加载的模型。CamParam类型: campar → (real / integer / string)描述: 内部相机参数,用于定义相机的内参(如焦距、主点位置等)。Pose类型: pose → (real / integer)描述: 3D 形状模型在世界坐标系中的姿态(位置和方向)。姿态由 6 个参数表示:3 个平移参数和 3 个旋转参数。HiddenSurfaceRemoval类型: string → (string)描述: 是否移除隐藏表面(即是否启用隐藏面剔除)。默认值: 'true'可选值: 'false', 'true'MinFaceAngle类型: angle.rad → (real / integer)描述: 显示边缘所需的最小面角度(单位为弧度)。小于该角度的边缘将被忽略。默认值: 0.523599(约 30 度)建议值: 0.17, 0.26, 0.35, 0.52

示例

‘ignore_part_polarity’:忽略更大区域的极性变化,能显著加快纹理背景下的搜索速度

在这里插入图片描述

* 这个示例程序展示了如何使用HALCON的3D基于形状的匹配
* 来找到瓷砖间隔片的3D姿态* 由于背景纹理较强,在create_shape_model_3d()中使用'ignore_part_polarity'度量
* 以加快搜索速度。为了展示速度提升,创建了两个3D形状模型:
* 一个使用'ignore_local_polarity'度量,另一个使用'ignore_part_polarity'度量* 然后,为每个找到的对象显示轮廓并比较搜索时间* 本示例还使用了'lowest_model_level'选项,这在示例程序
* 3d_matching_lowest_model_level.hdev中有更详细的解释* 关闭显示更新
dev_update_off ()* 获取并设置异常处理偏好(抑制已处理异常的对话框)
dev_get_preferences ('suppress_handled_exceptions_dlg', SuppressHandledExceptionsDlg)
dev_set_preferences ('suppress_handled_exceptions_dlg', 'true')* 设置相机参数(可以通过相机标定获得)
gen_cam_par_area_scan_division (0.0269462, -354.842, 1.27964e-005, 1.28e-005, 254.24, 201.977, 512, 384, CamParam)* 从相机参数中获取图像宽度和高度
get_cam_par_data (CamParam, 'image_width', IWidth)
get_cam_par_data (CamParam, 'image_height', IHeight)* 关闭并重新打开显示窗口
dev_close_window ()
dev_open_window (0, 0, 512 * 1.5, 384 * 1.5, 'black', WindowHandle)* 设置显示字体
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')* 设置线宽为2
dev_set_line_width (2)* 定义颜色数组
Colors := ['blue','forest green','black']* 获取用于搜索的两个形状模型
acquire_shape_models (WindowHandle, CamParam, ShapeModel3DID1, ShapeModel3DID2)* 显示继续消息并暂停
disp_continue_message (WindowHandle, 'black', 'true')
stop ()* 设置匹配参数
MatchingParameters := ['num_matches','pose_refinement']
MatchingParameterValues := [2,'least_squares_high']
MinScore := 0.65
Greediness := 0.9
NumLevels := 0* 匹配循环
NumImages := 9
for I := 1 to NumImages by 1* 读取图像read_image (Image, 'tile_spacers/tile_spacers_' + I$'02')* 显示图像(使用蓝色)dev_set_color (Colors[0])dev_display (Image)* 使用'ignore_local_polarity'度量的模型1查找最多两个实例Message := 'Search model with \'ignore_local_polarity\' ...'disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')* 记录开始时间count_seconds (Seconds1)* 执行3D形状匹配find_shape_model_3d (Image, ShapeModel3DID1, MinScore, Greediness, NumLevels, MatchingParameters, MatchingParameterValues, Pose, CovPose, Score1)* 记录结束时间count_seconds (Seconds2)Time1 := Seconds2 - Seconds1* 通过投影3D形状模型来可视化找到的匹配for J := 0 to |Score1| - 1 by 1PoseTmp := Pose[J * 7:J * 7 + 6]project_shape_model_3d (ModelContours, ShapeModel3DID1, CamParam, PoseTmp, 'true', rad(30))dev_display (ModelContours)endfor* 显示匹配结果信息Message := 'Search model with \'ignore_local_polarity\': ' + |Score1| + ' Match(es) found in ' + Time1$'.1f' + ' s'disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')* 使用'ignore_part_polarity'度量的模型2查找最多两个实例dev_set_color (Colors[1])Message[1] := 'Search model with \'ignore_part_polarity\' ...'disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')* 记录开始时间count_seconds (Seconds1)* 执行3D形状匹配find_shape_model_3d (Image, ShapeModel3DID2, MinScore, Greediness, NumLevels, MatchingParameters, MatchingParameterValues, Pose, CovPose, Score2)* 记录结束时间count_seconds (Seconds2)Time2 := Seconds2 - Seconds1* 通过投影3D形状模型来可视化找到的匹配(使用虚线样式)set_line_style (WindowHandle, [10,10])for J := 0 to |Score2| - 1 by 1PoseTmp := Pose[J * 7:J * 7 + 6]project_shape_model_3d (ModelContours, ShapeModel3DID1, CamParam, PoseTmp, 'true', rad(30))dev_display (ModelContours)endforset_line_style (WindowHandle, [])* 显示匹配结果信息和速度提升因子Message[1] := 'Search model with \'ignore_part_polarity\':  ' + |Score2| + ' Match(es) found in ' + Time2$'.1f' + ' s'Message[2] := 'Speed-up factor with \'ignore_part_polarity\': ' + (Time1 / Time2)$'.1f'disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')* 如果不是最后一张图像,显示继续消息并暂停if (I < NumImages)disp_continue_message (WindowHandle, 'black', 'true')stop ()endif
endfor* 暂停程序
stop ()* 清除3D形状模型
clear_shape_model_3d (ShapeModel3DID1)
clear_shape_model_3d (ShapeModel3DID2)* 恢复异常处理偏好设置
dev_set_preferences ('suppress_handled_exceptions_dlg', SuppressHandledExceptionsDlg)* 这个示例程序展示了如何使用HALCON的3D基于形状的匹配
* 来找到瓷砖间隔片的3D姿态* 由于背景纹理较强,在create_shape_model_3d()中使用'ignore_part_polarity'度量
* 以加快搜索速度。为了展示速度提升,创建了两个3D形状模型:
* 一个使用'ignore_local_polarity'度量,另一个使用'ignore_part_polarity'度量* 然后,为每个找到的对象显示轮廓并比较搜索时间* 本示例还使用了'lowest_model_level'选项,这在示例程序
* 3d_matching_lowest_model_level.hdev中有更详细的解释* 关闭显示更新
dev_update_off ()* 获取并设置异常处理偏好(抑制已处理异常的对话框)
dev_get_preferences ('suppress_handled_exceptions_dlg', SuppressHandledExceptionsDlg)
dev_set_preferences ('suppress_handled_exceptions_dlg', 'true')* 设置相机参数(可以通过相机标定获得)
gen_cam_par_area_scan_division (0.0269462, -354.842, 1.27964e-005, 1.28e-005, 254.24, 201.977, 512, 384, CamParam)* 从相机参数中获取图像宽度和高度
get_cam_par_data (CamParam, 'image_width', IWidth)
get_cam_par_data (CamParam, 'image_height', IHeight)* 关闭并重新打开显示窗口
dev_close_window ()
dev_open_window (0, 0, 512 * 1.5, 384 * 1.5, 'black', WindowHandle)* 设置显示字体
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')* 设置线宽为2
dev_set_line_width (2)* 定义颜色数组
Colors := ['blue','forest green','black']* 获取用于搜索的两个形状模型
acquire_shape_models (WindowHandle, CamParam, ShapeModel3DID1, ShapeModel3DID2)* 显示继续消息并暂停
disp_continue_message (WindowHandle, 'black', 'true')
stop ()* 设置匹配参数
MatchingParameters := ['num_matches','pose_refinement']
MatchingParameterValues := [2,'least_squares_high']
MinScore := 0.65
Greediness := 0.9
NumLevels := 0* 匹配循环
NumImages := 9
for I := 1 to NumImages by 1* 读取图像read_image (Image, 'tile_spacers/tile_spacers_' + I$'02')* 显示图像(使用蓝色)dev_set_color (Colors[0])dev_display (Image)* 使用'ignore_local_polarity'度量的模型1查找最多两个实例Message := 'Search model with \'ignore_local_polarity\' ...'disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')* 记录开始时间count_seconds (Seconds1)* 执行3D形状匹配find_shape_model_3d (Image, ShapeModel3DID1, MinScore, Greediness, NumLevels, MatchingParameters, MatchingParameterValues, Pose, CovPose, Score1)* 记录结束时间count_seconds (Seconds2)Time1 := Seconds2 - Seconds1* 通过投影3D形状模型来可视化找到的匹配for J := 0 to |Score1| - 1 by 1PoseTmp := Pose[J * 7:J * 7 + 6]project_shape_model_3d (ModelContours, ShapeModel3DID1, CamParam, PoseTmp, 'true', rad(30))dev_display (ModelContours)endfor* 显示匹配结果信息Message := 'Search model with \'ignore_local_polarity\': ' + |Score1| + ' Match(es) found in ' + Time1$'.1f' + ' s'disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')* 使用'ignore_part_polarity'度量的模型2查找最多两个实例dev_set_color (Colors[1])Message[1] := 'Search model with \'ignore_part_polarity\' ...'disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')* 记录开始时间count_seconds (Seconds1)* 执行3D形状匹配find_shape_model_3d (Image, ShapeModel3DID2, MinScore, Greediness, NumLevels, MatchingParameters, MatchingParameterValues, Pose, CovPose, Score2)* 记录结束时间count_seconds (Seconds2)Time2 := Seconds2 - Seconds1* 通过投影3D形状模型来可视化找到的匹配(使用虚线样式)set_line_style (WindowHandle, [10,10])for J := 0 to |Score2| - 1 by 1PoseTmp := Pose[J * 7:J * 7 + 6]project_shape_model_3d (ModelContours, ShapeModel3DID1, CamParam, PoseTmp, 'true', rad(30))dev_display (ModelContours)endforset_line_style (WindowHandle, [])* 显示匹配结果信息和速度提升因子Message[1] := 'Search model with \'ignore_part_polarity\':  ' + |Score2| + ' Match(es) found in ' + Time2$'.1f' + ' s'Message[2] := 'Speed-up factor with \'ignore_part_polarity\': ' + (Time1 / Time2)$'.1f'disp_message (WindowHandle, Message, 'window', 12, 12, Colors, 'true')* 如果不是最后一张图像,显示继续消息并暂停if (I < NumImages)disp_continue_message (WindowHandle, 'black', 'true')stop ()endif
endfor* 暂停程序
stop ()* 清除3D形状模型
clear_shape_model_3d (ShapeModel3DID1)
clear_shape_model_3d (ShapeModel3DID2)* 恢复异常处理偏好设置
dev_set_preferences ('suppress_handled_exceptions_dlg', SuppressHandledExceptionsDlg)

在这里插入图片描述

'lowest_model_level’参数可减少内存需求

在这里插入图片描述

* 本示例展示如何使用HALCON基于形状的3D匹配技术
* 来定位瓷砖间隔片的3D姿态。由于物体在图像中较大,
* 3D模型需要许多不同视角的内部表示,导致模型内存消耗很高。
* 使用'lowest_model_level'参数可减少内存需求:
* - 默认级别为1,提高级别可减少内存(每级约减少3)
* - 同时模型创建时间减少2/* - 代价是匹配鲁棒性可能降低,搜索时间略增(5-10%)
*
* 本例设置'lowest_model_level'3,结果是:
* - 模型内存需求减少6* - 模型创建时间减少4* 关闭显示更新
dev_update_off ()* 获取并设置异常处理偏好(抑制已处理异常的对话框)
dev_get_preferences ('suppress_handled_exceptions_dlg', SuppressHandledExceptionsDlg)
dev_set_preferences ('suppress_handled_exceptions_dlg', 'true')* 设置相机参数(可通过相机标定获得)
gen_cam_par_area_scan_division (0.0269462, -354.842, 1.27964e-005, 1.28e-005, 254.24, 201.977, 512, 384, CamParam)* 获取图像尺寸
get_cam_par_data (CamParam, 'image_width', IWidth)
get_cam_par_data (CamParam, 'image_height', IHeight)* 读取示例图像并初始化窗口
read_image (Image, 'tile_spacers/tile_spacers_color_01')
dev_close_window ()
dev_open_window (0, 0, 512 * 1.5, 384 * 1.5, 'white', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_line_width (3)* 尝试从磁盘读取3D形状模型
dev_clear_window ()
disp_message (WindowHandle, 'Reading the 3D shape model file from disk ...', 'window', 12, 12, 'black', 'false')
tryread_shape_model_3d ('tile_spacer.sm3', ShapeModel3DID)
catch (Exception)* 如果读取失败,则创建新模型* 从DXF文件读取3D对象模型read_object_model_3d ('tile_spacer.dxf', 0.0001, [], [], ObjectModel3DID, DXFStatus)prepare_object_model_3d (ObjectModel3DID, 'shape_based_matching_3d', 'true', [], [])disp_message (WindowHandle, 'Reading the 3D shape model file from disk ... not found!', 'window', 12, 12, 'red', 'false')disp_message (WindowHandle, 'Creating the 3D shape model (may take a few seconds) ...', 'window', 42, 12, 'black', 'false')* 记录模型创建时间count_seconds (S1)* 关键参数设置:使用'lowest_model_level'=3来优化内存和创建时间create_shape_model_3d (ObjectModel3DID, CamParam, 0, 0, 0, 'gba', -rad(60), rad(60), -rad(60), rad(60), 0, rad(360), 0.26, 0.27, 10, 'lowest_model_level', 3, ShapeModel3DID)count_seconds (S2)T := S2 - S1* 清理原始3D对象模型clear_object_model_3d (ObjectModel3DID)* 显示创建时间disp_message (WindowHandle, 'Creation time: ' + T$'.3' + ' s', 'window', 72, 12, 'black', 'false')* 尝试保存模型trydisp_message (WindowHandle, 'Writing model to disk ...', 'window', 102, 12, 'black', 'false')write_shape_model_3d (ShapeModel3DID, 'tile_spacer.sm3')catch (Exception)disp_message (WindowHandle, 'Writing model to disk ... failed!', 'window', 102, 12, 'red', 'false')disp_continue_message (WindowHandle, 'black', 'true')stop ()endtry
endtry* 显示模型级别信息
disp_lowest_model_level_info (WindowHandle)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()* 匹配阶段
Times := []
NumImages := 12
for I := 1 to NumImages by 1read_image (Image, 'tile_spacers/tile_spacers_color_' + I$'02')dev_display (Image)* 查找最多3个实例(设置'border_model''true'因为物体可能接触图像边界)count_seconds (Seconds1)find_shape_model_3d (Image, ShapeModel3DID, 0.7, 0.85, 0, ['num_matches','max_overlap','border_model'], [3,0.75,'true'], Pose, CovPose, Score)count_seconds (Seconds2)Time := Seconds2 - Seconds1Times := [Times,Time]* 可视化匹配结果for J := 0 to |Score| - 1 by 1* 显示轮廓PoseTmp := Pose[J * 7:J * 7 + 6]project_shape_model_3d (ModelContours, ShapeModel3DID, CamParam, PoseTmp, 'true', rad(30))dev_set_color ('yellow')dev_display (ModelContours)* 显示3D坐标系dev_set_colored (3)disp_3d_coord_system (WindowHandle, CamParam, PoseTmp, 0.015)endfor* 显示姿态参数for K := 0 to |Score| - 1 by 1PoseTmp := Pose[K * 7:K * 7 + 6]display_match_pose (ShapeModel3DID, PoseTmp, WindowHandle)endfor* 显示匹配结果信息disp_message (WindowHandle, |Score| + ' Match(es) found in ' + Time$'4.2f' + ' s', 'window', 12, 12, 'dark green', ['white','false'])if (I < NumImages)disp_continue_message (WindowHandle, 'black', ['white','false'])stop ()endif
endfor* 清理资源
clear_shape_model_3d (ShapeModel3DID)
dev_set_preferences ('suppress_handled_exceptions_dlg', SuppressHandledExceptionsDlg)
disp_end_of_program_message (WindowHandle, 'black', ['white','false'])

在这里插入图片描述

find_shape_model_3d 的 recompute_score 匹配精度

在这里插入图片描述

* 本程序演示find_shape_model_3d算子中通用参数'recompute_score'的效果
* 
* 当设置'recompute_score''true'时,姿态优化后会重新计算分数,
* 这可能导致分数值略有不同(但更一致),代价是执行时间稍长* 初始化相机参数
gen_cam_par_area_scan_division (0.01, 0, 7e-6, 7e-6, 320, 240, 640, 480, CamParam)
get_cam_par_data (CamParam, 'image_width', Width)
get_cam_par_data (CamParam, 'image_height', Height)* 创建显示窗口
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_set_part (0, 0, Height - 1, Width - 1)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_update_off ()* 创建立方体3D模型
X := [-1,-1,1,1,-1,-1,1,1]  * X坐标
Y := [1,-1,-1,1,1,-1,-1,1]  * Y坐标
Z := [-1,-1,-1,-1,1,1,1,1]  * Z坐标
Polygons := [4,0,1,2,3,4,4,5,6,7,4,0,1,5,4,4,3,2,6,7,4,0,3,7,4,4,1,2,6,5]  * 多边形定义
gen_object_model_3d_from_points (X, Y, Z, ObjectModel3DID)
set_object_model_3d_attrib_mod (ObjectModel3DID, 'polygons', [], Polygons)* 准备3D对象模型用于匹配
prepare_object_model_3d (ObjectModel3DID, 'shape_based_matching_3d', 'true', [], [])* 显示3D对象模型
disp_object_model_3d_safe (WindowHandle, ObjectModel3DID, CamParam, [0,0,11,30,40,0,0], [], [])
disp_message (WindowHandle, '3D Object Model of a Cube', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()* 生成3D形状模型
create_cube_shape_model_3d (WindowHandle, ObjectModel3DID, CamParam, ShapeModel3DID)
clear_object_model_3d (ObjectModel3DID)* 初始化存储变量
Scores1 := []  * 存储recompute_score=false的分数
Scores2 := []  * 存储recompute_score=true的分数
Times1 := []   * 存储recompute_score=false的时间
Times2 := []   * 存储recompute_score=true的时间
Longitudes := []  * 存储经度值* 设置固定参数
Latitude := rad(45)  * 固定纬度
Distance := 11.5     * 固定距离* 设置显示属性
dev_set_color ('green')
dev_set_line_width (2)* 主循环:在30-60度经度范围内测试
for Longitude := rad(30) to rad(60) by rad(0.25)* 将球坐标转换为笛卡尔坐标convert_point_3d_spher_to_cart (Longitude, Latitude, Distance, '-y', '-z', CamX, CamY, CamZ)* 创建相机姿态create_cam_pose_look_at_point (CamX, CamY, CamZ, 0, 0, 0, '-y', 0, CamPose)* 防止闪烁set_system ('flush_graphic', 'false')* 生成立方体的合成图像project_cube_image (Image, CamPose, CamParam, X, Y, Z, Polygons)* 第一次匹配:recompute_score=falsecount_seconds (Seconds1)find_shape_model_3d (Image, ShapeModel3DID, 0.7, 0.9, 0, [], [], Pose1, CovPose1, Score1)count_seconds (Seconds2)Time1 := (Seconds2 - Seconds1) * 1000.0  * 转换为毫秒* 第二次匹配:recompute_score=truecount_seconds (Seconds1)find_shape_model_3d (Image, ShapeModel3DID, 0.7, 0.9, 0, 'recompute_score', 'true', Pose2, CovPose2, Score2)count_seconds (Seconds2)Time2 := (Seconds2 - Seconds1) * 1000.0  * 转换为毫秒* 显示匹配结果dev_display (Image)if (|Score1| == 1 and |Score2| == 1)* 显示匹配轮廓project_shape_model_3d (ModelContours, ShapeModel3DID, CamParam, Pose1, 'true', rad(30))dev_display (ModelContours)* 显示当前经度信息disp_message (WindowHandle, 'Matching at Longitude: ' + deg(Longitude)$'3.1f' + ' deg (from 30 to 60 deg)', 'window', 12, 12, 'white', 'false')* 生成并显示匹配结果消息gen_matching_result_message (Time1, Time2, Score1, Score2, Message)disp_message (WindowHandle, Message, 'window', 420, 12, ['white','yellow','green'], 'false')* 存储结果数据Longitudes := [Longitudes,deg(Longitude)]Scores1 := [Scores1,Score1]Scores2 := [Scores2,Score2]Times1 := [Times1,Time1]Times2 := [Times2,Time2]endif* 恢复图形刷新set_system ('flush_graphic', 'true')* 通过绘制不可见线条强制刷新显示disp_line (WindowHandle, -1, -1, -1, -1)
endfor* 显示分数值对比图
dev_clear_window ()
Title := ['\'recompute_score\'=\'false\'','\'recompute_score\'=\'true\'']
Colors := ['yellow','green']
plot_tuple (WindowHandle, Longitudes, [Scores1,Scores2], 'Longitude [deg]', 'Matching score', Colors, ['ticks_x','ticks_y','end_y'], [6,.01,1])
disp_message (WindowHandle, Title, 'window', 12, 350, Colors, 'false')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()* 显示时间消耗对比图
dev_clear_window ()
plot_tuple (WindowHandle, Longitudes, [Times1,Times2], 'Longitude [deg]', 'Matching time [ms]', Colors, 'ticks_x', 6)
disp_message (WindowHandle, Title, 'window', 12, 350, Colors, 'false')* 清理3D形状模型
clear_shape_model_3d (ShapeModel3DID)

在这里插入图片描述

Halcon 3D 表面匹配

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/78618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】Java 开发者的 Linux 常用命令指南

Java 开发者的 Linux 常用命令指南 目录标题 Java 开发者的 Linux 常用命令指南1. Linux 目录结构2. 系统信息命令3. 服务管理系统服务防火墙管理 4. 文本编辑 (vi/vim)常用模式 5. 文件和目录操作查看与导航创建与删除查看文件内容查找文件 6. 用户管理7. 压缩和解压8. 权限管…

每日c/c++题 备战蓝桥杯(P1252洛谷 马拉松接力赛)

洛谷P1060 马拉松接力赛题解&#xff1a;贪心算法在资源分配中的巧妙应用 题目描述 P1060 马拉松接力赛是一道结合贪心策略与动态规划思想的资源分配问题。题目要求将25公里的马拉松接力赛合理分配给5名选手&#xff0c;使得总耗时最短。每位选手可跑1-10公里的整数距离&…

Nginx 中间件

Nginx&#xff08;发音为 "engine-x"&#xff09;是一款开源的高性能 HTTP 服务器和反向代理服务器&#xff0c;最初由 Igor Sysoev 开发。 它以其高性能、稳定性、丰富的功能集和低资源消耗而闻名&#xff0c;广泛应用于全球的 Web 服务架构中。 作为中间件&#…

Neo4j在win下安装教程(docker环境)

1. 安装命令 1.1 基于正式neo4j安装–不用 docker run --name neo4j-container -p 7474:7474 -p 7687:7687 -d neo4j1.2 基于community安装 需要部署两个Neo4j&#xff0c;一个正式库prod&#xff0c;一个测试库dev。 neo4j默认监听7474&#xff08;HTTP-也就是浏览器端口&…

kylin v10 + argo + ascend 310p多机多卡 pytorch distributed 训练

最近接了个模型训练编排多机多卡的改造需求&#xff0c;要求使用argo dag task启动多个节点&#xff0c;同时多个节点能实现 torch.distributed.launch 这样多机多卡的训练模式 简述技术 torch.distributed.launch命令介绍 我们在训练分布式时候&#xff0c;会使用到 torch.d…

[Mac] 使用homebrew安装miniconda

使用虚拟环境可以对不同项目的依赖进行隔离。可以使用venv或者conda来创建和使用虚拟环境。 venv是Python内置的虚拟环境管理模块&#xff0c;适合纯Python项目以及快速轻量级的开发和部署。conda具备更强大的版本管理能力&#xff0c;但是占用较大的磁盘空间。 考虑到我基本不…

CMU-15445(1)——环境搭建

前言 最近在找完暑期实习之后&#xff0c;终于有了一些干项目外的空余时间学习新的知识&#xff0c;在这么多轮面试中&#xff0c;数据库的考察非常多&#xff0c;但孱弱的数据库基础导致我有很多次面试被问住&#xff0c;因此我希望在学习CMU-15445&#xff08;Fall 2024&…

CSS元素动画篇:基于当前位置的变换动画(四)

基于当前位置的变换动画&#xff08;四&#xff09; 前言透明效果类元素动画闪烁动画效果效果预览代码实现 淡入动画效果效果预览代码实现 淡出动画效果效果预览代码实现 结语 前言 CSS元素动画一般分为两种&#xff1a;一种是元素基于当前位置的变换动画&#xff0c;通过不明…

STM32驱动AD5318配置8通道DA详细讲解

目录 1. AD5318 芯片特性 2、AD5318寄存器概述 3、SPI数据帧格式 3.1 控制位(Bit15) 3.2 地址位(Bit14-Bit12,3 位) 3.3 数据 / 控制码(Bit11-Bit0) 4、控制功能寄存器(控制位 = 1 时激活) 4.1 参考与增益配置(MM = 00) 4.2. LDAC模式(MM = 01) 4.3 掉…

如何搭建spark yarn 模式的集群集群

以下是搭建Spark YARN模式集群的一般步骤&#xff1a; 准备工作 - 确保集群中各节点安装了Java环境&#xff0c;并配置好 JAVA_HOME 环境变量。 - 各节点间能通过SSH免密登录。 - 安装并配置好Hadoop集群&#xff0c;YARN作为Hadoop的资源管理器&#xff0c;Spark YARN模式需要…

SpringMVC处理请求映射路径和接收参数

目录 springmvc处理请求映射路径 案例&#xff1a;访问 OrderController类的pirntUser方法报错&#xff1a;java.lang.IllegalStateException&#xff1a;映射不明确 核心错误信息 springmvc接收参数 一 &#xff0c;常见的字符串和数字类型的参数接收方式 1.1 请求路径的…

在 Windows 系统上升级 Node.js

一、查询电脑端已经安装的 Node.js 版本 1、通过【winR】 键&#xff0c;输入 cmd&#xff0c;点击【确定】按钮打开 cmd 窗口 2、命令行界面输入 node -v 查看目前 Node.js 版本 3、命令行界面输入 npm -v 查看目前 npm 版本 二、进入官网地址下载安装包 1、官网地址&#x…

深入详解人工智能数学基础——概率论中的马尔可夫链蒙特卡洛(MCMC)采样

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…

C++ 嵌套类 (详解 一站式讲解)

目录 嵌套类 嵌套类的定义 嵌套类结构的访问权限 pimpl模式&#xff08;了解&#xff09; 嵌套类 嵌套类的定义 首先介绍两个概念&#xff1a; 类作用域&#xff08;Class Scope&#xff09; 类作用域是指在类定义内部的范围。在这个作用域内定义的成员&#xff08;包括…

tcp 和http 网络知识

1. 请简述TCP和HTTP的定义与基本概念 TCP&#xff1a;即传输控制协议&#xff08;Transmission Control Protocol&#xff09;&#xff0c;是一种面向连接的、可靠的、基于字节流的传输层通信协议。它为互联网中的数据通信提供稳定的传输机制&#xff0c;在不可靠的IP层之上&a…

MySQL安装的多个组件中无用组件卸载

在决定卸载MySQL的哪些组件前&#xff0c;需根据你的实际使用场景判断。以下是各组件的主要功能及卸载建议&#xff1a; 1. 核心组件卸载建议 组件名称作用是否可卸载MySQL Server数据库服务核心&#xff0c;存储数据、处理SQL请求的核心程序。不可卸载 &#xff08;卸载会导致…

CosyVoice 技术全景解析:下一代语音生成模型的革命性突破

目录 一、CosyVoice 模型概述 1. 背景与定位 二、技术架构与创新 1. 核心架构设计 2. 关键技术亮点 三、行业地位与竞品对比 1. 市场定位分析 2. 竞争优势 四、部署方案与硬件成本 1. 硬件需求 2. 优化技巧 五、优势与挑战 1. 核心优势 2. 主要挑战 六、开源生态…

rabbitmq-集群部署

场景&#xff1a;单个pod&#xff0c;部署在主节点&#xff0c;基础版没有插件&#xff0c;进阶版多了一个插件 基础版本&#xff1a; --- apiVersion: v1 kind: PersistentVolume metadata:name: rabbitmq-pv spec:capacity:storage: 5GiaccessModes:- ReadWriteOncestorage…

[密码学实战]商用密码产品密钥体系架构:从服务器密码机到动态口令系统

[密码学实战]商用密码产品密钥体系架构:从服务器密码机到动态口令系统 关键词:商用密码、密钥体系、服务器密码机、金融数据密码机、动态口令、智能密码钥匙 摘要:本文深度解读商用密码产品的核心密钥体系架构,涵盖服务器密码机、金融数据密码机、VPN产品、动态口令系统及…

【unity游戏开发入门到精通——UGUI】UI事件监听接口

注意&#xff1a;考虑到UGUI的内容比较多&#xff0c;我将UGUI的内容分开&#xff0c;并全部整合放在【unity游戏开发——UGUI】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言1、什么是UGUI事件接口&#xff1f;2、想要监听事件步骤 一、事件接口1、U…