【Halcon】1D测量之一


  学习如何使用Halcon进行1D测量,可以参考: 1、 Halcon自带的文档【solution_guide_iii_a_1d_measuring.pdf】2、 Halcon例程【measure_switch.hdev】     

   其中 【solution_guide_iii_a_1d_measuring.pdf】,第一章以Halcon例程【measure_switch.hdev】为例分析了测量的过程。第二章讲了测量的一些基础知识,可以参考文章:https://www.cnblogs.com/xiaomaLV2/p/3386273.html。第三章解释了如何用测量对象来检测边缘、边缘对、特定灰度值的点和灰度值分布图,描述了如何把测量结果转换为世界坐标,第四章描述了怎么解决更加复杂的测量问题。

     下面是【solution_guide_iii_a_1d_measuring.pdf】 第二章测量的一些基础知识的一部分内容:

          •  HALCON 得出一维边缘的步骤:

 第一步画出一个矩形或扇形的ROI(测量对象),然后在ROI内画出等距离的、长度与ROI宽度一致的、垂直于ROI的轮廓线(profile line)的等距线。

        第二步算出每一条等距线的平均灰度值,可以得出轮廓线的灰度直方图。

 如果等距线不是垂直或水平的,那么等距线经过的就不是一个完整的像素,需要进行插值处理。构建测量对象的算子(如gen_measure_rectangle2)的参数Interpolation可以决定插值的方法, 设置Interpolation = ’nearest_neighbor’则取最近像素的灰度值,这种方法速度最快,但精度低,设置Interpolation = ’bilinear’采用双线性插值法,这种方法精度最高但是速度最慢。

        等距线的长度,也就是ROI的宽度影响了轮廓线垂直方向上的平均灰度值。因此,如果我们想要检测的边缘垂直于轮廓线的话,ROI的宽度尽量打,否则,尽量小。如果边缘不垂直于轮廓线,获取到的灰度直方图会含有较多噪声,检测到的边缘会不那么准确。

         第三步用高斯滤波器平滑灰度直方图,测量算子(如measure_pairs)的参数Sigma指定了高斯滤波器的标准差。

        第四步求出平滑灰度直方图的一阶导数,一阶导数的极值点作为边缘的候选点,候选点均为亚像素精度,只有一阶导数极值点的绝对值大于预先设定的阈值(测量算子的参数Threshold)边缘候选点才被选作为边缘中心点。测量算子最后得到每一条边缘与轮廓线的交点。

         下面是【solution_guide_iii_a_1d_measuring.pdf】 第三章使用测量对象的一部分内容:

  •   例程measure_ic_leads.hdev中使用了 算子measure_pos来测量IC管脚的长度。测量对象的轮廓线如图中红线所示。算子measure_pos可以用于检测单个边缘。算子的参数Transition = ’negative’时,只返回从亮到暗的边,

Transition =’positive’时,只返回从暗到亮的边。Transition = ’all’时,返回所有的边。

  •      例程中用了算子measure_pairs来测量IC管脚的宽度。边缘分组成对:如果参数Transition =“positive”,则只有那些第一条边为从暗到亮和第二条边为从亮到黑的边缘对会返回(也就是说包围亮区域的两条边会返回),且返回的点(RowEdgeFirst,ColumnEdgeFirst)为矩形长轴方向上由黑到亮的边缘点,点(RowEdgeSecond,ColumnEdgeSecond)为由亮至暗的边缘点。如果Transition =“negative”,则相反。

   如果找到具有相同转换的多于一个的连续边缘,则将第一个边缘用作对元素。这种行为可能会导致在阈值不能被选择得足够高以抑制相同转换的连续边缘的应用中出现问题(如图a)。对于这些应用,存在第二种配对模式,即仅选择一个具有连续上升沿和下降沿的序列上的相应最强边缘。通过将“_strongest”附加到任何以上转换模式,例如“negative_strongest”可以选择此模式。

  • 在measure_caliper.hdev测量除了游标卡尺的齿距线之间的距离。

      首先创建一个只包含最长齿距线的测量对象,再通过算子measure_projection算出灰度直方图。