Halcon基于相关性的模板匹配create_ncc_model

Halcon基于相关性的模板匹配

基于相关性的模板匹配也是一种基于灰度特征的匹配方法。该方法使用一种基于行向量的归一化互相关匹配法,在检测图像中匹配模板图像。与基于灰度值的匹配相比,该方法速度快得多,并且能够适应线性光照变化。与基于形状的模板匹配相比,该方法能适用于有大量纹理的模板,支持有轻微形变的搜索,能弥补形状模板在某些方面的不足。
使用基于相关性的匹配有如下步骤。
(1)从参考图像上选择检测的目标。使用矩形选区等方式,从参考图像上选择一块ROI,然后使用reduce_domain 算子将该区域裁剪成一个独立的图像区域。
(2)创建模板。用上一步裁剪后的图像创建一个归一化的互相关模型,使用的是create_ncc model 算子。该算子的原型如下:

create_ncc_model(Template : : NumLevels, AngleStart, AngleExtent, Anglestep, Metric : ModelID)

参数 Template 是输入的包括了ROI的图像。参数NumLevels 是金字塔的层数,默认可以设为auto,程序将自动确定合适的金字塔层级数,该层级数可以通过 get_ncc_model_params 算子进行查看。AngleStart和AngleExtent 两个参数确定了模板图像可能出现在检测图像上的旋转角度范围,在这个范围内的旋转才有可被搜素到。参数 AngleStep 为角度旋转变化的步长。模型的角度变化是在检测前进行预处理,并将旋转信息保存在内存中的。因此,旋转的角度大小和模型的点的数量决定了所需内存的大小。也可以设置AngleStep为auto或0,则程序会自动确定合适的旋转角度的步长。旋转的中心点是模板图像的重心。
表示在检测图像中识别模板的条件,或者说是“度量”。该参数在其他几种匹配算子中也经常用到。这里有两个可选择的值:use_polarity 和ignore_global_polarity。如果选择use_polarity,那么检测图像中的目标对象必须和模板中的目标对象具有相同的对比度“方向”。例如,模板中是一个暗背景上有一个亮的目标,那么在检索时,只有符合匹配条件并且亮度比背景亮的目标才能被检测出来。如果选择ignore_global_polarity,那么该亮度变化可以忽略,还是上面的例子,即使是前景与背景的对比度“方向”相反,即该目标比背景还暗,也能检测出来。
参数ModelID是模板的句柄,供匹配算子find_ncc_model调用。在该算子中,有一个参数MinSore用于指定匹配分数的最小值,即低于这个匹配分数的匹配结果就不需要返回了。由于匹配分数是从归一化的互相关系数中来的,为了提升匹配速度,这个分数的阈值应该尽可能设置得高一点,但是也要防止设得过高导致匹配失败。
匹配结束后,使用clear_ncc_model算子释放模板。其代码如下:

*读取参考的原始图像。如果是彩色的,需要先转化为单通道灰度图像
read_image (Image, 'data/carmex-0')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
*设置窗口绘制参数,线宽设为3
dev_set_line_width(3)
dev_set_draw ('margin')
*创建圆形,因为目标区域是圆形,因为用圆形将ROI区域选择出来
gen_circle (Circle, 161, 208, 80)
*获取圆形的中心点,为匹配后的可视化显示结果做准备
area_center (Circle, Area, RowRef, ColumnRef)
*裁剪ROI区域,得到模板图像
reduce_domain (Image, Circle, ImageReduced)
*创建基于相关性的匹配模型,输入模板图像和模型参数
create_ncc_model (ImageReduced, 'auto', 0, 0, 'auto', 'use_polarity', ModelID)
*显示原始图像和圆形框
dev_display (Image)
dev_display (Circle)
stop ()
*读取测试图像。该测试图像和参考图像比起来有轻微的位移,旋转,缩放,以及失焦
read_image (Image2, 'data/carmex-1')
*进行行基于相关性的模板匹配
find_ncc_model (Image2, ModelID, 0, 0, 0.5, 1, 0.5, 'true', 0, Row, Column, Angle, Score)
vector_angle_to_rigid (RowRef, ColumnRef, 0, Row, Column, 0, HomMat2D)
*对圆形进行仿射变换,使其将匹配的结果目标标识出来
affine_trans_region (Circle, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
*显示测试画面和圆形标记圈
dev_display (Image2)
dev_display (RegionAffineTrans)
*匹配结束,释放模板资源
clear_ncc_model (ModelID)