一维测量(也叫一维计量或卡尺)的概念非常直观。沿着一个预定的区域(主要是垂直于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 操作符进一步处理元组或函数。
具体项目案例下次再为大家讲解