步入Halcon新手村--3模板图形匹配学习笔记

基于灰度值的模板匹配

1、首先先使用create_ncc_model()算子创建ncc模板

2、使用find_ncc_model()算子进行查找匹配

1、create_ncc_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Metric : ModelID)
Template:需输入需要创建的模板图像
NumLevels:金字塔层数,默认设置为“Auto"
AngleStart, AngleExtent:开始角度和角度范围,确定了模板图像可能出现在检测图像上的旋转角度范围
AngleStep:旋转角度的步长
Metric:是否考虑极性
ModelID:生成模板ID,供find_ncc_model算子调用

2、find_ncc_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, , NumLevels : Row, Column, Angle, Score)
Image:输入的图像
ModelID:模板ID
AngleStart, AngleExtent:搜索角度和角度范围
MinScore:最小匹配度
NumMatches:匹配的个数
MaxOverlap:重合度
SubPixel:是否为亚像素级别
NumLevels:金字塔的层数
Row, Column, Angle, Score:输出的匹配中心点坐标、角度、匹配度得分
Demo:
read_image (Image, 'smd/smd_on_chip_05')
dev_set_color ('green')
dev_set_draw ('margin')
*设置一个矩形ROI
gen_rectangle1 (Region, 184.42, 155.159, 440.975, 459.412)
*获取ROI的中心坐标和面积
area_center (Region, Area, Row, Column)
*获取ROI的角度
orientation_region (Region, Phi)
*将ROI所在的区域重图像中抠出
reduce_domain (Image, Region, ImageReduced)
*创建ncc匹配模板
create_ncc_model (ImageReduced, 'auto', -0.39, 0.79, 'auto', 'use_polarity', ModelID)


*进行读图匹配流程
for Index := 1 to 11 by 1
    read_image (Image1, 'smd/smd_on_chip_' + Index$'02')
    *查找匹配输入的Image1
    find_ncc_model (Image1, ModelID, -0.39, 0.79, 0.5, 1, 0.5, 'true', 0, Row1, Column1, Angle, Score)
    *创建一个带角度平移操作的仿射变换矩阵
    vector_angle_to_rigid (Row, Column, 0, Row1, Column1, Angle, HomMat2D)
    *对ROI区域进行仿射变换
    affine_trans_region (Region, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
    dev_display (Image1)
    dev_display (RegionAffineTrans)
endfor

基于形状的模板匹配

1、基于官方示例的学习:

​ 1.1、创建金字塔模型

​ 1.2、选择金字塔模型

​ 1.3、创建一个空的模板

​ 1.4、使用金字塔选择的模型进行训练模板

​ 1.5、设置匹配参数

​ 1.6、查找模板

​ 1.7、显示图像

1、inspect_shape_model(Image : ModelImages, ModelRegions : NumLevels, Contrast : )
	创建金字塔模型
	Image:输入图像
	ModelImages:输出的金字塔图像集合
	ModelRegions:输出的金字塔区域集合
	NumLevels:金字塔的层数
	Contrast:每次减少的阈值

2、select_obj(Objects : ObjectSelected : Index : )
	选择对应层级的模型
	Objects:输入的对象数组
	ObjectSelected:选择的对象
	Index:下标
	
3、create_generic_shape_model( : : : ModelID)
	创建一个空的模型句柄
	
4、train_generic_shape_model(Template : : ModelID : )
	使用金字塔选择的模型进行训练模板
	Template:输入的结构图像
	ModelID:输入的句柄

5、set_generic_shape_model_param( : : ModelID, GenParamName, GenParamValue : )
	设置匹配参数
	ModelID:输入的模型句柄
	GenParamName:参数的名称,默认为min_score
	GenParamValue:参数的值
	
6、find_generic_shape_model(SearchImage : : ModelID : MatchResultID, NumMatchResult)
	查找模板
	SearchImage:需要搜索的图像
	ModelID:模板句柄
	MatchResultID:输出的结果的句柄
	NumMatchResult:输出的找到的个数

7、get_generic_shape_model_result_object( : Objects : MatchResultID, MatchSelector, GenParamName : )
	显示图像
	Objects:输出找到的图像
	MatchResultID:输入找到的结果句柄
	MatchSelector:显示最佳匹配结果还是全部匹配结果,默认值为all
	GenParamName:显示轮廓还是区域
Demo1来自官方示例:create_roi_via_vision.hdev:
* ------------------------------------------------------------------------------------------------
* 本示例程序通过图像处理创建模型 ROI。
* 先使用二值化、连通域、区域填充、区域选择、图像剪切、再次二值化、连通域把Roi区域筛选出来当作模板准备使用
* 用圆形结构元素放所选择的区域。
* dilation_circle (CharacterRegion, ROI, 1.5)
* 涉及到一个新的概念:图像金字塔:就是图像从原图特征提取(金字塔第一层)到粗提取压缩的过程
* 金字塔层数选择的越高,图像匹配的越快,精度越低;层数越低,匹配的速度越慢,精度越高。
* 先用查询图像模板inspect_shape_model(Image输入图像 : ModelImages输出模板图像, ModelRegions输出模板区域 : NumLevels输入金字塔层数, Contrast输入对比度阈值 : )
* 先提取图像金字塔的特征情况
*inspect_shape_model (ImageROI, ShapeModelImages, ShapeModelRegions, 5, 25) 
*选择第一层金字塔,并返回一个包含图像、区域的对象,用于后续的模板创作
*select_obj(Objects : ObjectSelected : Index : )
*创建形状模型 
*create_generic_shape_model (ModelID)
*训练通用形状模板,输出模板ID
*train_generic_shape_model (ImageROI, ModelID)
*获取模板图像的 'contours'轮廓  对象
*get_generic_shape_model_object (ShapeModel, ModelID, 'contours')
*设置模板的匹配参数
*set_generic_shape_model_param (ModelID, 'min_score', 0.7)
*查找模板,输入需要匹配的图像和训练的模板ID,返回一个句柄和匹配到的个数
*find_generic_shape_model (SearchImage, ModelID, MatchResultID, NumMatchResult)
*返回一个对象,包含全部all匹配到的区域轮廓contours。
*get_generic_shape_model_result_object (Objects, MatchResultID, 'all', 'contours')

* ------------------------------------------------------------------------------------------------
dev_update_window ('off')
* 图像采集和窗口大小
read_image (ModelImage, 'pendulum/pendulum_00')
get_image_size (ModelImage, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
*设置图像显示的大小
dev_set_part (0, 0, Height - 1, Width - 1)
dev_display (ModelImage)
* colors and other settings for the visualization
dev_set_color ('cyan')
dev_set_draw ('margin')
dev_set_line_width (2)
stop ()
* -------------------  start of the application   开始应用 ----------------
* step 1: extract the bright regions 提取亮区
threshold (ModelImage, BrightRegions, 200, 255)
connection (BrightRegions, ConnectedRegions)
*填充区域的空白,区域个数不变。(更像是将一个大区域内的小区域给填充掉,有点闭操作的意思)
fill_up (ConnectedRegions, FilledRegions)

dev_display (ModelImage)
dev_display (FilledRegions)
stop ()
* step 2: select the region of the card
select_shape (FilledRegions, Card, 'area', 'and', 1800, 1900)

*有点图像裁切的意思:裁切出一个矩形的区域,从左上角到右下角
dev_set_part (round(0.2 * Height), round(0.1 * Width) - 1, round(0.7 * Height) - 1, round(0.6 * Width) - 1)

dev_display (ModelImage)
dev_display (Card)
stop ()
* step 3: use the card as an ROI for the next steps
*区域相交
reduce_domain (ModelImage, Card, ImageCard)
stop ()
* step 4: extract the logo
dev_set_color ('blue')
threshold (ImageCard, DarkRegions, 0, 230)
connection (DarkRegions, ConnectedRegions)
select_shape (ConnectedRegions, Characters, 'area', 'and', 150, 450)

*区域合并
union1 (Characters, CharacterRegion)
dev_display (ModelImage)
dev_display (CharacterRegion)
stop ()
* step 5: enlarge the region slightly

*膨胀Dilation圆形属性半径1.5
dilation_circle (CharacterRegion, ROI, 1.5)
dev_display (ModelImage)
dev_display (ROI)
stop ()
* step 6: creating the mode 创建模板--------------------------------------------
dev_set_part (0, 0, Height - 1, Width - 1)
dev_display (ModelImage)
reduce_domain (ModelImage, ROI, ImageROI)

*选择区域进行模板创建,层数为4阈值为25,输出一个金字塔图像和金字塔
inspect_shape_model (ImageROI, ShapeModelImages, ShapeModelRegions, 5, 25) 
*选择金字塔第一层的Region,会返回一个对象,包含金字塔图像和区域,可以利用这个对象创建模板
select_obj (ShapeModelImages, ShapeModelImage, 1)
*显示第一层模板
dev_display (ShapeModelImage)

*创建形状模型 
create_generic_shape_model (ModelID)
*训练通用形状模板
train_generic_shape_model (ShapeModelImage, ModelID)
stop ()
* step 7: searching the logo 设置通用形状模型参数 
set_generic_shape_model_param (ModelID, 'min_score', 0.7)
*开始执行查找图像模板
for i := 1 to 20 by 1
    read_image (SearchImage, 'pendulum/pendulum_' + i$'02')
    *查找模板的参数
    find_generic_shape_model (SearchImage, ModelID, MatchResultID, NumMatchResult)
    if (NumMatchResult > 0)
        get_generic_shape_model_result_object (Objects, MatchResultID, 'all', 'contours')
        dev_display (SearchImage)
        dev_display (Objects)
    endif
endfor
stop ()
Demo2:来自官方示例 fing_generic_shape_model_workflow.hdev* 
* **************************************************
* This example program shows the workflow of       *
* HALCON's shape-based matching based on the       *
* generic shape model interface.                   *
* The workflow is as follows:                      *
* 1. Creation of the shape model (offline step)    *
* 2. Training of the shape model based on          *
*    an image (offline step)                       *
* 3. Find objects (online step)  
*1、先创建一个形状模板                              *
*2、对这个模板进行训练                              *
*3、找进行查找                                      *
* **************************************************
* 
* 初始化.
dev_update_window ('off')
dev_close_window ()
*读取图像
read_image (ReferenceImage, 'board/board_01')
* 设置显示颜色为黄色、填充为边框
dev_set_color ('yellow')
dev_set_draw ('margin')
*获取图像的尺寸
get_image_size (ReferenceImage, Width, Height)
*创建一个窗口
dev_open_window (0, 0, Width / 2, Height / 2, 'black', WindowHandle)
*设置显示字体的格式
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
* 
* **************************************************
* 1. Creation of the shape model (offline step) 创建一个形状的空模板   *
* **************************************************
* 
create_generic_shape_model (ModelID)
* 
* **************************************************
* 2. Training of the shape model (offline step)  对模板进行训练  *
* **************************************************
* 
* Define ROI 使用矩形将区域框出.
gen_rectangle1 (ROI, 450, 470, 580, 755)
dev_display (ReferenceImage)
dev_display (ROI)
Text := '定义一个用于创建模型的ROI '
dev_disp_text (Text, 'window', 12, 12, 'black', [], [])
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
dev_set_color ('green')
* 选择你想要的模板并抠出.
reduce_domain (ReferenceImage, ROI, TrainingImage)
stop ()
* 
* 训练这个模板.
train_generic_shape_model (TrainingImage, ModelID)
* 
* **************************************************
* 3. 设置模板搜索参数                    *
* **************************************************
* 
* Set search parameters.
*搜索条件:个数为1、匹配度为0.6以上
set_generic_shape_model_param (ModelID, 'num_matches', 1)
set_generic_shape_model_param (ModelID, 'min_score', 0.6)
* 搜索准备
for i := 1 to 9 by 1
    read_image (SearchImage, 'board/board_' + i$'02')
    find_generic_shape_model (SearchImage, ModelID, MatchResultID, NumMatchResult)
    * 获取图标匹配结果.
    get_generic_shape_model_result_object (Objects, MatchResultID, 'all', 'contours')
    * Visualization可视化.
    dev_display (SearchImage)
    dev_display (Objects)
    Text := '找到的模板'
    dev_disp_text (Text, 'window', 12, 12, 'black', [], [])
    wait_seconds (1)
endfor
disp_end_of_program_message (WindowHandle, 'black', 'true')

2、基于教材示例的学习

1、使用图像创建形状匹配模型,可以用creat_shape_model算子

2、获取形状模板的轮廓,可以用get_shape_contours算子

3、寻找单个形状模板最佳匹配,可以使用find_shape_model算子

1、create_shape_model(Template: : NumLevels,AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast: ModellD)
	Template:输入的模板图像
	NumLevels:金字塔层数,默认为auto
	AngleStart, AngleExtent:开始的角度以及角度的范围
	AngleStep:角度的步长
	Optimization:优化选项,是否减少模板点数,用于生成模型的优化类型和可选方法。默认为auto
	Metric:是否考虑极性、颜色等
	Contrast:对比度
	MinContrast:最小对比度
	ModellD:模板ID

2、get_shape_model_contours( : ModelContours : ModelID, Level : )
	ModelContours:得到的轮廓XLD
	ModelID:输入的模板ID
	Level:对应金字塔的层数
	
3、find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)
	Image:输入图像
	ModelID:输入的模板ID
    AngleStart, AngleExtent:开始角度、角度范围
    MinScore:最小匹配度
    NumMatches:匹配的个数
    MaxOverlap:最大图像重合度
    SubPixel:是否为亚像素精度
	NumLevels:金字塔层数
	Greediness:搜索的贪婪度:为0时,安全精准但是速度慢,为1时速度快但是不精准。默认值为0.9
	Row, Column, Angle, Score:输出找到模板的中心坐标、角度和得分
Demo:
* 初始化显示.
dev_set_color ('green')
dev_set_draw ('margin')
*读取图像
read_image (Image, 'board/board_01')
*创建一个矩形的ROI,为做模板铺垫
gen_rectangle1 (Region, 429.522, 466.692, 598.198, 772.749)
*将图像抠出,准备创建模板
reduce_domain (Image, Region, ImageReduced)
*获取模板图像的中心坐标
area_center (Region, Area, Row, Column)
*获取模板图像的弧度
orientation_region (Region, Phi)
*创建模板
create_shape_model (ImageReduced, 'auto', -3.14, 6.29, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
*获取模板轮廓
get_shape_model_contours (ModelContours, ModelID, 1)
for Index := 1 to 9 by 1
    *读取图像
     read_image (SearchImage, 'board/board_' + Index$'02')
     *搜索模板
     find_shape_model (SearchImage, ModelID, -3.14, 6.29, 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row1, Column1, Angle, Score)
     *创建一个平移、旋转的矩阵
     vector_angle_to_rigid (Row, Column, Phi, Row1, Column1, Angle, HomMat2D)
     *对找到的区域进行仿射变化用来显示边框
     affine_trans_region (Region, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
endfor

在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值