Halcon基于组件的模板匹配create_trained_component_model

Halcon基于组件的模板匹配

基于组件的模板匹配可以包含多个ROI,每个区域对应一个组件,并且组件之间还可以发生相
对位置关系变化。因此,该方法的难点就在于确定组件之间的相对位置关系。其步骤如下。
(1)提取组件的ROI。读取图像,提取组件。提取组件有两种方式,一种是使用gen_rentanglel等算子,在图像中手动确定要检测的组件;另一种是使用gen_initial_components 算子自动提取组件。自动提取时要注意设置参数,防止将噪声等非关键部分也识别为组件,否则会对后面的匹配造成干扰。
(2)训练组件之间的相对关系。如果组件位置已知,而相互之间的位置关系未知,可以使用多张图片构成一个训练样本集,并使用train_model_components算子对这些样本进行训练,以得到组件模型,还可以使用get_training_components算子查看训练结果。
(3)创建基于组件的匹配模板。如果组件之间的关系都已知,可以使用create_component_model 算子创建模板:如果创建组件在训练过程之后,则可以使用create_trained_component_model算子创建模板。
(4)寻找组件并确定相对位置关系。匹配的过程通常是使用find_component_model算子来搜索目标中的多个组件。匹配算法使用的是类似于树型的结构,因此find_component_model 算子中应指明树的根节点RootComponent,然后由根节点开始搜索其他的关联节点。
(5)清除模型。匹配结束后,使用clear_component_model 算子将模板清除,并释放内存资源。其代码如下:

dev_close_window ()
*读取参考图像,这里读取的是单通道灰度图像
read_image (ModelImage, 'data/bolts-0') 
*设置显示图像、绘制线条等窗口参数
dev_open_window_fit_image (ModelImage, 0, 0, -1, -1, WindowHandle)
dev_display (ModelImage)
dev_set_draw ('margin')
dev_set_line_width(3)
stop ()
*定义各个组件, 选取各个组件的ROI区域
gen_rectangle1 (Rectangle1, 140, 71, 279, 168)
gen_rectangle1 (Rectangle2, 181, 281,285, 430)
gen_circle (Circle, 106, 256, 60)
*将所有组件放进一个名为ComponentRegions的Tuple中
concat_obj (Rectangle1, Rectangle2, ComponentRegions)
concat_obj (ComponentRegions, Circle, ComponentRegions)
*显示参考图像,以及选择的各个组件区域。核对区域选择是否理想
dev_display (ModelImage)
dev_display (ComponentRegions)
stop ()
*创建基于组件的模板,返回模板句柄ComponentModelID
create_component_model (ModelImage, ComponentRegions, 20, 20, rad(25), 0, rad(360), 15, 40, 15, 10, 0.8, 3, 0, 'none', 'use_polarity', 'true', ComponentModelID, RootRanking)
*读取测试图像,该测试图像相对于参考图像有一定的位移和旋转。
read_image (SearchImage, 'data/bolts-1')
*在参考图像模板的基础上,进行基于基于组件的匹配
find_component_model (SearchImage, ComponentModelID, RootRanking, 0, rad(360), 0.5, 0, 0.5, 'stop_search', 'search_from_best', 'none', 0.8, 'interpolation', 0, 0.8, ModelStart, ModelEnd, Score, RowComp, ColumnComp, AngleComp, ScoreComp, ModelComp)
*显示测试图像
dev_display (SearchImage)
*对每一个检测到的组件实例进行可视化的显示
for Match := 0 to |ModelStart| - 1 by 1
	dev_set_line_width (4)
	*获得每个组件的实例和位移旋转等参数
	get_found_component_model (FoundComponents, ComponentModelID, ModelStart, ModelEnd, RowComp, ColumnComp, AngleComp, ScoreComp, ModelComp, Match, 'false', RowCompInst, ColumnCompInst, AngleCompInst, ScoreCompInst)
	dev_display (FoundComponents)
endfor
stop ()
*匹配结束,释放模板资源
clear_component_model (ComponentModelID)