• halcon视觉入门钢珠识别


    halcon视觉入门钢珠识别

    经过入门篇,我们有了基础的视觉识别知识。现在加以应用。

    有如下图片:

    image

    我们需要识别图片中比较明亮的中间区域,有黑色的钢珠,我们需要知道他的位置和面积。

    1. 分析如何识别

    2. 编写代码实现识别

    实现代码如下:

    * Image Acquisition 01: Code generated by Image Acquisition 01
    read_image (Image, 'D:/temp/cir.png')
    dev_close_window ()
    get_image_size (Image, Width, Height)
    dev_open_window_fit_size (0, 0, Width, Width, -1, -1, WindowHandle)
    *二值化
    binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold)
    *反向裁剪
    complement (Region, RegionComplement) 
    *截断选区
    connection (RegionComplement, ConnectedRegions)  
    *过滤底部干涉
    select_shape (ConnectedRegions, SelectedRegions1, 'rectangularity', 'and', 0, 0.9) 
    *合并选区
    union1 (SelectedRegions1, RegionUnion) 
    *转换为规则的形状(外接圆)
    shape_trans (RegionUnion, RegionTrans, 'outer_circle')
    *裁剪出感兴趣区域
    reduce_domain (Image, RegionTrans, ImageReduced) 
    *对裁剪出来的区域二值化
    binary_threshold (ImageReduced, Region1, 'max_separability', 'dark', UsedThreshold1)
    *开操作
    opening_circle (Region1, RegionOpening1, 50) 
    *开操作
    opening_circle (Region1, RegionOpening2, 80)
    *对比不同
    difference (RegionOpening1, RegionOpening2, RegionDifference) 
    *分割区域
    connection (RegionDifference, ConnectedRegions1)
    
    shape_trans (ConnectedRegions1, RegionTrans1, 'outer_circle')
    *重新排序 
    sort_region (RegionTrans1, SortedRegions, 'first_point', 'true', 'row')
    *计算除面积和圆心
    area_center (SortedRegions, Area, Row, Column)
    dev_set_draw ('margin')
    dev_set_color ('green')
    dev_display (Image)
    dev_display (SortedRegions)
    for Index := 0 to |Area| -1 by 1
        dev_set_draw ('margin')
        dev_set_color ('red')
        dev_set_line_width (5)
        set_tposition (WindowHandle, Row[Index], Column[Index])
        write_string (WindowHandle, 'Area:' + Area[Index] +',origin:'+Row[Index] + ',' + Column[Index])
    endfor
      count_obj (SortedRegions,Number)
      set_tposition (WindowHandle, 10,10)
      write_string (WindowHandle, 'Total Number:' +Number) 
    
    

    以下是分析

    分析

    我们需要识别的内容在如图标注的内容上:

    image

    首先,按照上次讲的内容:

    1. 打开图片(OpenImage)
    2. 将图片分解成3通道图片,或是转成灰度图(GrayImage)。
    3. 二值化或动态二值化(Region)。
    4. 联通区域。
    5. 特征筛选。
    6. 如果区域有干扰,一般会进行一下操作:
      1. 腐蚀
      2. 膨胀
      3. 形状转换
      4. 以上步骤重复,或组合重复。
    7. 根据需要,还可以合并区域,并重复4-6,从而达到目的。
    8. 输出区域并标注。

    算子使用规则

    我们通过三个例子来理解它:

    Image 是输出参数,也就是我们的结果

    'D:/temp/cir.png' 字符串常量 是出入参数,在Halcon中叫 控制参数

    read_image (Image, 'D:/temp/cir.png')
    

    Image是输入参数

    Region 是输出参数

    'max_separability' 是控制参数

    'dark' 是控制参数

    UsedThreshold 输出控制参数

    binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold)
    

    Image是输入参数

    Regions是输出参数

    0 是输入控制

    71 是输入控制

    threshold (Image, Regions, 0, 71)
    

    以下是实现思路跟结果讲解

    * 读取图片
    read_image (Image, 'D:/temp/cir.png')
    

    得到结果
    image

    在进行动态二值化,或手动二值化也可以。

    *动态二值化
    binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold)
    
    * 手动二值化
    threshold (Image, Regions, 0, 71)
    

    得到结果
    image

    *反向裁剪
    complement (Region, RegionComplement) 
    

    得到结果
    image

    *联通区域
    connection (RegionComplement, ConnectedRegions)  
    

    该步骤讲以上区域分割成一个一个零散区域。

    *过滤底部干涉
    select_shape (ConnectedRegions, SelectedRegions1, 'rectangularity', 'and', 0, 0.9) 
    

    我们可以在上一步的结果中看到,下面有一条线,这条线在外形上跟矩形很类似,我们通过矩形选取去过滤掉它。

    得到结果
    image

    *合并选区
    union1 (SelectedRegions1, RegionUnion) 
    

    合并区域跟联通区域是一个相反的操作,合并区域的目的是将零散区域合并成一个整体,这样,我们就可以给它做外接圆,旋转整个需要识别的区域。

    *转换为规则的形状(外接圆)
    shape_trans (RegionUnion, RegionTrans, 'outer_circle')
    

    得到结果
    image

    *裁剪出感兴趣区域
    reduce_domain (Image, RegionTrans, ImageReduced) 
    

    以上的所有步骤,都是为了得到感兴趣区域。
    为什么要得到感兴趣区域呢,因为我们需要识别的内容,就在这个区域内,其他外部区域都是干扰,我们不需要关心。所以,在得到外接圆之后,我们用这个外接圆对原图进行裁剪,就得到了我们感兴趣的区域,到了现在,我们才真正准备开始对钢珠进行识别。

    按照套路,我们要进行二值化,所以下面的代码就是动态二值化。当然也可以通过特征进行手动二值化。

    *对裁剪出来的区域二值化
    binary_threshold (ImageReduced, Region1, 'max_separability', 'dark', UsedThreshold1)
    

    得到结果
    image

    接下来进行 腐蚀和膨胀 -----> 开操作(腐蚀和膨胀等同开操作):

    Region1 输入区域

    RegionOpening1 输出区域

    50 开操作控制参数,这个参数是需要尝试得到的,由小到大,最终符合要求。

    *开操作
    opening_circle (Region1, RegionOpening1, 50) 
    

    得到结果
    image

    然后再次进行开操作,得到一个没有选取的结果。然后对比两个结果,取差值。
    解释:假设第一次开操作得到了6个球,第二次一个都没有,那么两个取差值,就一定有6个球。

    *开操作
    opening_circle (Region1, RegionOpening2, 80)
    
    *对比不同,两次开操作,的结果进行对比。得到不同区域。
    difference (RegionOpening1, RegionOpening2, RegionDifference) 
    
    

    实则这里不进行对比也是可以的。

    得到结果
    image

    接下来分割区域,做形状转换。就是我们要的结果了。因为,我们上述操作,操作的是一个整体,但我们需要将这些结果进行分割,所以需要进行联通区域,得到区域后,因为区域形状不规则,所以我们需要将形状转化为规则的圆。所以需要进行性转转换。

    *分割区域
    connection (RegionDifference, ConnectedRegions1)
    *对分割的区域,做最小外接圆。
    shape_trans (ConnectedRegions1, RegionTrans1, 'outer_circle')
    

    以上就是我们需要的结果了

    得到结果
    image

    接下来就是排序,并计算圆心,画出坐标和面积了,代码比较简单就不截图了,直接给结果:

    *重新排序 
    sort_region (RegionTrans1, SortedRegions, 'first_point', 'true', 'row')
    *计算面积和圆心
    area_center (SortedRegions, Area, Row, Column)
    dev_set_draw ('margin')
    dev_set_color ('green')
    dev_display (Image)
    dev_display (SortedRegions)
    for Index := 0 to |Area| -1 by 1
        dev_set_draw ('margin')
        dev_set_color ('red')
        dev_set_line_width (5)
        set_tposition (WindowHandle, Row[Index], Column[Index])
        write_string (WindowHandle, 'Area:' + Area[Index] +',origin:'+Row[Index] + ',' + Column[Index])
    endfor
      count_obj (SortedRegions,Number)
      set_tposition (WindowHandle, 10,10)
      write_string (WindowHandle, 'Total Number:' +Number)
    

    得到结果
    image

    总结

    初学者怎么知道这些算子有什么作用呢,这些参数该如何使用呢,需要使用哪些特征呢?

    在开发环境中 HDevelop中 按F1 可以看到帮助,多使用帮助,也可以在网上看视频,多看自带的例子。动手写,才能有进步。

    选中算子按F1可以看到帮助

    在HDevelop中按 Ctrl + E 可以打开示例程序

  • 相关阅读:
    win下的PG12安装plpython3u
    IDEA中的代码块批量修改
    Python的32和64位共存在win
    数据库表转化为model
    国标查询
    C#DataGridview 绑定与数据转化
    fastadmin 点击checkbox 或反选checkbox 统计某个字段的值
    [Mysql] 两段提交
    Windows docker环境安装
    vue2使用echarts内置地图实现点击事件
  • 原文地址:https://www.cnblogs.com/LearningC/p/15868735.html
Copyright © 2020-2023  润新知