基于灰度值的模板匹配
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