《zw版·Halcon-delphi系列原创教程》酸奶自动分类脚本(机器学习、人工智能)

Halcon强大的图像处理能力,令人往往会忽视其内核,是更加彪悍的机器学习、人工智能。

      分类,聚类分析,是机器学习、人工智能的核心算法之一,也是个典型的应用。

Halcon内置的聚类分析、机器学习模块,就有:knn邻近算法、向量机SVM、GMM高斯混合模型(Gaussian Mixture Model,或者混合高斯模型,也可以简写为MOG(Mixture of Gaussian)、MLP(多层神经网络)等等。
     相关模块,基本上都是汇编级的高度优化,直接调用就可以。

目前国内、海外机器学习、人工智能方面的学者,没有几位重视这块。
     国外,可能是版权问题,毕竟,Halcon是售价高达数万欧元(不是人民币)的商业软件,而且主要用于自控、机器视觉等工业领域,而不是大学。
     国内,可能是对于Halcon的了解不够,halcon,虽然在自控领域一家独大(70%份额),本身非常低调,很少在行业外宣传自己,也许是国人的逆向工程、D版,把德国人,也吓坏了。

其实,图像处理的核心,图像识别、分类,都离不开机器学习、人工智能
     大家看看opencv的发展路线就可以清楚看到,从cv1.0的图像,到cv2.0、2.4的机器学习,以及目前cv3.0的GPU、cuda人工智能模块,AI在其中所占据的份额越来越大。

Halcon因为面向一线生产线,所以很多机器学习、人工智能,都是黑箱式的,无需编程,直接调用,例如内置的ocr模块,可以识别99%的标准工业字符:超市、海关、流水线、零配件
  不过,Halcon也提供了大量的机器学习模块,毕竟各种应用场合复杂,许多库,必须进行定制。

Halcon自带demo脚本:matching_multi_channel_yogurl.hdev
     是一个简单的机器学习、人工智能分类应用,也是个典型的应用场景
     效果还是蛮好的,大家可以看到,图2、图4,图像的角度不同,有旋转,Halcon能够轻轻松松识别。
     这个脚本,AI方面不算复杂,建模就是先拍摄几张产品的照片,直接匹配。
    通常,Halcon建模,需要进行200次(默认参数)迭代。

选这个脚本,其中一个原因,是因为前几天,有人在论坛询问,如何对企业生产线的产品(零食好像?)进行自动分类。

脚本80多行,很简单。

  1. * This example demonstrates shape based matching
  2. * with multi channel images
  3. *
  4. * Init display
  5. dev_update_off ()
  6. Mode := 'multi channel'
  7. ModelColor := 'green'
  8. CircleColor := 'white'
  9. Names := ['Pear Apple Hazelnut','Cherry Currant','Strawberry']
  10. read_image (Image, 'color/yogurt_model_01')
  11. get_image_size (Image, Width, Height)
  12. dev_close_window ()
  13. dev_open_window (, , Width, Height, 'black', WindowHandle)
  14. set_display_font (WindowHandle, , 'mono', 'true', 'false')
  15. *
  16. * Part : create shape models
  17. ModelIDs := []
  18. for Index := to by
  19. read_image (Image, 'color/yogurt_model_' + Index$'')
  20. dev_display (Image)
  21. *
  22. * Create ROI automatically
  23. access_channel (Image, Channel1, )
  24. fast_threshold (Channel1, Region, , , )
  25. fill_up (Region, RegionFillUp)
  26. opening_circle (RegionFillUp, RegionOpening, 170.5)
  27. gen_contour_region_xld (RegionOpening, Contours, 'border')
  28. fit_circle_contour_xld (Contours, 'geotukey', -, , , , , Row, Column, Radius, StartPhi, EndPhi, PointOrder)
  29. gen_circle (Circle, Row, Column, Radius / )
  30. reduce_domain (Image, Circle, ImageReduced)
  31. *
  32. * Create model
  33. create_shape_model (ImageReduced, , rad(), rad(), 'auto', 'auto', 'ignore_color_polarity', [,,], , ModelID)
  34. ModelIDs := [ModelIDs,ModelID]
  35. *
  36. * Display model
  37. dev_set_color (CircleColor)
  38. dev_set_draw ('margin')
  39. dev_set_line_width ()
  40. dev_display (Circle)
  41. get_shape_model_contours (Model1Contours, ModelID, )
  42. dev_set_color (ModelColor)
  43. dev_set_line_width ()
  44. dev_display_shape_matching_results (ModelIDs, ModelColor, Row, Column, 0.0, , , ModelID)
  45. disp_message (WindowHandle, 'Create shape model ' + Names[Index - ], 'window', , , 'black', 'true')
  46. disp_message (WindowHandle, 'Press \'Run\' to continue', 'window', , , 'black', 'true')
  47. stop ()
  48. endfor
  49. * Main loop: Find yogurt
  50. for Index := to by
  51. read_image (Image, 'color/yogurt_' + Index$'')
  52. * Preprocessing: Reduce search domain to speed up matching
  53. access_channel (Image, Channel1, )
  54. fast_threshold (Channel1, Region, , , )
  55. fill_up (Region, RegionFillUp)
  56. erosion_rectangle1 (RegionFillUp, RegionErosion, , )
  57. reduce_domain (Image, RegionErosion, ImageReduced)
  58. * Find yogurt
  59. find_shape_models (ImageReduced, ModelIDs, rad(), rad(), 0.80, , 0.5, 'least_squares', , 0.95, Row, Column, Angle, Score, Model)
  60. *
  61. * Display results
  62. dev_display (Image)
  63. gen_circle (Circle, Row, Column, Radius / )
  64. dev_set_color (CircleColor)
  65. dev_set_line_width ()
  66. dev_display (Circle)
  67. get_shape_model_contours (ModelContours, Model, )
  68. dev_set_color (ModelColor)
  69. dev_set_line_width ()
  70. dev_display_shape_matching_results (ModelIDs, ModelColor, Row, Column, Angle, , , Model)
  71. disp_message (WindowHandle, Names[find(ModelIDs,Model)] + ' found', 'window', , , 'black', 'true')
  72. disp_message (WindowHandle, 'Score ' + Score, 'window', , , 'black', 'true')
  73. if (Index < )
  74. disp_continue_message (WindowHandle, 'black', 'true')
  75. stop ()
  76. endif
  77. endfor
  78. *
  79. * Cleanup memory
  80. clear_shape_model (ModelIDs[])
  81. clear_shape_model (ModelIDs[])
  82. clear_shape_model (ModelIDs[])

【《zw版·Halcon-delphi系列原创教程》,网址,cnblogs.com/ziwang/】

《zw版·Halcon-delphi系列原创教程》 酸奶自动分类脚本(机器学习、人工智能)的更多相关文章

  1. 【《zw版·Halcon与delphi系列原创教程》 zw_halcon人脸识别

    [<zw版·Halcon与delphi系列原创教程>zw_halcon人脸识别 经常有用户问,halcon人脸识别方面的问题. 可能是cv在人脸识别.车牌识别方面的投入太多了. 其实,人脸 ...

  2. 【《zw版·Halcon与delphi系列原创教程》Halcon图层与常用绘图函数

    [<zw版·Halcon与delphi系列原创教程>Halcon图层与常用绘图函数 Halcon的绘图函数,与传统编程vb.c.delphi语言完全不同,     传统编程语言,甚至cad ...

  3. 《zw版Halcon与delphi系列原创教程》发布说明

    <zw版Halcon与delphi系列原创教程>发布说明 zw转载的<台湾nvp系列halcon-delphi教程>,虽然很多,不过基本上都是从cnc.数控角度的demo..  ...

  4. 《zw版·delphi与Halcon系列原创教程》THOperatorSetX版hello,zw

    <zw版·delphi与Halcon系列原创教程>THOperatorSetX版hello,zw 下面介绍v3版的hello,zw. Halcon两大核心控件,THImagex.THOpe ...

  5. 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版

    <zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...

  6. 《zw版·delphi与halcon系列原创教程》zw版_THImagex控件函数列表

    <zw版·delphi与halcon系列原创教程>zw版_THImagex控件函数列表 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就要7w多行,但核心控件就是两 ...

  7. 《zw版·ddelphi与halcon系列原创教程》Halcon的短板与delphi

    [<zw版·delphi与Halcon系列原创教程>Halcon的短板与delphi 看过<delphi与Halcon系列>blog的网友都知道,笔者对Halcon一直是非常推 ...

  8. 《zw版·delphi与halcon系列原创教程》hello,zw

    <zw版·delphi与halcon系列原创教程>hello,zw 按惯例,第一个程序是‘hello’ 毕竟,Halcon是专业的图像库,所以我们就不用纯文本版的,来一个专业版.Halco ...

  9. 《zw版·Halcon-delphi系列原创教程》 zw版-Halcon常用函数Top100中文速查手册

    <zw版·Halcon-delphi系列原创教程> zw版-Halcon常用函数Top100中文速查手册 Halcon函数库非常庞大,v11版有1900多个算子(函数). 这个Top版,对 ...

随机推荐

  1. Linux查看操作系统时间

    date命令的功能是显示和设置系统日期和时间. 该命令的一般格式为: date [选项] 显示时间格式(以+开头,后面接格式) date 设置时间格式 命令中各选项的含义分别为: -d datestr ...

  2. jq图片切换特效

    首先引入js,内容如下: (function($){$.fn.slides=function(option){option=$.extend({},$.fn.slides.option,option) ...

  3. asp.Net2.0中TextBox设置只读后后台获取不到值的解决方法

    http://www.cnblogs.com/yxyht/archive/2013/03/02/2939883.html   ASP.NET中TextBox控件设置ReadOnly="tru ...

  4. SubmitText 中配置lua 运行环境

    一 新建编译系统 二.使用新建的编译系统 三配置 { "cmd": ["lua", "$file"], "file_regex&q ...

  5. Lambda表达式公共拼接函数(原创)

    #region Lambda公共拼接函数 /// <summary> /// LambdaWhere(枚举) /// </summary> public enum Lambda ...

  6. MySql的join(连接)查询 (三表 left join 写法)

    1.内连接:将两个表中存在连结关系的字段符合连接条件的记录形成记录集 Select A.name,B.name from A inner join B on A.id=B.id和 Select A.n ...

  7. Android课程---手机尺寸相关的概念 +尺寸单位+关于颜色

    手机的尺寸: 屏幕对角线的长度,单位为英寸(2.54cm) 手机的分辨率: 屏幕能显示的像素的数量, 一般用在长方向上数量*宽方向上数量来表达 手机的像素密度: pixels per inch,也称P ...

  8. 【iCore3 双核心板】例程十八:USB_VCP实验——虚拟串口

    实验指导书及代码包下载: http://pan.baidu.com/s/1c1erqIc iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  9. Excel文件读写

    C#读写Excel的方式有好几种,具体参考文章: http://www.cnblogs.com/huipengkankan/archive/2011/07/28/2120407.html 昨天大致研究 ...

  10. xmlunit

    一个比较方便但也是有点坑的工具. 它能把<struct><int>3</int><boolean>false</boolean></s ...