机器视觉——物块分拣

今天我们来讨论一下如何让机器能够从含不良产品的物品中选出优品。

假如这个为优品(OK):

这个为次品(NG):

那么我这里有一系列物品图片,分拣出好的和坏的,分辨标上OK、NG

先对所有文件做一次筛选,踢去非图片类的文件。

list_files ('./img/物块', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)

由于我们这么多图片,肯定是要放一个for循环,进行循环处理。

for Index := 0 to |ImageFiles| - 1 by 1
  ...
endfor

像往常一样,我们先进行通道分解,将多通道分解成RGB单通道灰度图像。

decompose3(Image,R,G,B)

阈值分割

threshold (G, Regions, 0, 20)

连通域打散

connection(Regions,ConnectedRegions)

特征筛选

select_shape(ConnectedRegions,SelectedRegions,\
                 'area','and',200000,300000)

因为用G图像分解

优品在灰度直方图里面没有的

而次品就很明显全红,这也是两种区别最大的地方

 次品选中区域的面积为

然后大部分面积都处于200000-300000之间。所以我们特征筛选范围为200000,300000。

将每一个选出来的区域放在SelectedRegions变量里面,然后统计数量

count_obj(SelectedRegions,Number)

因为只要面积范围选的对,那么Number就为1

所以只要Number为1就说明为次品,打印NG;否则打印OK

if(Number==1)
         *清空窗口
        dev_clear_window()
        *展示原图
        dev_display(Image)
        set_display_font(3600,28, '楷体', 'true', 'false')
        disp_message(3600,'NG',\
                    'image',10,10,'red','false')
    endif
    if(Number!=1)
         *清空窗口
        dev_clear_window()
        *展示原图
        dev_display(Image)
        set_display_font(3600,28, '楷体', 'true', 'false')
        disp_message(3600,'OK',\
                    'image',10,10,'green','false')
    endif

完整代码

list_files ('./img/物块', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[Index])
    
    decompose3(Image,R,G,B)
    *第一次阈值分割(分骰子的主体部分)
    threshold (G, Regions, 0, 20)
    *连通域打散
    connection(Regions,ConnectedRegions)
    *特征筛选
    select_shape(ConnectedRegions,SelectedRegions,\
                 'area','and',200000,300000)
    count_obj(SelectedRegions,Number)
    if(Number==1)
         *清空窗口
        dev_clear_window()
        *展示原图
        dev_display(Image)
        set_display_font(3600,28, '楷体', 'true', 'false')
        disp_message(3600,'NG',\
                    'image',10,10,'red','false')
    endif
    if(Number!=1)
         *清空窗口
        dev_clear_window()
        *展示原图
        dev_display(Image)
        set_display_font(3600,28, '楷体', 'true', 'false')
        disp_message(3600,'OK',\
                    'image',10,10,'green','false')
    endif
     
    stop()
endfor

最终成功案例

 

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值