halcon第十二讲:基于相关性的模板匹配

一、基于相关性的模板匹配例程

打开halcon例程(ctrl+E)—》方法—》模板匹配—》find an objiect despite linear illumination changes using correlation-based matching

相关性原理:首先创建一个模板,把模板里每一个像素当成一个特征,所有像素按列组成一个行向量a,即模板的特征向量。在图像中寻找与模板最匹配的区域b,通过cos\theta=\vec{a}.\vec{b}/|\vec{a}||\vec{b}|,即两个向量之间的夹角来衡量匹配的好坏,所以该算法不受线性变换的光照影响。

*基于相关性的模板匹配(在线性变换的光照下)
*导入图片
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)


 

随机截取中间几个时刻的运行结果如下:

 

猜你喜欢

转载自blog.csdn.net/qq_24946843/article/details/82117655