一维测量(也叫一维计量或卡尺)的概念非常直观。沿着一个预定的区域(主要是垂直于RIO感兴趣区域的方向) 边缘的位置。这里的边缘为从暗到亮或从亮到暗的过渡。

基于提取的边缘,可以测量零件的尺寸。例如,可以测量 ROI内零件的宽度,并将边缘定位在其左右两侧。

除了这些简单的矩形ROI外,圆弧也可以用来测量,例如,齿轮上的齿轮宽度。

这种测量方法的优点是使用方便,执行时间短,而且有很高的的精度。只需几个操作符,就可以实现高性能的应用。

另外,也可以使用HDevelop的测量助手,只需点击几下鼠标就可以进行测量。

基本概念

测量包括以下几个主要步骤:

获取图像

创建测量对象

在获取图像后,可以指定测量的位置,即描述要测量的线或弧的位置、方向等。

可以通过使用句柄handle来访问测量对象。类似于文件句柄,在使用该工具时需要这个句柄。每次执行测量时,这个句柄都会作为参数传递。

在像C++这样的面向对象的语言中,可以使用measure类来代替使用句柄的低级方法。在这里,用标准的面向对象方法实现创建和销毁。

测量

然后,可以通过指定测量对象和一些视觉参数,如最小对比度来应用测量。

扩展概念

在许多情况下,测量应用会比上面描述的更复杂,例如杂乱或不均匀的照明。此外,还可能要将特征转化为现实世界的单位,或将结果可视化。

衍射校准图像

为了进行高精度的测量,摄像机应该具有线性响应函数,即图像中的灰度值应该线性地取决于输入的量。

由于某些相机没有线性响应函数,因此 HALCON 提供了所谓的衍射校准(灰度值校准)。通过算子radiometric_self_calibration,可以确定相机的反响应函数(离线),然后在执行测量前使用lut_trans将此函数应用于图像。

对准ROI或图像

在某些应用中,要测量的直线或弧线必须相对于另一个对象对齐以方便测量。

矫正图像

与对准类似,可能需要对图像进行修正,例如,消除镜头变形。

创建测量对象

你可以用像draw_rectangle2这样的操作符交互式地测量线或弧线,或者从文件中读取它的参数(read_string)。作为另一种选择,它的坐标可以基于其他视觉工具如Blob Analysis的结果生成 。特别是在测量线或弧线可能需要对准某个对象的时候。

如果总是沿着同一条线或弧线进行测量,可以离线创建测量对象,然后多次使用它。 如果要对齐测量,每个图像的线或弧的位置和方向将有所不同,在这种情况下,必须为每个图像创建一个新的测量对象。这个规则的一个例外是只有位置改变而没有方向改变,可以保留测量对象,并通过 translate_measure 调整其位置。

将结果转化为世界坐标

如果已经校准了视觉系统,可以直接用image_points_to_world_plane将测量结果转化为世界坐标。

结果可视化

可视化边缘位置的最好方法是使用gen_contour_polygon_xld等运算符创建(短)XLD线段。

涉及算子

获取图像

衍射校准图像

基础:radiometric_self_calibration(校验径向畸变), lut_trans(用灰度值查找表变换图像)

对准ROI或图像

矫正图像

创建测量对象

基础:gen_measure_rectangle2(提取垂直于矩形的直边), gen_measure_arc(提取垂直于环形弧线的直边), translate_measure(转换测量对象)

测量

基础:measure_pos(测量垂直于矩形或圆弧的直边), measure_pairs(测量垂直于矩形或圆弧的直边对)

进阶:set_fuzzy_measure(指定模糊函数), fuzzy_measure_pos((通过指定模糊函数测量垂直于矩形或圆弧的直边), fuzzy_measure_pairs, fuzzy_measure_pairing(可以使用参数Pairing来测量交错对和包含对)

把结果转化为世界坐标

基础:image_points_to_world_plane

进阶:gen_contour_region_xld, contour_to_world_plane_xld

结果可视化

进阶:gen_contour_polygon_xld

一维测量的替代方法

边缘提取(亚像素精度)

测量边缘参数的一个非常好的方法是用edges_sub_pix提取边缘轮廓。这种方法的优点是它可以处理任意形状。此外,它可以确定每个边缘点的属性,如边缘方向。

小技巧

抑制杂物或噪音

在许多应用中,一些杂物或噪音必须被抑制。测量运算符提供了多种方法来实现。最好的是提高边缘提取的阈值,以消除模糊的边缘。此外,平滑参数的值可以增加,以平滑不相关的边缘。

当将边缘分组为对时,如果噪声边缘在 "真实 "边缘的附近并且具有相同的极性,则可能导致不正确的分组。在这种情况下,可以通过只选择连续上升和下降边缘序列中最强的边缘来抑制噪声边缘。

重用测量对象

因为创建一个测量对象需要一些时间,所以建议在有可能的情况下重复使用它们。例如,如果不需要对齐,可以离线创建测量对象,并重复使用该对象。如果对齐只涉及到转换,那么 translate_measure 可以用来修正位置。

使用绝对灰度值阈值

作为边缘提取的替代方法,可以使用操作符 measure_thresh 根据绝对灰度值阈值进行测量,可以使所有灰度值超过给定阈值的位置都会被选中。

高阶

模糊测量

如果存在不属于测量范围的额外边缘,HALCON提供了一个扩展版本的测量:模糊测量。 这个工具允许定义所谓的模糊规则,它描述了更好的边缘特征。可能的特征有位置、距离、灰度值或边缘的振幅。这些函数通过create_funct_1d_pairs创建,并通过set_fuzzy_measure传递给工具。基于这些规则,工具将选择最合适的边缘。

这种方法的优点是即使使用很低的最小阈值或平滑,也能灵活处理额外的边缘。

灰度值的评估

要完全控制沿测量线或弧线的灰度值的评估,可以使用 measure_projection。该操作符以数字数组的形式返回投影的灰度值,然后可以使用 HALCON 操作符进一步处理元组或函数。

具体项目案例下次再为大家讲解

Halcon一维测量1D Measuring解析的更多相关文章

  1. Halcon一维测量官方案例解析

    下面的例子简要介绍了如何使用HALCON的一维测量工具.最长的部分是预处理和后处理:测量本身只包括两个操作符调用. 测量保险丝-fuse 预处理主要是测量线的生成.在示例程序中,这个步骤是通过将测量对 ...

  2. Halcon一维运算相关算子整理

    Halcon一维离散函数算子 1.      abs_funct_1d  计算一维数组的绝对值 2.      compose_funct_1将两个离散的一维函数合并为一个函数 3.      cre ...

  3. HALCON里面的一维测量。

    第一步:将图片导入, 拿到图片的名字 和窗口的句柄 第二步:创建一个测量区域.这个测量区域是一个矩形,假设他的名字叫A gen_measure_rectangle2 (TmpCtrl_Row,//输入 ...

  4. Halcon一维码和二维码的解码步骤和技巧——第11讲

    针对Halcon中一维码和二维码的解码,我分别写了两篇文章,参见: <Halcon的一维条码解码步骤和解码技巧>:https://www.cnblogs.com/xh6300/p/1048 ...

  5. Halcon采集图像Image Acquisition解析

    很明显,图像的采集是所有机器视觉应用中必须解决的问题,HALCON提供了为各种图像采集设备执行这种交互的接口,图像采集的任务被简化为几行代码,只需几个操作符的调用,更重要的是,这种简单并不是以限制可用 ...

  6. halcon 特征测量

    Features 1. line_orientation   功能:计算线的方位. 2. line_position   功能:计算一条线的重心.长度和方位. 3. partition_lines   ...

  7. Halcon 2D测量

    * This program shows how to detect the edges of a diamond * with subpixel accuracy and calculate the ...

  8. halcon——缺陷检测常用方法总结(测量拟合)

    引言 机器视觉中缺陷检测分为一下几种: blob分析+特征 模板匹配(定位)+差分:halcon--缺陷检测常用方法总结(模板匹配(定位)+差分) - 唯有自己强大 - 博客园 (cnblogs.co ...

  9. 分享吉林大学机械科学与工程学院,zhao jun 博士的Halcon学习过程及知识分享

    分享吉林大学机械科学与工程学院,zhao jun 博士的Halcon学习过程及知识分享 全文转载zhao jun 博士的新浪博客,版权为zhaojun博士所有 原文地址:http://blog.sin ...

随机推荐

  1. 【javascript的那些事】等待加载完js后执行方法

    很多时候,你也许会碰到 使用的情景: js文件b.js还没有从服务器端加载到web端,而吧a.js中已经调用了b.js中的方法 实例: 这里是加载echart的时候碰到的具体实例 引入js " ...

  2. linux安装syncthing

    https://blog.csdn.net/weixin_30527551/article/details/98882344 https://syncthing.net/downloads/ http ...

  3. TensorFlow从0到1之TensorFlow多层感知机实现MINIST分类(22)

    TensorFlow 支持自动求导,可以使用 TensorFlow 优化器来计算和使用梯度.它使用梯度自动更新用变量定义的张量.本节将使用 TensorFlow 优化器来训练网络. 前面章节中,我们定 ...

  4. vue+ajax的实现

    html <tr> <td>用户名</td> <td id="t01"><input type="text" ...

  5. 循序渐进VUE+Element 前端应用开发(11)--- 图标的维护和使用

    在VUE+Element 前端应用中,图标是必不可少点缀界面的元素,因此整合一些常用的图标是非常必要的,还好Element界面组件里面提供了很多常见的图标,不过数量不是很多,应该是300个左右吧,因此 ...

  6. Windwos安装Redis

    下载地址:https://github.com/MicrosoftArchive/redis 进入后点击release,下方可看到下载地址,下载mis文件,双击即可安装

  7. 深入理解React:事件机制原理

    目录 序言 DOM事件流 事件捕获阶段.处于目标阶段.事件冒泡阶段 addEventListener 方法 React 事件概述 事件注册 document 上注册 回调函数存储 事件分发 小结 参考 ...

  8. 使用IDEA 发布项目搭配远程仓库 Gitee

    本次讲解的是idea 发布到gitee上 一样的操作流程 没有基础的请先去学习 附上我的 gitee 地址 有资源会发布到gitee 俗话说关注走一走 活到999 https://gitee.com/ ...

  9. 计算机网络之DNS常见攻击

    DNS欺骗 在Internet上存在的DNS服务器有绝大多数都是用bind来架设的,使用的bind版本主要为bind 4.9.5+P1以前版本和bind 8.2.2-P5以前版本.这些bind有个共同 ...

  10. 弹性盒模型中flex-grow 和flex的区别

    在flex弹性盒模型体系中,flex-grow和flex都有对子元素进行放大的作用,但是这两个属性在放大时的计算方法不同,在使用时候要注意,使用正确的放大属性,从而达到自己想要的效果. 先来看下两个属 ...