halcon模板匹配

*使用采集助手读取图像
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'default', 'rings/rings.seq', 'default', -1, 1, FGHandle)
grab_image (ModelImage, FGHandle)
get_image_pointer1 (ModelImage, Pointer, Type, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'white', WindowHandle)
dev_display (ModelImage)
* 设置显示条件
dev_set_color ('red')
dev_set_draw ('margin')
dev_set_line_width (5)
*生成模版的圆形区域并截取模版
gen_circle (ModelROI, 251, 196, 103)
reduce_domain (ModelImage, ModelROI, ImageROI)
*创建基于金字塔层数的模型表示
inspect_shape_model (ImageROI, ShapeModelImage, ShapeModelRegion, 5, 30)
dev_display (ShapeModelRegion)
*创建基于形状的模版
create_shape_model (ImageROI, 'auto', 0, rad(360), 'auto', 'none', 'use_polarity', 30, 10, ModelID)
get_shape_model_contours (ShapeModel, ModelID, 1)
*循环识别目标图像
for i := 1 to 7 by 1
    *读取图像
    grab_image (SearchImage, FGHandle)
    dev_display (SearchImage)
    *匹配模版
    find_shape_model (SearchImage, ModelID, 0, rad(360), 0.6, 0, 0.55, 'least_squares', 0, 0.8, RowCheck, ColumnCheck, AngleCheck, Score)
    *显示匹配结果
    for j := 0 to |Score| - 1 by 1
        vector_angle_to_rigid (0, 0, 0, RowCheck[j], ColumnCheck[j], AngleCheck[j], MovementOfObject)
        affine_trans_contour_xld (ShapeModel, ModelAtNewPosition, MovementOfObject)
        dev_set_color ('blue')
        dev_display (ModelAtNewPosition)
        dev_set_color ('red')
        affine_trans_pixel (MovementOfObject, -120, 0, RowArrowHead, ColumnArrowHead)
        disp_arrow (WindowHandle, RowCheck[j], ColumnCheck[j], RowArrowHead, ColumnArrowHead, 2)
    endfor
endfor
*清除模版和关闭采集助手
clear_shape_model (ModelID)
close_framegrabber (FGHandle)
*关闭程序计数器,变量更新,图像窗口更新
dev_update_off ()

*关闭窗口
dev_close_window ()

*读取模版图像
read_image (Image, 'wafer/wafer_mirror_dies_01')

*创建与图像大小一样的图形窗口
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)

*设置字体属性
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')

*定义输出区域,轮廓的线宽
dev_set_line_width (3)

*显示图像
dev_display (Image)

*在窗口指定位置显示文本的过程
disp_message (WindowHandle, 'Determine the position of mirror dies on the wafer', 'window', 12, 12, 'black', 'true')

*在窗口右下角显示文本
disp_continue_message (WindowHandle, 'black', 'true')

*停止
stop()
* 
*创建一个矩形ROI
gen_rectangle1 (Rectangle, 362, 212, 414, 262)

*剪切ROI区域的图像
reduce_domain (Image, Rectangle, ImageReduced)

*根据金字塔数和对比度获取输入图像的金字塔图像,金字塔区域
inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 4, 30)

*创建形状模版
create_shape_model (ImageReduced, 'auto', rad(0), rad(1), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)

*获取模版的轮廓
get_shape_model_contours (ModelContours, ModelID, 1)

* 
* 开始在搜索图像中搜索模版
for Index := 1 to 4 by 1
    read_image (Image, 'wafer/wafer_mirror_dies_' + Index$'02')

    * 计算当前过去的时间,单位是秒
    count_seconds (S1)
    *在搜索图像中搜索模版
    find_shape_model (Image, ModelID, rad(0), rad(1), 0.5, 0, 0.0, 'least_squares', 2, 0.5, Row, Column, Angle, Score)
    * 计算当前过去的时间,单位是秒
    count_seconds (S2)
    Runtime := (S2 - S1) * 1000

    * 生成十字对象
    gen_cross_contour_xld (Cross, Row, Column, 6, rad(45))

    *显示找到的模版轮廓
    dev_display_shape_matching_results (ModelID, 'lime green', Row, Column, Angle, 1, 1, 0)
    
    *设置输出对象的颜色
    dev_set_color ('orange')
    
    *显示图像
    dev_display (Image)
    *显示十字
    dev_display (Cross)

    stop ()
    dump_window_image (Image, WindowHandle)
endfor
get_system ('border_shape_models', mode)
* Clear the model
clear_shape_model (ModelID)

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

*创建模板,角度从0到360
create_ncc_model (ImageReduced, 'auto', rad(0), rad(360), 'auto', 'use_polarity', ModelID)

*查找模板,角度从0到360
     find_ncc_model (Image, ModelID, rad(0), rad(360), 0.5, 1, 0.5, 'true', 0, Row, Column, Angle, Score)
     vector_angle_to_rigid(Row, Column, 0, Row, Column, Angle, HomMat2D)
     affine_trans_region(Circle, RegionAffineTrans, HomMat2D, 'nearest_neighbor')

* This example program shows how to use HALCON's correlation-based
* matching. In particular it demonstrates the robustness of this method against
* linear illumination changes.  The training is performed in an image with good
* illumination.  The matching is applied in images where the exposure time varies
* extremely from very short to very long.
read_image (Image, 'cap_exposure/cap_exposure_03')
dev_close_window ()
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_update_off ()
gen_circle (Circle, 246, 336, 150)
area_center (Circle, Area, RowRef, ColumnRef)
reduce_domain (Image, Circle, ImageReduced)
create_ncc_model (ImageReduced, 'auto', 0, 0, 'auto', 'use_polarity', ModelID)
dev_set_draw ('margin')
dev_display (Image)
dev_set_color ('yellow')
dev_display (Circle)
disp_message (WindowHandle, 'Trained NCC model', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
Rows := []
Cols := []
for J := 1 to 10 by 1
    read_image (Image, 'cap_exposure/cap_exposure_' + J$'02')
    find_ncc_model (Image, ModelID, 0, 0, 0.5, 1, 0.5, 'true', 0, Row, Column, Angle, Score)
    Rows := [Rows,Row]
    Cols := [Cols,Column]
    dev_display (Image)
    dev_display_ncc_matching_results (ModelID, 'green', Row, Column, Angle, 0)
    disp_message (WindowHandle, 'Found NCC model', 'window', 12, 12, 'black', 'true')
    if (J < 10)
        disp_continue_message (WindowHandle, 'black', 'true')
    endif
    stop ()
endfor
* Compute the standard deviation of the found positions.  If the individual
* positions in Rows and Cols are examined, it can be seen that the standard
* deviation is caused mainly by the last four images, which are severely
* overexposed.
StdDevRows := deviation(Rows)
StdDevCols := deviation(Cols)
clear_ncc_model (ModelID)

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

操作符create_ncc_model准备一个模板,该模板在图像template中传递,作为用于使用归一化互相关(ncc)进行匹配的ncc模型。模型的ROI作为Template的域传递。

该模型是使用在每个级别上进行多次旋转的多个图像金字塔级别生成的,并存储在存储器中。输出参数ModelID是此模型的句柄,用于随后对find_ncc_model的调用。

金字塔级别的数量由参数NumLevels确定。它应该选择尽可能大的,因为这样可以显著减少找到对象所需的时间。另一方面,必须选择NumLevels,以使模型仍然可识别,并在最高金字塔级别上包含足够数量的点(至少八个)。这可以使用gen_gauss_pyramid的输出图像的域进行检查。如果没有生成足够的模型点,则在内部减少棱锥层级的数量,直到在最高棱锥层级上找到足够多的模型点。如果此过程将导致没有金字塔级别的模型,即,如果最低金字塔级别上的模型点数已经太少,create_ncc_model将返回一条错误消息。如果NumLevels设置为“auto”或0,create_ncc_model将自动确定棱锥体级别的数量。可以使用get_ncc_model_params查询自动计算的棱锥级数。在极少数情况下,可能会发生create_ncc_model为金字塔级别的数量确定的值太大或太小的情况。如果金字塔级别的数量选择得太大,则可能无法在图像中识别该模型,或者可能需要为find_ncc_model中的MinScore选择非常低的参数来找到该模型。如果金字塔级别的数量选择得太少,则在find_ncc_model中查找模型所需的时间可能会增加。在这些情况下,应通过检查gen_gauss_pyramid的输出来选择金字塔级别的数量。此处,应使用Mode=“constant”和Scale=0.5。

参数AngleStart和AngleExtent决定了模型可能出现在图像中的旋转范围。请注意,该模型只能通过find_ncc_model在此角度范围内找到。参数AngleStep确定选定角度范围内的步长。因此,如果在find_ncc_model中未指定子像素精度,则此参数指定find_ncc_model中的角度可实现的精度。应根据对象的大小选择AngleStep。较小的模型在图像中不具有许多不同的离散旋转,因此对于较小的模型,应选择较大的AngleStep如果AngleExtent不是AngleStep的整数倍,则会相应地修改AngleStep。为了确保可能旋转范围的采样独立于给定的AngleStart,可能旋转范围修改如下:如果没有正整数值n,使得AngleStart加上n次AngleStep正好为0.0,则AngleStart最多减少AngleStep,AngleExtent最多增加AngleStep。

该模型是为选定的角度范围预先生成的,并存储在存储器中。存储模型所需的内存与角度步长的数量和模型中的点的数量成比例。因此,如果AngleStep太小或AngleExtent太大,则可能会发生模型不再适合(虚拟)内存的情况。在这种情况下,必须放大AngleStep或缩小AngleExtent。在任何情况下,都希望模型完全适合主内存,因为这避免了操作系统的分页,因此找到对象的时间会小得多。由于可以通过find_ncc_model以亚像素分辨率来确定角度,因此可以为直径小于约200像素的模型选择AngleStep>=1。如果选择AngleStep=“auto”或0,create_ncc_model会根据模型的大小自动确定合适的角度步长。可以使用get_ncc_model_params查询自动计算的角度步长。

参数Metric确定在图像中识别模型的条件。如果Metric=“use_polarity”,则图像中的对象和模型必须具有相同的对比度。例如,如果模型是黑暗背景上的明亮对象,则只有当该对象也比背景亮时,才能找到该对象。如果Metric=“ignore_global_polarity”,则如果对比度全局反转,也会在图像中找到对象。在上面的例子中,如果物体比背景暗,也会发现物体。在这种情况下,find_ncc_model的运行时间将略有增加。

模型图像Template的域(区域)的重心被用作模型的原点(参考点)。可以使用set_ncc_model_origin设置不同的原点。

find_ncc_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels : Row, Column, Angle, Score)

如果模型表现出对称性,则可能会在图像中发现多个位置相似但旋转不同的实例。参数MaxOverlap决定了两个实例最多可以重叠的分数(即0和1之间的数字),以便将它们视为不同的实例,从而分别返回。如果两个实例彼此重叠超过MaxOverlap,则只返回最佳实例。重叠的计算基于找到的实例的任意方向的最小封闭矩形(请参见smallest_rectangle2)。如果MaxOverlap=0,则找到的实例可能根本不重叠,而对于MaxOverlap=1,则返回所有实例。

如果在MaxOverlap中传递单个值,则无论模型类型如何,都会为不同模型的所有找到的实例计算重叠,即消除重叠过多的相同或不同模型的实例。另一方面,如果在MaxOverlap中传递多个值,则仅为找到的具有相同模型类型的模型实例计算重叠,即,仅消除重叠过多的相同模型实例。在这种模式下,不同类型的模型可能完全重叠。

read_image(Image, 'C:/Users/10623/Desktop/504003630361042723091902246/UP1/504003630361042723091902246_UP1_1.jpg')
gen_circle (Circle, 448.827, 2294.75, 85.6852)
area_center(Circle, Area, Row, Column)
*裁剪区域
reduce_domain(Image, Circle, ImageReduced)
*创建模板
create_ncc_model(ImageReduced, 'auto', 0, 0, 'auto', 'use_polarity', ModelID)
read_image(Image1, 'C:/Users/10623/Desktop/504003630361042723091902246/UP1/504003630361042723091902246_UP1_26.jpg')
find_ncc_models(Image1, ModelID, 0,0, 0.6, 20,0, 'true', 0, Row2, Column2, Angle1, Score1, Model)
dev_display_ncc_matching_results(ModelID, 'red', Row2, Column2, Angle1, 0)

二、基于灰度

read_image (Image1, 'C:/Users/10623/Desktop/504003630361042723091902246/UP1/504003630361042723091902246_UP1_1.jpg')
gen_circle (ROI_0, 448.891, 2290.93, 88.4566)
reduce_domain(Image1, ROI_0, ImageReduced)
pi:=acos(0.0)*2
create_template_rot(ImageReduced, 4, -pi, 2*pi,pi/45, 'sort', 'original', TemplateID1)
dev_set_draw('margin')
dev_set_color('yellow')
best_match_rot_mg(ImageReduced, TemplateID1, -pi,2*pi, 40, 'true', 4, Row, Column, Angle, Error)
disp_circle(200000, Row, Column,88.4566)

read_image (Image, 'smd/smd_on_chip_05')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_color ('green')
dev_set_draw ('margin')
gen_rectangle1 (Rectangle, 175, 156, 440, 460)
area_center (Rectangle, Area, RowRef, ColumnRef)
reduce_domain (Image, Rectangle, ImageReduced)
create_ncc_model (ImageReduced, 'auto', 0, 0, 'auto', 'use_polarity', ModelID)
dev_display (Image)
dev_display (Rectangle)
disp_continue_message (WindowHandle, 'black', 'true')
for J := 1 to 11 by 1
    read_image (Image, 'smd/smd_on_chip_' + J$'02')
    find_ncc_model (Image, 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 (Rectangle, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
    dev_display (Image)
    dev_display (RegionAffineTrans)
    if (J < 11)
        disp_continue_message (WindowHandle, 'black', 'true')
    endif
    stop ()
endfor
clear_ncc_model (ModelID)

三、基于形状

read_image (Image, 'green-dot')
get_image_size(Image, Width, Height)
threshold(Image, Region,0,128)
connection(Region, ConnectedRegions)
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 5000,20000)
fill_up(SelectedRegions, RegionFillUp)
dilation_circle(RegionFillUp, RegionDilation, 5)
reduce_domain(Image, RegionDilation, ImageReduced)
*创建可缩放的模板,匹配的可能缩放比例在0.8到1.2之间
create_scaled_shape_model(ImageReduced, 5,rad(0),rad(360), 'auto', 0.8, 1.2, 'auto', 'none', 'ignore_color_polarity', 'auto', 'auto', ModelID)
get_shape_model_contours(Model, ModelID, 1)
area_center(RegionFillUp, Area, RowRef, ColumnRef)
*获取仿射变换矩阵
vector_angle_to_rigid(0,0,0, RowRef, ColumnRef, 0, HomMat2D)
*应用仿射变换矩阵
affine_trans_contour_xld(Model, ModelTrans, HomMat2D)
dev_display(Image)
dev_display(ModelTrans)
read_image(ImageSearch, 'green-dots')
dev_display(ImageSearch)
*寻找模板,0表示寻找所有
find_scaled_shape_model(ImageSearch, ModelID, rad(0),rad(360), 0.8, 1.2, 0.5, 0, 0.5, 'least_squares', 5, 0.9, Row, Column, Angle, Scale, Score)
*仿射变换显示
for i:= 0 to |Score| - 1 by 1
    hom_mat2d_identity(HomMat2DIdentity)
    hom_mat2d_translate(HomMat2DIdentity, Row[i],Column[i], HomMat2DTranslate)
    hom_mat2d_rotate(HomMat2DTranslate, Angle[i], Row[i], Column[i], HomMat2DRotate)
    hom_mat2d_scale(HomMat2DRotate, Scale[i], Scale[i], Row[i], Column[i], HomMat2DScale)
    affine_trans_contour_xld(Model, ModelTrans, HomMat2DScale)
    dev_display(ModelTrans)
endfor

多对多:

IndexS := []
INdexE := []
ModelIDs := []
gen_empty_obj(Models)
read_image(Image, 'C:/Users/10623/Desktop/504003630361042723091902246/UP1/504003630361042723091902246_UP1_1.jpg')
gen_circle (ROI_0, 456.792, 2296.71, 92.3204)
*gen_circle (ROI_1, 3505.4, 3403.73, 121.413)
reduce_domain(Image, ROI_0, ImageReduced)
*检查轮廓完整性
inspect_shape_model(ImageReduced, ModelImages, ModelRegions, 1, 30)
create_shape_model(ImageReduced, 5, rad(0), rad(360), 'auto', 'pregeneration', 'use_polarity', 30, 7, ModelID)
get_shape_model_contours(ModelCont, ModelID, 1)
count_obj(ModelCont, NumModel)
count_obj(Models, NumModels)
concat_obj(Models, ModelCont,Models)
IndexS := [IndexS,NumModels + 1]
IndecE := [INdexE,NumModels + NumModel]
ModelIDs := [ModelIDs,ModelID]
find_shape_models(Image, ModelIDs, rad(0), rad(360), 0.5, 0, 0.5, 'least_squares', 0, 0.6, Row, Column, Angle, Score, Model)
if(|Score| > 1)
    for j:= 0 to |Score| - 1 by 1
        copy_obj(Models, ModelSelected, IndexS[Model[j]], IndecE[Model[j]] - IndexS[Model[j]] + 1)
        vector_angle_to_rigid(0, 0, 0, Row[j], Column[j], Angle[j], HomMat2D)
        affine_trans_contour_xld(ModelSelected, ModelTrans, HomMat2D)
        if(Model[j] == 0)
            dev_set_color('blue')
        else
            dev_set_color('red')
        endif
        dev_display(Image)
        dev_display(ModelTrans)
    endfor
endif
*读取图像
read_image (Image, 'green-dot')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_set_color ('red')
dev_set_line_width (5)
dev_display (Image)
*提取模板
threshold (Image, Region, 0, 128)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10000, 20000)
fill_up (SelectedRegions, RegionFillUp)
dilation_circle (RegionFillUp, RegionDilation, 5.5)
reduce_domain (Image, RegionDilation, ImageReduced)
*创建模版
create_scaled_shape_model (ImageReduced, 5, rad(-45), rad(90), 'auto', 0.8, 1.0, 'auto', 'none', 'ignore_global_polarity', 40, 10, ModelID)
*提取模版轮廓
get_shape_model_contours (Model, ModelID, 1)
*显示模板轮廓到模版位置
area_center (RegionFillUp, Area, RowRef, ColumnRef)
vector_angle_to_rigid (0, 0, 0, RowRef, ColumnRef, 0, HomMat2D)
affine_trans_contour_xld (Model, ModelTrans, HomMat2D)
dev_display (Image)
dev_display (ModelTrans)
*读取目标图片
read_image (ImageSearch, 'green-dots')
dev_display (ImageSearch)
*匹配模版
find_scaled_shape_model (ImageSearch, ModelID, rad(-45), rad(90), 0.8, 1.0, 0.5, 0, 0.5, 'least_squares', 5, 0.8, Row, Column, Angle, Scale, Score)
*循环显示匹配出来的模版区域轮廓
for I := 0 to |Score| - 1 by 1
    hom_mat2d_identity (HomMat2DIdentity)
    hom_mat2d_translate (HomMat2DIdentity, Row[I], Column[I], HomMat2DTranslate)
    hom_mat2d_rotate (HomMat2DTranslate, Angle[I], Row[I], Column[I], HomMat2DRotate)
    hom_mat2d_scale (HomMat2DRotate, Scale[I], Scale[I], Row[I], Column[I], HomMat2DScale)
    affine_trans_contour_xld (Model, ModelTrans, HomMat2DScale)
    dev_display (ModelTrans)
endfor
*清除模版
clear_shape_model (ModelID)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值