halcon 中模板匹配与测量工具搭配总结

一般的步骤如下:

  • 基于图像抠domain,用来注册模板;
  • domain的重心默认为模板参考中心,为后续测量工具偏移做准备(该位置可修改);
  • 在该图像上创建测量工具,确定好工具的初始位姿;
  • 匹配,获得模板参考中心新的行列及角度;
  • 基于模板参考中心的新旧位置,构建变换矩阵;
  • 对测量工具进行放射变换。
* halcon创建基于形状的模板相关算子的对比:https://www.51halcon.com/forum.php?mod=viewthread&tid=6128
* HALCON形状匹配讲解 https://www.cnblogs.com/shuimuqingyang/p/10193078.html
* create_shape_model 创建普通模板
* create_scaled_shape_model 创建同步变大变小变化的模板
* create_aniso_shape_model 创建异步变大/变小变化的模板
* create_generic_shape_model 创建基于训练数据的模板(最强大)
* create_planar_calib_deformable_model 创建用于校准(相机内外参)透视匹配的可变形(线性变化)模型
* create_planar_uncalib_deformable_model 为未校准(无需相机内外参)的透视匹配创建可变形模型
* create_local_deformable_model 创建局部变形模板
* 分为如下几个步骤:
* 1.创建模板
* 2.创建测量工具
* 3.查找匹配
* 4.创建位姿转换矩阵
* 5.偏移测量工具,进行测量

* create_shape_model(
* Template ,  //reduce_domain后的模板图像
* NumLevels,  //金字塔的层数,可设为“auto”或0—10的整数,越大匹配的越快。auto会自己计算。
*             需要保证顶层金字塔轮廓信息足够才行,可通过inspect_shape_model提前检查设置多少金字塔层数合适
* AngleStart,  //模板旋转的起始角度。注意模板在find_shape_model函数中只能找到这个范围内的匹配。
* AngleExtent,  //模板旋转角度范围, >=0
* AngleStep,  //旋转角度的步长, >=0 and <=pi/16,可自动计算
* Optimization,  //模板优化方法,'none', 所有的模型点将要存储,对于大图像会降低速度,但小图像差别不大。point_reduction_low大约一半点,point_reduction_medium 大约1/3,point_reduction_high大约1/4
* Metric,  //匹配方法设置, 'use_polarity',图像中的目标必须和模型具有一样的对比度。例如,如果模型是一个亮的目标在一个暗的背景上,
*          那么仅仅那些比背景亮的目标可以找到。'ignore_global_polarity',在两者对比度完全相反时也能找到目标。
*          极性模式: use_polarity 生成的模板就一个目标
*          极性模式: ignore_global_polarity 生成的模板有两个目标,一个是原图另一个是灰度值取反,黑的变白,白的变黑
*          极性模式: ignore_local_polarity 生成的模板有三个目标,除上面两个还有一个是灰度值渐变
* Contrast,  越大模板中边缘越少,越小边缘越多
*           Contrast可以是两个数值,使用滞后阈值的算法进行分割。
*           Contrast也可以包含第三个,该值少于所指定的最小大小的点数的组件将被抑制。对于每个连续的金字塔级别,最小尺寸的阈值将除以2。
*           如果希望抑制小型模型组件,但不执行滞后阈值处理,则仍然必须在"对比度(Contrast)"中指定三个值。在这种情况下,前两个值可以简单地设置为相同的值。
*           如果Contrast设置为'auto',create_shape_model将会自动确定三个上面描述的数值。
* MinContrast ,  物体是否具有较低的对比度,如果要求物体在任何状态下都能被识别,则应减小MinContrast值
* ModelID )

* 【滞后阈值原理】
* 1. 若某一像素位置的幅值超过高阈值,则该位置被保留。
* 2. 若某一像素位置的幅值低于低阈值,则该位置被去除。
* 3. 若某一像素位置的幅值处于高低阈值之间,则该像素仅仅在连接到一个高于高阈值像素时被保留。

* 1.创建基于形状的模板
read_image (Image, 'img/circle_plate_01.png')
get_image_size (Image, Width, Height)
gen_rectangle1 (ROI_0, 239, 420, 461, 631)
reduce_domain (Image, ROI_0, ImageReduced)
* 只计算create_shape_model的auto参数,用于动态交互UI由用户确定参数的情形
* determine_shape_model_params (ImageReduced, 'auto', -0.39, 0.79, 0.9, 1.1, 'auto', 'use_polarity', 'auto', 'auto', 'all', ParameterName, ParameterValue)
* 创建形状模板
create_shape_model (ImageReduced, 'auto', rad(0), rad(360), 'auto', \
                    'none', 'use_polarity', 30, 10, ModelID)
* 查看设置auto参数自动计算的数值
get_shape_model_params (ModelID, NumLevels, AngleStart, AngleExtent, AngleStep, ScaleMin, ScaleMax, ScaleStep, Metric, MinContrast)
* 查看当前数值金字塔中轮廓的情况
inspect_shape_model (ImageReduced, ModelImages, ModelRegions, NumLevels, MinContrast)
* 查看模板提取的特征轮廓
get_shape_model_contours (ModelXLD, ModelID, 1)
* 计算区域重心,即模板的参考中心(注意可通过set_shape_model_origin设置参考中心),【重点】该中心是在全局图像中的坐标,不是局部模板内的坐标
area_center (ImageReduced, Area, RowModel, ColumnModel)
gen_circle (Circle1, RowModel, ColumnModel, 5)


* 2.创建测量工具 例程[measure_stamping_part.hdev]
* Create the metrology model and prepare it for calibrated measurements.
create_metrology_model (MetrologyHandle)
* Set the image size in advance to speed up the first call of apply_metrology_model.
set_metrology_model_image_size (MetrologyHandle, Width, Height)
* Set the camera parameters.
* set_metrology_model_param (MetrologyHandle, 'camera_param', CameraParam)
* Set the plane in which the measured object lies.
* set_metrology_model_param (MetrologyHandle, 'plane_pose', MeasurementPlaneAdjusted)
* 添加卡尺检测ROI
Line := [258, 516, 445, 519]
add_metrology_object_generic (MetrologyHandle, 'line', Line, 20, 5, 1, 30, [], [], LineIndices)
*检查设置项
get_metrology_object_model_contour (ModelContour, MetrologyHandle, 'all', 1.5)
get_metrology_object_measures (MeasureContour, MetrologyHandle, 'all', 'all', Row, Column)
stop()

* 3.查找匹配
* find_shape_model(Image 
* ModelID, 
* AngleStart, 搜索时的起始角度
* AngleExtent, 搜索时的角度范围,必须与创建模板时的有交集。
* MinScore, 大于该分值的才算是在图像中找到模板。MinScore设置的越大,搜索的就越快。如果模板在图像中没有被遮挡,MinScore可以设置为0.8这么高甚至0.9。
* NumMatches, 定义要输出的匹配的最大个数,参数MinScore优于NumMatches,如果找的匹配目标不足NumMatches,那么就只返回找到的这几个。
* MaxOverlap,当找到的目标存在重叠时,且重叠比例大于该值时选。如果MaxOverlap=0, 找到的目标区域不能存在重叠, 如果MaxOverla p=1,所有找到的目标区域都要返回。
* SubPixel, 亚像素提取的方法。'interpolation'插值法,这种模式几乎不花费计算时间,并且能达到足够高的精度,被广泛使用。
*          'least_squares'等最小二乘需要额外的计算时间,一般设置为'least_squares'可兼顾运行时间和精度。
* NumLevels,搜索时金字塔的层数,如果NumLevels=0,使用创建模板时金字塔的层数
* Greediness 贪婪度,如果太高,就找不到其中一些可见物体,设置为0来执行完全搜索;【越高速度快】,但容易出现找不到的情况。
* Row, 输出匹配位置的行坐标,注意Row、Column的坐标并不是模板在搜索图像中的精确位置,因此不能直接使用他们。
*        这些数值是为了创建变换矩阵被优化后的,你可以用这个矩阵的匹配结果完成各种任务,比如调整后续步骤的ROI。
*        模型参考点是在create_shape_model中用来创建模型的图像的domain区域的重心,可以set_shape_model_origin设置不同的初始位置
* Column,输出匹配位置的列坐标
* Angle, 输出匹配角度
* Score 输出匹配质量,如果模板的一半被遮挡,该值就不能超过0.5。
read_image (SearchImage, 'img/circle_plate_02.png')
find_shape_model (SearchImage, ModelID, rad(0), rad(360), \
                  0.5, 1, 0.5, 'least_squares', \
                  0, 0, Row, Column, Angle, Score)
gen_circle (Circle, Row, Column, 5)

* 4.创建位姿转换矩阵,从模板进行偏移,这个是最关键的
vector_angle_to_rigid (RowModel, ColumnModel, 0, Row, Column, Angle, HomMat2DObject)

* 5.偏移测量工具,进行测量
* 将卡尺两个点进行变换
affine_trans_point_2d(HomMat2DObject, Line[0], Line[1], L0_X, L0_Y)
affine_trans_point_2d(HomMat2DObject, Line[2], Line[3], L1_X, L1_Y)
clear_metrology_object (MetrologyHandle, 'all')
add_metrology_object_generic (MetrologyHandle, 'line', [L0_X,L0_Y,L1_X,L1_Y], 20, 5, 1, 30, [], [], LineIndices)
get_metrology_object_measures (MeasureContour, MetrologyHandle, 'all', 'all', Row, Column)

模板图像:
在这里插入图片描述

模板注册:
在这里插入图片描述
模板参考中心:
在这里插入图片描述

卡尺:
在这里插入图片描述

新图像匹配到的及参考中心:
在这里插入图片描述
修正卡尺位置:
在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值