halcon中如何将一排圆孔连线?

最近研究halcon的圆孔定位四个月了,这里分享一下我的心得,也是备忘

  1. 支持任意类型的圆孔检测
  2. 极性除了内黑外白,内白外黑,还有可能是黑色条带中心,白色条带中心
  3. 用户给出的直径有可能有10%的偏差
  4. 用户给的极性可能是错误的
  5. 圆环周围可能有干扰边缘,但必须找到最精准边缘

Halcon圆检测相关方法

直接用对比度分割出关键的圆形 当圆环和周围颜色相近时,直接罢工
提取图像中的关键边缘,找到可能是圆弧的部分,拼接成一条完整圆弧,然后拟合 平滑后的精度低,不平滑图像中有很多零散圆弧干扰
通过沿着区域点画圆,找到大概率是圆心的区域 当参数半径和实际偏差较大时,得到的区域不准确
在圆周一圈找阈值峰值点,用这些点进行拟合 有图像可能存在非常多的干扰峰值
当图像圆中有复杂图像时,无法找到结果
较差的图像需要调低得分,但低得分容易带来错误结果
先找到梯度图中可能是圆弧的点,再用这些点进行拟合 找的点不准确容易有偏差

通常,我们进行两次定位

  1. 粗定位:目的是获得圆的大致位置,然后可以用reduce_domain缩小图像范围(减少精定位时间),粗定位有很多好用的方法,但是都有其局限性,这里就不赘述。
  2. 精定位:为的是能找到更精确的边缘,得到更高精度的结果

因为遇到了很多糟心的图片,所以楼主的算法也相应比较复杂

    1. 获取梯度方向偏差图片:
      因为圆环的梯度方向都是统一的,类似如下的图片(有可能需要旋转),我们可以用得到的梯度方向图减去下图,就可以得到梯度方向偏差图,其中灰度接近0的点就是我们所需要的关键点

    2. 因为shape_model得到的结果不稳定,在边缘有毛刺时容易有细微的偏差,所以我在这个结果周围找到Image_Result中的关键点进性拟合

    3. 注意:如果粗定位使用了平滑,那这里也需要平滑,因为图像可能存在很多噪点、条纹的干扰

    4. 因为shape_model得到的结果不稳定,容易有细微的偏差,所以我在这个结果周围找到Image_Result中的关键点进性拟合

    5. 如果还没找到圆,有两种可能,
      2:客户的直径或极性输错了

    6. 因为客户给出的直径有可能是错误,所以这里我使用过程中得到的半径作为目标分析,而不再使用客户给出的直径,这样也可以提高对不良结果的过滤。
      注意:精定位可以直接使用权重定位法,跳过上面的条带结果和边缘结果分析,但这样遇到多层圆环时,容易带来一半内环,一半外环的问题。

    7. 注意:权重还可以添加很多要素,比如圆周的灰度一致性,梯度方向一致性等,这里只是个例子

    8. 过滤出最权重较为显著的点,构成contour,过滤掉circularity较低的结果


1.采集图像(实时或者外触发)
2.图像预处理去噪声(采用滤波器)
3.图像分割(将目标和背景分割)
4.区域定位(在该区域内进行测量)
5.边缘提取(像素或者亚像素)
6.进行直线或者曲线拟合(用于求解距离)
7.求解拟合直线或者曲线间的像素距离(欧式距离,棋盘距离等)
8.像素距离到实际距离的转换(根据之前的标定结果)




边缘幅度,就是对原图像求一阶导数


  1. Width:测量图像的宽
  2. Height:测量图像的高

  1. Transition:找的正边缘还是负边缘(第一个边缘)
  2. Select :选第一条边,还是最后一条,还是所有的边
  3. RowEdgeFirst:边缘对中的第一个边缘的行坐标
  4. AmplitudeFirst:边缘对中第一个边缘的幅度值(就是一阶导数)
  5. RowEdgeSecond:边缘对中的第二个边缘的行坐标
  6. AmplitudeSecond:边缘对中第二个边缘的幅度值(就是一阶导数)
  7. InterDistance:相邻两个边缘对中心的的距离

一 维 测 量 一维测量


* 对轮廓进行仿射变换 * 如果分数绝对值大于0 * 对轮廓进行仿射变换 * 进行像素级仿射变换 * 进行像素级仿射变换

* 相对于其最小的周围矩形剪裁一个区域。 * 12:比它小,就不是边缘 * 22:比它大,就是边缘 * 将区域转成二进制图像 * 矩形轮廓区域图像获取

二 维 测 量 二维测量

我要回帖

更多关于 cdr怎么连接线条缝隙 的文章

 

随机推荐