一维测量(也叫一维计量或卡尺)的概念非常直观。沿着一个预定的区域(主要是垂直于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. Spring WebFlux 学习笔记 - (一) 前传:学习Java 8 Stream Api (2) - Stream的中间操作

    Stream API Java8中有两大最为重要的改变:第一个是 Lambda 表达式:另外一个则是 Stream API(java.util.stream.*). Stream 是 Java8 中处 ...

  2. opencv 移植

    1.ubunut系统搭建opencv+python开发环境 1.1.ubuntu系统安装pip3工具 sudo apt-get install python3-pip //安装python模块安装工具 ...

  3. Tomcat/ WebSphere/WebLogic的作用和特点

    作用: Tomcat:目前应用非常广泛的免费web服务器,支持部分j2ee. WebSphere:是IBM集成软件平台.可做web服务器,WebSphere提供了可靠.灵活和健壮的集成软件. Webl ...

  4. Cookie 与 SessionID 的本质

    当用户首次访问服务器的时候,服务器为每个用户单独创建一个 Session 对象,并分配一个新的 SessionID,此时 SessionID 通过 Cookie 保存在用户端. 当用户再次访问服务器的 ...

  5. [计网笔记] 传输层---TCP 传输层思维导图

    传输层思维导图 TCP笔记 为什么是三次握手和四次挥手 https://blog.csdn.net/baixiaoshi/article/details/67712853 [问题1]为什么连接的时候是 ...

  6. MySQL 性能优化之慢查询

    性能优化的思路 首先需要使用慢查询功能,去获取所有查询时间比较长的SQL语句 其次使用explain命令去查询由问题的SQL的执行计划(脑补链接:点我直达1,点我直达2) 最后可以使用show pro ...

  7. navicat 出现 mysql远程连接问题 Lost connection to MySQL server at ‘reading initial communication packet', system error: 0

    今天做服务器上的东西需要看数据库时,突然发现有这个报错,然后自己也查了很多资料 我最后找到一个在my,cnf配置文件中mysqld下加入一条 max_allowed_packet = 500M 也就是 ...

  8. 全网最全fiddler使用教程和fiddler如何抓包(fiddler手机抓包)-笔者亲测

    一.前言 抓包工具有很多,比如常用的抓包工具Httpwatch,通用的强大的抓包工具Wireshark.为什么使用fiddler?原因如下:1.Wireshark是通用的抓包工具,但是比较庞大,对于只 ...

  9. C++_继承

    C++支持单继承和多继承,并提供3类继承:public.private及protected.在public继承中,每个派生类对象都是基类对象,反之基类对象却不是派生类对象.派生类成员无法直接访问基本的 ...

  10. Java类、实例初始化的顺序

    求如下 java 代码的输出?? class T implements Cloneable{ public static int k = 0; public static T t1 = new T(& ...