隶属于:
C:\Users\Public\Documents\MVTec\HALCON-23.05-Progress\examples\solution_guide\matching
【模板相关】:
创建模板
- 创建模板
reduce_domain (ModelImage, ModelROI, ImageROI)
create_generic_shape_model (ModelID)
set_generic_shape_model_param (ModelID, ‘num_levels’, 4)
set_generic_shape_model_param (ModelID, ‘optimization’, ‘none’)
set_generic_shape_model_param (ModelID, ‘contrast_high’, 30)
train_generic_shape_model (ImageROI, ModelID)
get_generic_shape_model_object (ModelContours, ModelID, ‘contours’)
hom_mat2d_identity (HomMat2DModelContours)
hom_mat2d_translate (HomMat2DModelContours, CenterROIRow, CenterROIColumn, HomMat2DModelContours)
affine_trans_contour_xld (ModelContours, ModelContoursTranslated, HomMat2DModelContours)
查找模板并设置参数
-
设置搜索参数
set_generic_shape_model_param (ModelID, ‘min_contrast’, 10)
set_generic_shape_model_param (ModelID, ‘angle_start’, 0.0)
set_generic_shape_model_param (ModelID, ‘angle_end’, 0.0)
set_generic_shape_model_param (ModelID, ‘max_overlap’, 0.0)
set_generic_shape_model_param (ModelID, ‘min_score’, 0.8)
set_generic_shape_model_param (ModelID, ‘greediness’, 0.7)
find_generic_shape_model (SearchImage, ModelID, MatchResultID, NumMatchResult)
if (NumMatchResult > 0) -
用于可视化:按从左到右的顺序显示结果(列值递增),而不是按匹配得分递增的顺序显示匹配结果。
get_generic_shape_model_result (MatchResultID, ‘all’, ‘column’, Column)
Indices := sort_index(Column)
for I := 0 to NumMatchResult - 1 by 1 -
确定仿射变换。
-
为了演示目的,我们采用不同的方法来实现。
-
方法1:使用vector_angle_to_rigid函数。 get_generic_shape_model_result (MatchResultID, Indices[I], 'row', RowCheck) get_generic_shape_model_result (MatchResultID, Indices[I], 'column', ColumnCheck) get_generic_shape_model_result (MatchResultID, Indices[I], 'angle', AngleCheck) vector_angle_to_rigid (0, 0, 0, RowCheck, ColumnCheck, AngleCheck, MovementOfObject) affine_trans_contour_xld (ModelContours, ModelAtNewPosition, MovementOfObject) dev_display (ModelAtNewPosition) * 方法2:直接提取找到的实例。 get_generic_shape_model_result (MatchResultID, Indices[I], 'hom_mat_2d', MovementOfObject) get_generic_shape_model_result_object (ModelAtNewPosition, MatchResultID, Indices[I], 'contours')
-
测量齿的宽度和间距。
endfor
endif
算子说明:
1、set_generic_shape_model_param
set_generic_shape_model_param 是 HALCON 中用于设置通用形状模型参数的算子,以下是对该算子的详细介绍:
功能
set_generic_shape_model_param 用于修改形状模型的参数。这些参数可以影响模型的匹配行为、优化策略以及对噪声的处理能力等。
参数
ModelID:形状模型的句柄,用于标识要修改参数的模型。
GenParamName:要设置的参数名称。
GenParamValue:对应参数的新值。
常见参数及作用
min_contrast:设置模型的最小对比度。较高的值可以减少噪声的影响,但可能错过对比度较低的边缘。
angle_start 和 angle_end:定义模型在匹配时允许的旋转角度范围。
max_overlap:控制匹配结果之间的最大重叠度。
min_score:设置匹配的最小得分,只有得分高于此值的匹配结果才会被接受。
greediness:控制匹配算法的贪婪程度,较高的值可以加快匹配速度,但可能降低匹配精度。
training_samples:用于设置训练样本,这些样本用于优化模型参数。
clutter_region:设置模型的杂波区域,用于处理图像中的噪声或干扰。
clutter_hom_mat_2d:用于定义杂波区域的变换矩阵。
使用场景
优化匹配性能:通过调整 min_contrast、angle_start、angle_end 等参数,可以优化模型在特定图像条件下的匹配性能。
处理噪声图像:通过设置 high_noise_sample 参数,可以让模型更好地适应高噪声图像。
调整匹配精度:通过调整 min_score 和 greediness 参数,可以在匹配精度和速度之间进行权衡。
示例代码
以下是一个简单的示例,展示如何使用 set_generic_shape_model_param 设置形状模型的参数:
hdev复制
-
创建形状模型
create_generic_shape_model (ModelContour, ‘auto’, -pi, pi, ‘auto’, ‘auto’, ‘use_polarity’, ‘auto’, ‘auto’, ModelID) -
设置参数
set_generic_shape_model_param (ModelID, ‘min_contrast’, 10)
set_generic_shape_model_param (ModelID, ‘angle_start’, 0.0)
set_generic_shape_model_param (ModelID, ‘angle_end’, 0.0)
set_generic_shape_model_param (ModelID, ‘max_overlap’, 0.0)
set_generic_shape_model_param (ModelID, ‘min_score’, 0.8)
set_generic_shape_model_param (ModelID, ‘greediness’, 0.7) -
使用模型进行匹配
find_generic_shape_model (SearchImage, ModelID, MatchResultID, NumMatchResult)
通过合理设置这些参数,可以显著提高形状匹配的准确性和效率。
2、create_generic_shape_model
create_generic_shape_model 是 HALCON 中的一个算子,用于创建一个通用形状模型,以便后续进行形状匹配操作。以下是其翻译及详细解释:
中文翻译
create_generic_shape_model 的中文翻译是 “创建通用形状模型”。
功能
该算子用于从给定的轮廓或区域创建一个通用形状模型。这个模型可以用于后续的形状匹配操作,例如通过 find_generic_shape_model 算子在图像中查找与模型相似的形状。
参数
Contour:输入的轮廓或多边形,用于定义形状模型的形状。
NumLevels:金字塔的层数。通常设置为 ‘auto’,让 HALCON 自动选择最优层数。
AngleStart 和 AngleEnd:定义模型在匹配时允许的旋转角度范围。
MinScale 和 MaxScale:定义模型在匹配时允许的缩放比例范围。
MinScore:匹配的最小得分阈值,只有得分高于此值的匹配结果才会被接受。
MaxOverlap:匹配结果之间的最大重叠度。
SubPixel:是否使用亚像素级精度进行匹配,通常设置为 ‘least_squares’ 或 ‘use_polarity’。
NumMatches:每次匹配时返回的匹配结果数量。
ModelID:输出的形状模型句柄,用于后续的匹配操作。
示例代码
以下是一个简单的示例,展示如何使用 create_generic_shape_model 创建形状模型:
hdev复制
-
定义轮廓
gen_rectangle1_contour_xld (Contour, 10, 20, 30, 40) -
创建形状模型
create_generic_shape_model (Contour, ‘auto’, -pi, pi, 0.5, 2.0, ‘use_polarity’, ‘auto’, ‘auto’, ModelID) -
使用模型进行匹配
find_generic_shape_model (Image, ModelID, -pi, pi, 0.5, 2.0, ‘least_squares’, 0, 0.9, Row, Column, Angle, Score)
详细解释
Contour:输入的轮廓或多边形,用于定义形状模型的形状。可以是 XLD 轮廓或多边形。
NumLevels:金字塔的层数。通常设置为 ‘auto’,让 HALCON 自动选择最优层数。也可以手动设置一个整数值。
AngleStart 和 AngleEnd:定义模型在匹配时允许的旋转角度范围。例如,-pi 到 pi 表示允许模型在 -180° 到 +180° 之间旋转。
MinScale 和 MaxScale:定义模型在匹配时允许的缩放比例范围。例如,0.5 到 2.0 表示模型可以缩小到 50% 或放大到 200%。
MinScore:匹配的最小得分阈值,只有得分高于此值的匹配结果才会被接受。
MaxOverlap:匹配结果之间的最大重叠度。例如,0.5 表示两个匹配结果之间的重叠度不能超过 50%。
SubPixel:是否使用亚像素级精度进行匹配。通常设置为 ‘least_squares’ 或 ‘use_polarity’。
NumMatches:每次匹配时返回的匹配结果数量。例如,设置为 1 表示每次只返回一个最佳匹配结果。
ModelID:输出的形状模型句柄,用于后续的匹配操作。
通过 create_generic_shape_model 创建的形状模型可以用于在图像中查找与模型相似的形状,非常适合用于工业视觉检测、目标定位等场景。
3、train_generic_shape_model
train_generic_shape_model 是 HALCON 中的一个算子,用于对通用形状模型进行训练,以优化模型的匹配性能。以下是其翻译及详细解释:
中文翻译
train_generic_shape_model 的中文翻译是 “训练通用形状模型”。
功能
该算子用于对已经创建的通用形状模型进行训练,以提高其在复杂图像条件下的匹配性能。训练过程会根据提供的样本图像或轮廓,优化模型的参数,使其能够更好地适应不同的图像特征和噪声情况。
参数
ModelID:要训练的通用形状模型的句柄。这个句柄是在创建模型时通过 create_generic_shape_model 生成的。
SampleImage:用于训练的样本图像。这些图像应包含目标形状的实例,用于优化模型的参数。
GenParamName:可选的通用参数名称,用于指定训练过程中的特定设置。
GenParamValue:与 GenParamName 对应的参数值。
常见参数及作用
training_samples:指定用于训练的样本图像数量。
clutter_region:定义模型的杂波区域,用于处理图像中的噪声或干扰。
clutter_hom_mat_2d:用于定义杂波区域的变换矩阵。
high_noise_sample:指定是否使用高噪声样本进行训练,以提高模型对噪声的鲁棒性。
num_training_steps:训练的步数,控制训练过程的迭代次数。
示例代码
以下是一个简单的示例,展示如何使用 train_generic_shape_model 对通用形状模型进行训练:
hdev复制
-
创建形状模型
create_generic_shape_model (ModelContour, ‘auto’, -pi, pi, 0.5, 2.0, ‘use_polarity’, ‘auto’, ‘auto’, ModelID) -
准备训练样本图像
read_image (SampleImage, ‘sample_image_path’) -
训练形状模型
train_generic_shape_model (ModelID, SampleImage, [], []) -
使用训练后的模型进行匹配
find_generic_shape_model (Image, ModelID, -pi, pi, 0.5, 2.0, ‘least_squares’, 0, 0.9, Row, Column, Angle, Score)
详细解释
ModelID:要训练的通用形状模型的句柄。这个句柄是在创建模型时通过 create_generic_shape_model 生成的。
SampleImage:用于训练的样本图像。这些图像应包含目标形状的实例,用于优化模型的参数。
GenParamName 和 GenParamValue:可选的通用参数,用于指定训练过程中的特定设置。例如,可以指定训练的步数、是否使用高噪声样本等。
训练过程:train_generic_shape_model 会根据提供的样本图像对模型进行优化,调整模型的参数以提高匹配性能。训练完成后,模型会更加鲁棒,能够更好地处理噪声和复杂的图像背景。
使用场景
提高匹配鲁棒性:通过训练,模型可以更好地适应不同的图像条件,例如光照变化、噪声干扰等。
优化匹配性能:训练过程可以优化模型的参数,提高匹配的准确性和速度。
处理复杂背景:通过指定杂波区域或使用高噪声样本进行训练,模型可以更好地处理复杂背景中的目标形状。
通过合理使用 train_generic_shape_model,可以显著提高形状匹配的准确性和鲁棒性,特别是在复杂的工业视觉检测场景中。
4、find_generic_shape_model
find_generic_shape_model 是 HALCON 中的一个算子,用于在图像中查找与通用形状模型匹配的实例。以下是其翻译及详细解释:
中文翻译
find_generic_shape_model 的中文翻译是 “查找通用形状模型”。
功能
该算子用于在给定的图像中查找与之前通过 create_generic_shape_model 创建并可能通过 train_generic_shape_model 训练的通用形状模型匹配的实例。它会返回匹配结果的位置、角度、得分等信息。
参数
Image:输入图像,用于在其中查找形状模型的匹配实例。
ModelID:通用形状模型的句柄,该句柄是在创建模型时通过 create_generic_shape_model 生成的。
AngleStart 和 AngleEnd:定义模型在匹配时允许的旋转角度范围。
MinScale 和 MaxScale:定义模型在匹配时允许的缩放比例范围。
MinScore:匹配的最小得分阈值,只有得分高于此值的匹配结果才会被接受。
NumMatches:每次匹配时返回的匹配结果数量。
MaxOverlap:匹配结果之间的最大重叠度。
SubPixel:是否使用亚像素级精度进行匹配,通常设置为 ‘least_squares’ 或 ‘use_polarity’。
Row, Column, Angle, Score:输出参数,分别表示匹配结果的中心行坐标、中心列坐标、旋转角度和匹配得分。
示例代码
以下是一个简单的示例,展示如何使用 find_generic_shape_model 在图像中查找形状模型的匹配实例:
hdev复制
-
创建形状模型
create_generic_shape_model (ModelContour, ‘auto’, -pi, pi, 0.5, 2.0, ‘use_polarity’, ‘auto’, ‘auto’, ModelID) -
读取待匹配的图像
read_image (Image, ‘image_path’) -
查找匹配实例
find_generic_shape_model (Image, ModelID, -pi, pi, 0.5, 2.0, ‘least_squares’, 0, 0.9, Row, Column, Angle, Score) -
输出匹配结果
write_string (WindowHandle, ‘Match found at: (’ + Row + ', ’ + Column + ‘)’)
write_string (WindowHandle, 'Angle: ’ + Angle)
write_string (WindowHandle, 'Score: ’ + Score)
详细解释
Image:输入图像,用于在其中查找形状模型的匹配实例。
ModelID:通用形状模型的句柄,该句柄是在创建模型时通过 create_generic_shape_model 生成的。
AngleStart 和 AngleEnd:定义模型在匹配时允许的旋转角度范围。例如,-pi 到 pi 表示允许模型在 -180° 到 +180° 之间旋转。
MinScale 和 MaxScale:定义模型在匹配时允许的缩放比例范围。例如,0.5 到 2.0 表示模型可以缩小到 50% 或放大到 200%。
MinScore:匹配的最小得分阈值,只有得分高于此值的匹配结果才会被接受。
NumMatches:每次匹配时返回的匹配结果数量。例如,设置为 1 表示每次只返回一个最佳匹配结果。
MaxOverlap:匹配结果之间的最大重叠度。例如,0.5 表示两个匹配结果之间的重叠度不能超过 50%。
SubPixel:是否使用亚像素级精度进行匹配,通常设置为 ‘least_squares’ 或 ‘use_polarity’。
Row, Column, Angle, Score:输出参数,分别表示匹配结果的中心行坐标、中心列坐标、旋转角度和匹配得分。
使用场景
目标定位:在图像中快速定位目标形状的位置和方向。
质量检测:检测生产线上的零件是否符合预定的形状模型。
复杂背景下的匹配:通过优化模型参数,可以在复杂的背景中准确匹配目标形状。
通过合理设置参数,find_generic_shape_model 可以高效地在图像中查找与形状模型匹配的实例,广泛应用于工业视觉检测、目标识别等场景。
5、get_generic_shape_model_result
get_generic_shape_model_result 是 HALCON 中的一个算子,用于获取通用形状模型匹配的结果。以下是其翻译及详细解释:
中文翻译
get_generic_shape_model_result 的中文翻译是 “获取通用形状模型匹配结果”。
功能
该算子用于从匹配结果中提取详细信息,例如匹配实例的边界框、轮廓、变换矩阵等。这些信息可以用于进一步的分析或可视化。
参数
MatchResultID:匹配结果的句柄,该句柄是在调用 find_generic_shape_model 时生成的。
ResultType:指定要获取的匹配结果类型,例如边界框、轮廓、变换矩阵等。
ResultValue:输出参数,包含匹配结果的具体信息。
常见的 ResultType 及其含义
row 和 column:匹配结果的中心点坐标。
angle:匹配结果的旋转角度。
score:匹配结果的得分,表示匹配的相似度。
bbox:匹配结果的边界框,包含左上角和右下角的坐标。
contour:匹配结果的轮廓,以 XLD 轮廓的形式返回。
hom_mat_2d:匹配结果的二维变换矩阵,用于将模型坐标变换到图像坐标。
num_matches:返回的匹配结果数量。
示例代码
以下是一个简单的示例,展示如何使用 get_generic_shape_model_result 获取匹配结果的详细信息:
hdev复制
-
创建形状模型
create_generic_shape_model (ModelContour, ‘auto’, -pi, pi, 0.5, 2.0, ‘use_polarity’, ‘auto’, ‘auto’, ModelID) -
读取待匹配的图像
read_image (Image, ‘image_path’) -
查找匹配实例
find_generic_shape_model (Image, ModelID, -pi, pi, 0.5, 2.0, ‘least_squares’, 0, 0.9, MatchResultID) -
获取匹配结果的详细信息
get_generic_shape_model_result (MatchResultID, ‘row’, Row)
get_generic_shape_model_result (MatchResultID, ‘column’, Column)
get_generic_shape_model_result (MatchResultID, ‘angle’, Angle)
get_generic_shape_model_result (MatchResultID, ‘score’, Score)
get_generic_shape_model_result (MatchResultID, ‘bbox’, BBox) -
输出匹配结果
write_string (WindowHandle, ‘Match found at: (’ + Row + ', ’ + Column + ‘)’)
write_string (WindowHandle, 'Angle: ’ + Angle)
write_string (WindowHandle, 'Score: ’ + Score)
write_string (WindowHandle, 'Bounding Box: ’ + BBox)
详细解释
MatchResultID:匹配结果的句柄,该句柄是在调用 find_generic_shape_model 时生成的。
ResultType:指定要获取的匹配结果类型。例如:
row 和 column:返回匹配结果的中心点坐标。
angle:返回匹配结果的旋转角度。
score:返回匹配结果的得分,表示匹配的相似度。
bbox:返回匹配结果的边界框,包含左上角和右下角的坐标。
contour:返回匹配结果的轮廓,以 XLD 轮廓的形式返回。
hom_mat_2d:返回匹配结果的二维变换矩阵,用于将模型坐标变换到图像坐标。
ResultValue:输出参数,包含匹配结果的具体信息。根据 ResultType 的不同,返回不同类型的数据。
使用场景
进一步分析:获取匹配结果的详细信息,例如边界框或轮廓,用于进一步的图像分析或处理。
可视化:将匹配结果的轮廓或边界框绘制在图像上,用于可视化匹配结果。
定位和测量:通过获取匹配结果的中心点坐标和旋转角度,用于目标的精确定位和测量。
通过合理使用 get_generic_shape_model_result,可以获取匹配结果的详细信息,从而更好地满足实际应用中的需求。
6、get_generic_shape_model_result_object
get_generic_shape_model_result_object 的中文翻译是 “获取通用形状模型匹配结果对象”。
功能
该算子用于从匹配结果中提取特定的对象信息,例如匹配实例的轮廓、边界框或其他相关对象。这些信息可以用于进一步的分析或可视化。
参数
ResultObject:输出的匹配结果对象,例如轮廓或边界框。
MatchResultID:匹配结果的句柄,该句柄是在调用 find_generic_shape_model 时生成的。
ResultType:指定要获取的匹配结果类型,例如 ‘all’ 或特定的匹配结果索引。
ResultObjectMode:指定结果对象的模式,例如 ‘contours’ 表示提取轮廓。
示例代码
以下是一个简单的示例,展示如何使用 get_generic_shape_model_result_object 获取匹配结果的轮廓:
hdev复制
-
创建形状模型
create_generic_shape_model (ModelContour, ‘auto’, -pi, pi, 0.5, 2.0, ‘use_polarity’, ‘auto’, ‘auto’, ModelID) -
读取待匹配的图像
read_image (Image, ‘image_path’) -
查找匹配实例
find_generic_shape_model (Image, ModelID, -pi, pi, 0.5, 2.0, ‘least_squares’, 0, 0.9, MatchResultID) -
获取匹配结果的轮廓
get_generic_shape_model_result_object (Contours, MatchResultID, ‘all’, ‘contours’) -
显示匹配结果
dev_display (Image)
dev_display (Contours)
使用场景
轮廓提取:获取匹配实例的轮廓,用于进一步的分析或可视化。
边界框提取:获取匹配实例的边界框,用于定位目标。
多目标匹配:在图像中匹配多个目标,并提取每个目标的详细信息。
通过合理使用 get_generic_shape_model_result_object,可以方便地获取匹配结果的详细对象信息,从而更好地满足实际应用中的需求。
测量:
1、translate_measure
translate_measure 的中文翻译是 “平移测量对象”。
功能
该算子用于将一个测量对象的参考点平移到指定的新位置。它通常与形状匹配函数(如 find_shape_model)结合使用,用于获取新测试对象的参考点。
参数
MeasureHandle:测量对象的句柄。
Row:新参考点的行坐标。
Column:新参考点的列坐标。
使用场景
多目标测量:在同一个测量句柄中处理多个测试对象时,通过平移参考点来分别处理每个对象。
动态测量:根据匹配结果动态调整测量对象的参考点,以便进行进一步的测量或分析。
示例代码
hdev复制
-
创建测量对象
gen_measure_rectangle2 (Row, Column, Phi, LengthRow, LengthColumn, ‘auto’, MeasureHandle) -
查找形状模型
find_shape_model (Image, ModelID, -pi, pi, 0.5, 2.0, ‘least_squares’, 0, 0.9, MatchResultID) -
获取匹配结果的参考点
get_shape_model_contour_xld (ModelContour, ModelID, 0, 1)
get_contour_global_attrib_xld (ModelContour, ‘row’, Row)
get_contour_global_attrib_xld (ModelContour, ‘column’, Column) -
平移测量对象的参考点
translate_measure (MeasureHandle, Row, Column)
通过 translate_measure,可以灵活地调整测量对象的参考点,从而更好地适应不同的测量需求。
此例程相关:
主要的思路是:
创建一个xld模板,创建测量位置;
查找模板并仿射变换到固定位置,并将测量位置移动到测量位置进行测量;
测量完毕,判断NG条件,来确认是否NG。
读入原图
为模板创建ROI区域
生成模板
生成测量区域
将测量区域中心设置到坐标原点
设置查找模板参数
查找模板,并将测量区域放射变换到测量位置
显示并在位置测量
有个数小于37且,有某个间距大于4,则NG,遍历寻找NG位置并标红
标红如右
整体显示如下
* ------------------------------------------------------------------------------------------------
* 本示例程序使用基于形状的匹配方法来对齐测量工具的感兴趣区域(ROI),以便对单个剃须刀片进行检测。
* 程序可以以两种模式运行:
* (1) 使用完整的仿射变换
* (2) 使用translate_measure函数
* 修改下一行代码可切换运行模式。
USING_TRANSLATE_MEASURE := 1
* ------------------------------------------------------------------------------------------------
* HDevelop 的通用配置。
dev_update_off ()
read_image (ModelImage, 'razors1')
get_image_pointer1 (ModelImage, Pointer, Type, Width, Height)
dev_close_window ()
dev_open_window (0, 0, 500, Height, 'white', WindowHandle)
dev_set_part (0, 0, Height - 1, Width - 1)
dev_display (ModelImage)
dev_set_color ('cyan')
dev_set_draw ('margin')
dev_set_line_width (2)
stop ()
* ------------------- Start of the application ----------------
* Select the model object.
Row1 := 46
Column1 := 57
Row2 := 79
Column2 := 94
gen_rectangle1 (ROIPart1, Row1, Column1, Row2, Column2)
gen_rectangle1 (ROIPart2, Row1 + 364, Column1 + 13, Row2 + 364, Column2 + 13)
union2 (ROIPart1, ROIPart2, ModelROI)
area_center (ModelROI, Area, CenterROIRow, CenterROIColumn)
dev_display (ModelImage)
dev_display (ModelROI)
stop ()
*
* Create the model.
reduce_domain (ModelImage, ModelROI, ImageROI)
create_generic_shape_model (ModelID)
set_generic_shape_model_param (ModelID, 'num_levels', 4)
set_generic_shape_model_param (ModelID, 'optimization', 'none')
set_generic_shape_model_param (ModelID, 'contrast_high', 30)
train_generic_shape_model (ImageROI, ModelID)
get_generic_shape_model_object (ModelContours, ModelID, 'contours')
hom_mat2d_identity (HomMat2DModelContours)
hom_mat2d_translate (HomMat2DModelContours, CenterROIRow, CenterROIColumn, HomMat2DModelContours)
affine_trans_contour_xld (ModelContours, ModelContoursTranslated, HomMat2DModelContours)
dev_clear_window ()
dev_set_color ('blue')
dev_display (ModelContoursTranslated)
stop ()
*
* 创建描述测量感兴趣区域(ROI)的变量,并显示它们。
Rect1Row := 244
Rect1Col := 73
DistColRect1Rect2 := 17
Rect2Row := Rect1Row
Rect2Col := Rect1Col + DistColRect1Rect2
RectPhi := rad(90)
RectLength1 := 122
RectLength2 := 2
gen_rectangle2 (MeasureROI1, Rect1Row, Rect1Col, RectPhi, RectLength1, RectLength2)
gen_rectangle2 (MeasureROI2, Rect2Row, Rect2Col, RectPhi, RectLength1, RectLength2)
dev_display (ModelImage)
dev_set_color ('yellow')
dev_display (MeasureROI1)
dev_display (MeasureROI2)
* 将测量感兴趣区域(ROI)平移至XLD模型上(不进行裁剪)。
get_system ('clip_region', OriginalClipRegion)
set_system ('clip_region', 'false')
move_region (MeasureROI1, MeasureROI1Ref, -CenterROIRow, -CenterROIColumn)
move_region (MeasureROI2, MeasureROI2Ref, -CenterROIRow, -CenterROIColumn)
set_system ('clip_region', OriginalClipRegion)
DistRect1CenterRow := Rect1Row - CenterROIRow
DistRect1CenterCol := Rect1Col - CenterROIColumn
DistRect2CenterRow := Rect2Row - CenterROIRow
DistRect2CenterCol := Rect2Col - CenterROIColumn
if (USING_TRANSLATE_MEASURE != 0)
* 测量对象仅在前面创建一次,然后在后续进行平移操作。
gen_measure_rectangle2 (Rect1Row, Rect1Col, RectPhi, RectLength1, RectLength2, Width, Height, 'bilinear', MeasureHandle1)
gen_measure_rectangle2 (Rect2Row, Rect2Col, RectPhi, RectLength1, RectLength2, Width, Height, 'bilinear', MeasureHandle2)
endif
stop ()
*
* 在另一幅图像中找到这些对象。
read_image (SearchImage, 'razors2')
dev_display (SearchImage)
* 设置搜索参数
set_generic_shape_model_param (ModelID, 'min_contrast', 10)
set_generic_shape_model_param (ModelID, 'angle_start', 0.0)
set_generic_shape_model_param (ModelID, 'angle_end', 0.0)
set_generic_shape_model_param (ModelID, 'max_overlap', 0.0)
set_generic_shape_model_param (ModelID, 'min_score', 0.8)
set_generic_shape_model_param (ModelID, 'greediness', 0.7)
find_generic_shape_model (SearchImage, ModelID, MatchResultID, NumMatchResult)
if (NumMatchResult > 0)
* 用于可视化:按从左到右的顺序显示结果(列值递增),而不是按匹配得分递增的顺序显示匹配结果。
get_generic_shape_model_result (MatchResultID, 'all', 'column', Column)
Indices := sort_index(Column)
for I := 0 to NumMatchResult - 1 by 1
*
* 确定仿射变换。
* 为了演示目的,我们采用不同的方法来实现。
* 方法1:使用vector_angle_to_rigid函数。
get_generic_shape_model_result (MatchResultID, Indices[I], 'row', RowCheck)
get_generic_shape_model_result (MatchResultID, Indices[I], 'column', ColumnCheck)
get_generic_shape_model_result (MatchResultID, Indices[I], 'angle', AngleCheck)
vector_angle_to_rigid (0, 0, 0, RowCheck, ColumnCheck, AngleCheck, MovementOfObject)
affine_trans_contour_xld (ModelContours, ModelAtNewPosition, MovementOfObject)
dev_display (ModelAtNewPosition)
* 方法2:直接提取找到的实例。
get_generic_shape_model_result (MatchResultID, Indices[I], 'hom_mat_2d', MovementOfObject)
get_generic_shape_model_result_object (ModelAtNewPosition, MatchResultID, Indices[I], 'contours')
*
* 测量齿的宽度和间距。
* 显示移动后的感兴趣区域(ROI)。
affine_trans_region (MeasureROI1Ref, MeasureROI1AtNewPosition, MovementOfObject, 'constant')
affine_trans_region (MeasureROI2Ref, MeasureROI2AtNewPosition, MovementOfObject, 'constant')
dev_display (MeasureROI1AtNewPosition)
dev_display (MeasureROI2AtNewPosition)
affine_trans_pixel (MovementOfObject, DistRect1CenterRow, DistRect1CenterCol, Rect1RowCheck, Rect1ColCheck)
affine_trans_pixel (MovementOfObject, DistRect2CenterRow, DistRect2CenterCol, Rect2RowCheck, Rect2ColCheck)
if (USING_TRANSLATE_MEASURE != 0)
* Translate the already created measure objects.平移已经创建的测量对象。
translate_measure (MeasureHandle1, Rect1RowCheck, Rect1ColCheck)
translate_measure (MeasureHandle2, Rect2RowCheck, Rect2ColCheck)
measure_pairs (SearchImage, MeasureHandle1, 2, 25, 'negative', 'all', RowEdge11, ColEdge11, Amp11, RowEdge21, ColEdge21, Amp21, Width1, Distance1)
measure_pairs (SearchImage, MeasureHandle2, 2, 25, 'negative', 'all', RowEdge12, ColEdge12, Amp12, RowEdge22, ColEdge22, Amp22, Width2, Distance2)
else
* Create new measure objects and destroy them after the measurement.
* 创建新的测量对象,并在测量完成后销毁它们。
RectPhiCheck := RectPhi + AngleCheck
gen_measure_rectangle2 (Rect1RowCheck, Rect1ColCheck, RectPhiCheck, RectLength1, RectLength2, Width, Height, 'bilinear', MeasureHandle1)
gen_measure_rectangle2 (Rect2RowCheck, Rect2ColCheck, RectPhiCheck, RectLength1, RectLength2, Width, Height, 'bilinear', MeasureHandle2)
*
* Perform the measurement.执行测量操作。
measure_pairs (SearchImage, MeasureHandle1, 2, 25, 'negative', 'all', RowEdge11, ColEdge11, Amp11, RowEdge21, ColEdge21, Amp21, Width1, Distance1)
measure_pairs (SearchImage, MeasureHandle2, 2, 25, 'negative', 'all', RowEdge12, ColEdge12, Amp12, RowEdge22, ColEdge22, Amp22, Width2, Distance2)
endif
*
* 检查是否有过短或缺失的齿。
NumberTeeth1 := |Width1|
NumberTeeth2 := |Width2|
dev_set_color ('red')
if (NumberTeeth1 < 37)
for J := 0 to NumberTeeth1 - 2 by 1
if (Distance1[J] > 4.0)
RowFault := round(0.5 * (RowEdge11[J + 1] + RowEdge21[J]))
ColFault := round(0.5 * (ColEdge11[J + 1] + ColEdge21[J]))
disp_rectangle2 (WindowHandle, RowFault, ColFault, 0, 4, 4)
dev_open_window (0, Width + 20, 80, 80, 'black', WindowHandleZoom)
dev_set_part (RowFault - 10, ColFault - 10, RowFault + 10, ColFault + 10)
dev_display (SearchImage)
disp_rectangle2 (WindowHandleZoom, RowFault, ColFault, 0, 4, 4)
stop ()
dev_close_window ()
dev_set_part (0, 0, Height - 1, Width - 1)
endif
endfor
endif
if (NumberTeeth2 < 37)
for J := 0 to NumberTeeth2 - 2 by 1
if (Distance2[J] > 4.0)
RowFault := round(0.5 * (RowEdge12[J + 1] + RowEdge22[J]))
ColFault := round(0.5 * (ColEdge12[J + 1] + ColEdge22[J]))
disp_rectangle2 (WindowHandle, RowFault, ColFault, 0, 4, 4)
dev_open_window (0, Width + 20, 80, 80, 'black', WindowHandleZoom)
dev_set_part (RowFault - 10, ColFault - 10, RowFault + 10, ColFault + 10)
dev_display (SearchImage)
disp_rectangle2 (WindowHandleZoom, RowFault, ColFault, 0, 4, 4)
stop ()
dev_close_window ()
dev_set_part (0, 0, Height - 1, Width - 1)
endif
endfor
endif
dev_set_color ('yellow')
stop ()
endfor
endif
* ------------------- End of the application -----------------
dev_disp_text ('End of program', 'window', 'bottom', 'right', 'black', [], [])
dev_update_on ()