一、基于相关性的模板匹配例程
打开halcon例程(ctrl+E)—》方法—》模板匹配—》find an objiect despite linear illumination changes using correlation-based matching
相关性原理:首先创建一个模板,把模板里每一个像素当成一个特征,所有像素按列组成一个行向量a,即模板的特征向量。在图像中寻找与模板最匹配的区域b,通过cos=./||||,即两个向量之间的夹角来衡量匹配的好坏,所以该算法不受线性变换的光照影响。
*基于相关性的模板匹配(在线性变换的光照下)
*导入图片
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
list_files ('C:/Users/Administrator/Desktop/halcon/第十二讲、基于相关性的模板匹配', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
*【1】创建模板
read_image (Image, 'cap_exposure_03.png')
gen_circle (ROI_0, 246.5, 331.5, 173.367)
area_center (ROI_0, Area, Row, Column)
reduce_domain (Image, ROI_0, ImageReduced)
create_ncc_model (ImageReduced, 'auto', -0.39, 0.79, 'auto', 'use_polarity', ModelID)
rows:=[]
columns:=[]
dev_set_draw ('margin')
for Index := 0 to |ImageFiles| - 1 by 1
read_image (Image, ImageFiles[Index])
*【2】寻找模板。特别注意第五个参数是匹配的最低值,若匹配值低于该值则表明该图像中没有该模板
find_ncc_model (Image, ModelID, -0.39, 0.78, 0.4, 1, 0.5, 'true', 0, Row1, Column1, Angle, Score)
vector_angle_to_rigid (Row, Column, 0, Row1, Column1, 0, HomMat2D)
rows:=[rows,Row1]
columns:=[columns,Column1]
affine_trans_region (ROI_0, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
dev_display (Image)
dev_display (RegionAffineTrans)
disp_continue_message (WindowHandle, 'black', 'true')
stop()
endfor
biaozhuncha0:=deviation(rows)
biaozhuncha1:=deviation(columns)
clear_ncc_model (ModelID)
选取四张的运行结果如下:
在不改变瓶盖位置,只线性改变光照的情况下,寻找到的模板行列中心的标准差分别为0.0893703,0.043637,可见基于相关性的模板匹配基本不受线性光照的影响。
二、基于相关性的实时人脸跟踪
open_framegrabber ('DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'rgb', -1, 'false', 'default', '[0] Lenovo EasyCamera', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
grab_image_async (Image, AcqHandle, -1)
*创建模板
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
area_center (Rectangle, Area, Row, Column)
orientation_region (Rectangle, Phi)
reduce_domain (Image, Rectangle, ImageReduced)
create_ncc_model (ImageReduced, 'auto', -0.39, 0.79, 'auto', 'use_polarity', ModelID)
dev_set_draw ('margin')
while (true)
* grab_image_async (Image, AcqHandle, -1)
*寻找模板
find_ncc_model (Image, ModelID, -0.39, 0.78, 0.4, 1, 0.5, 'true', 0, Row3, Column3, Angle, Score)
vector_angle_to_rigid (Row, Column, Phi, Row3, Column3, Angle, HomMat2D)
affine_trans_region (Rectangle, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
dev_display (Image)
dev_display (RegionAffineTrans)
endwhile
close_framegrabber (AcqHandle)
随机截取中间几个时刻的运行结果如下: