【Halcon学习笔记】07.图像匹配
1.概述
图像匹配是通过对影像内容、特征、结构、关系、纹理及灰度等对应关系进行相似性和一致性的分析,寻求相似影像目标的方法。匹配过程通常先确定目标,在某张样图中选取目标作为模板,然后在待匹配的图像中分析是否有模板相似区,如果有则进一步确定位姿,因此也被称作模板匹配。
图像匹配方法包括:基于形状特征的匹配(包括一般形状匹配、比例缩放匹配、局部形变匹配、透视形变匹配)、基于组件的匹配、基于描述符的匹配、基于灰度值的匹配、基于灰度值相关性的匹配。
本节介绍常用的两种匹配方法——基于相关性的匹配和基于形状特征的匹配。

2.相关概念
2.1 图像金字塔
图像金字塔是由一幅图像的多个不同分辨率的子图构成的图像集合。是通过一个图像不断的降低采样率产生的,最小的图像可能仅仅有一个像素点。下图是一个图像金子塔的示例。从图中可以看到,图像金字塔是一系列以金字塔形状排列的、自底向上分辨率逐渐降低的图像集合。


3.基于灰度值相关性的匹配(灰度匹配)
3.1 概述
直接对原图像和模板图像进行操作,通过区域属性的比较来反映它们之间的相似性。时间复杂度高,对图像尺寸敏感。基于灰度相关的算法,具有不受比例因子误差影响和抗白噪声干扰能力强等优点;通过比较参考图像和输入图像在各个位置的相关系数,相关值最大的点就是最佳匹配位置。
适用于失焦图像、轻微变形、线性光照变换及轮廓模糊的场景;不适用于杂乱、遮挡、非线性光照变换、尺寸缩放的场景。
3.2 算子
3.2.1 创建
create_ncc_model()
Template:模板图像
NumLevels:金子塔层数
AngleStart:旋转开始角度
AngleExtent:旋转角度范围
AngleStep:旋转角度步长
Metric:物体极性
ModelID: 生成的模板ID
3.2.2 匹配
find_ncc_model()
Image:单通道图像,它的区域可被创建为模板
ModelID:模板句柄
AngleStart:模板的旋转开始角度
AngleExtent:模板旋转角度范围
MinScore:被找到的模板最小分数
NumMatches:被找到的模板个数
MaxOverlap:被找到的模板实例最大重叠部分
SubPixel:亚像素级别标志,true,false
NumLevels:金字塔层级数
Row:被找到的模板实例行坐标
Column:被找到的模板实例列坐标
Angle:被找到的模板实例的旋转角度
Score:被找到的模板实例的分数
3.2.3 释放
clear_ncc_model (ModelID)
ModelID:模板句柄
4.基于形状特征的匹配(形状匹配)
4.1 概述
基于形状的模板匹配,也称为基于边缘方向梯度的匹配。该算法以物体边缘的梯度相关性作为匹配标准,原理是提取ROI中的边缘特征,结合灰度信息创建模板,并根据模板大小和清晰度的要求生成多层的图像金字塔模型,再在图像金字塔层中自上而下逐层搜索模板图像,直到搜索到最底层或得到确定的匹配结果为止。
适用于目标轮廓较清晰的场景;不适用于纹理复杂的场景。
4.2 算子
4.2.1 创建(带缩放的)
create_scaled_shape_model()
Template:模板图像(ImageReduced)
NumLevels:金字塔的层数(auto)
AngleStart:模板旋转的起始角度(rad(-20))
AngleExtent:模板旋转角度范围(rad(40))
AngleStep:旋转角度的步长(auto)
ScaleMin:缩放的最小尺度(0.9)
ScaleMax:缩放的最大尺度(1.1)
ScaleStep:缩放的步长(auto)
Optimization:模板优化的方法(none)
Metric:匹配模板的条件(use_polarity:图像中的目标必须和模型具有一样的对比度)
Contrast:对比度([灰度低阈值,灰度高阈值,最小长度])([20,40,50])
MinContras:设置最小对比度,灰度的波动范围(5)
ModelID:输出模板句柄(ModelID)
4.2.2 匹配 (带缩放的)
find_scaled_shape_model
ModelID:输入模板句柄(ModelID)
AngleStart:模板旋转的起始角度(rad(-20))
AngleExtent:模板旋转角度范围(rad(40))
ScaleMin:缩放的最小尺度(0.9)
ScaleMax:缩放的最大尺度(1.1)
MinScore:最小分数(0.3)
NumMatches:匹配个数(1)
MaxOverlap:最大重叠数,多个相似时(0.5)
SubPixel:亚像素精度(least_squares:能确保运行时间和精度的权衡)
NumLevels:金字塔的层数(0:使用创建模板时金字塔的层数)
Greediness:贪婪值,用于控制定位加速,越大越慢(0.8)
4.2.3 释放
clear_shape_model (ModelID)
ModelID:模板句柄
4.2.4 显示
dev_display_shape_matching_results()
ModelD:匹配模型(ModelID)
Color:显示颜色('red')
Row:对应的y值坐标位置(Row1)
Column:对应的x值坐标位置(Column1)
Angle:对应的角度(Angle1)
ScaleR:水平方向的缩放比例(1)
ScaleC:垂直方向的缩放比例(1)
Model: 模型句柄(0)
5.模板匹配在Halcon中的应用步骤
5.1 从参考图像中选择检测的目标
read_image (Image, teach.bmp)
draw_rectangle2 (3600, Row, Column, Phi, Length, Length)
gen_rectangle2(ROI_0, Row, Column, Phi, Length, Length)
reduce_domain (Image, ROI_0, ImageReduced)

5.2 创建模板
create_scaled_shape_model (ImageReduced, 'auto', rad(-20), rad(40), 'auto', 0.9, 1.1, 'auto', 'none', 'use_polarity', [20,40,50], 5, ModelID)
5.3 匹配模板
read_image (ImageRun, 1.bmp)
find_scaled_shape_model (Image, ModelID, rad(-20), rad(40), 0.9, 1.1, 0.6, 1, 0.5, 'least_squares', 0, 0.8, Row1, Column1, Angle1, Scale1, Score1)

5.4 数据处理
tuple_length (Score1, Length)
if (Length=0)
disp_message (3600, 'NG(产品定位失败)', 'window', 12, 12, 'red', 'true')
stop()
else
gen_rectangle2 (Rectangle1, R, C, Angle1, 250, 200)
endif

by Ryou2-