本文主要是介绍机器视觉——物块分拣,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天我们来讨论一下如何让机器能够从含不良产品的物品中选出优品。
假如这个为优品(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')endifif(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 1read_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')endifif(Number!=1)*清空窗口dev_clear_window()*展示原图dev_display(Image)set_display_font(3600,28, '楷体', 'true', 'false')disp_message(3600,'OK',\'image',10,10,'green','false')endifstop()
endfor
最终成功案例
这篇关于机器视觉——物块分拣的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!