• Halcon 基于形状的模板匹配


    Halcon中基于形状的模板匹配过程

    Halcon中一个完整的模板匹配过程如下:

    1. 读取并显示图像;
    2. 确定模板ROI及检测ROI;
    3. 创建模型;
    4. 匹配模板;
    5. ROI仿射变换,得到ROI位置。

    举例

    在这里插入图片描述

    如上图所示,每一张图上芯片的位置和角度不固定,需要定位到绿色框内的针脚进行检测,如果以绿色框作为模板ROI,因为图片上有很多针脚,可能会匹配到其他位置,因此,以红色框作为模板ROI,蓝色框作为检测ROI。

    以下是测试效果:
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    可以看到能够准确定位到检测ROI,图片资源是Halcon自带例程的图片,路径为:Halcon安装路径imagesoard,Halcon完整代码如下:

     1 dev_close_window ( )
     2 
     3 list_files ('D:/zxhalcon/images/board', 'files', Files)
     4 tuple_regexp_select (Files, '\.png$', Files)
     5 
     6 read_image (Image, Files[0])
     7 
     8 dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
     9 dev_display (Image)
    10 
    11 dev_set_color ('red')
    12 gen_rectangle1 (Rectangle, 164.5, 126.5, 323, 476.5)
    13 
    14 dev_set_color ('green')
    15 gen_rectangle1 (Rectangle1, 117.5, 138.5, 164.5, 166.5)
    16 
    17 reduce_domain (Image, Rectangle, ImageReduced)
    18 
    19 create_shape_model (ImageReduced, 4, rad(0), rad(360), 'auto', 'auto', 'use_polarity', 30, 10, ModelID)
    20 
    21 area_center (Rectangle, Area, Row, Column)
    22 
    23 set_shape_model_origin (ModelID, -Row, -Column)
    24 
    25 get_shape_model_contours (ModelContours, ModelID, 1)
    26 
    27 dev_set_color ('red')
    28 dev_set_draw ('margin')
    29 dev_display (ModelContours)
    30 
    31 for Index := 0 to |Files|-1 by 1
    32     read_image (Image, Files[Index])
    33     find_shape_model (Image, ModelID, 0, rad(360), 0.4, 1, 0.5, 'least_squares', 0, 0.7, Row3, Column3, Angle, Score)
    34 
    35     vector_angle_to_rigid (0, 0, 0, Row3, Column3, Angle, HomMat2D)
    36     affine_trans_contour_xld (ModelContours, ContoursAffinTrans, HomMat2D)
    37     affine_trans_region (Rectangle1, RegionAffineTrans, HomMat2D, 'false')
    38     
    39     dev_set_color ('red')
    40     dev_display (ContoursAffinTrans)
    41     
    42     dev_set_color ('green')
    43     dev_display (RegionAffineTrans)
    44 endfor
    45 
    46 clear_shape_model (ModelID)

    坐标转换原理解析

    上述例程中涉及到坐标的算子主要有:

    • create_shape_model
    • set_shape_model_origin
    • find_shape_model
    • vector_angle_to_rigid
    • affine_trans_contour_xld
    • affine_trans_region

    第一步:创建模板

    create_shape_model (ImageReduced, 4, rad(0), rad(360), 'auto', 'auto', 'ignore_local_polarity', 30, 10, ModelID)

    算子原型:create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization, Metric, Contrast, MinContrast : ModelID)

    –Template :用于创建模板的图像,是原图的模板ROI区域;

    –NumLevels:金字塔层的最大层数;

    –AngleStart:模板的最小旋转角度,以弧度为单位;

    –AngleExtent:旋转角度范围,必须≥0,以弧度为单位;如果超出角度范围,则模型搜索不到

    –AngleStep:角度步长,以弧度为单位;

    –Optimization:生成模型的优化方法;

    –Metric:模板匹配的条件,在模板与图像亮暗发生反转时可使用;

    –Contrast:创建模型时,模型点的对比度;

    –MinContrast :在搜索的图像中,搜索对象的最小对比度,必须<Contrast;

    –ModelID:模型的句柄。

    算子使用时可能出现的错误:
    在这里插入图片描述

    在这里插入图片描述

    通过帮助文档看到是模板的点数太少,当绘制的模板ROI区域太小,或模板ROI区域内特征不明显时会出现,可以扩大模板ROI区域。

    第二步:设置原点

    1 area_center (Rectangle, Area, Row, Column)
    2 set_shape_model_origin (ModelID, -Row, -Column)

    在算子get_shape_model_contours和set_shape_model_origin的帮助文档中有说明:默认情况下,模板轮廓的原点位于模型区域的重心,即通过area_center获取的模板ROI的坐标,如下图所示的坐标系O 模 X 模 Y 模 O_模X_模Y_模OXY是模板轮廓的原始坐标系。

    在这里插入图片描述

    首先使用area_center (Rectangle, Area, Row, Column)获取O 模 O_模OO 图 O_图O中的坐标;
    然后使用set_shape_model_origin (ModelID, -Row, -Column)O 模 X 模 Y 模 O_模X_模Y_模OXY移动至与O 图 X 图 Y 图 O_图X_图Y_图OXY重合,

    第三步:匹配模板

    find_shape_model (Image, ModelID, 0, rad(60), 0.4, 1, 0.5, 'least_squares', 0, 0.7, Row3, Column3, Angle, Score)

    算子原型:find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)

    – Image :输入图像;

    –ModelID:模型的句柄;

    –AngleStart:模板的最小旋转角度,以弧度为单位;

    –AngleExtent:旋转角度范围,必须≥0,以弧度为单位;如果超出角度范围,则模型搜索不到

    –MinScore:要搜索到的模型实例的最小得分,如果低于此分数,则搜索不到;

    –NumMatches:要搜索到的模型实例的个数;

    –MaxOverlap:要找到的模型实例的最大重叠;

    –SubPixel:确定找到的目标是否使用亚像素精度提取;

    –NumLevels:搜索过程中使用的金字塔级别的数量 ;

    –Greediness :搜索启发式的“贪婪度”,(0:安全但缓慢;1:快,但可能匹配不到)

    –Row:找到的模型实例的行坐标,坐标值是找到模板的原点在图像坐标系中的行坐标;

    –Column:找到的模型实例的列坐标,坐标值是找到模板的原点在图像坐标系中的列坐标;

    –Angle:找到的模型实例的角度;

    –Score: 找到的模型实例的分数。

    第四步:坐标转换,得到模板ROI和检测ROI

    1 vector_angle_to_rigid (0, 0, 0, Row3, Column3, Angle, HomMat2D)
    2 affine_trans_contour_xld (ModelContours, ContoursAffinTrans, HomMat2D)
    3 affine_trans_region (Rectangle1, RegionAffineTrans, HomMat2D, 'false')

    计算变换矩阵
    算子原型:vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)

    –Row1:原始点的行坐标;

    –Column1:原始点的列坐标;

    –Angle1:原始点的角度;

    –Row2:变换点的行坐标;

    –Column2:变换点的列坐标;

    –Angle2:变换点的角度;

    –HomMat2D:输出的变换矩阵。

    ROI坐标转换
    使用算子:affine_trans_contour_xld和affine_trans_region

  • 相关阅读:
    awk
    Python自动化开发之python的常用模块
    sed
    python自动化开发-8
    正则表达式-2-正则表达式实战1
    linux之sort和uniq
    SSH免密登录
    Docker下安装Mongodb
    Docker下安装Elasticsearch
    Docker下安装RabbitMQ
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14445887.html
Copyright © 2020-2023  润新知