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

《zw版·Halcon-delphi系列原创教程》

水果自动分类脚本(机器学习、人工智能)

前面介绍了超市,流水线,酸奶的自动分类算法,下面再介绍一个水果的自动分类算法。

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

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

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

目前国内、海外机器学习、人工智能方面的学者,没有几位重视这块。
     国外,可能是版权问题,毕竟,Halcon是售价高达数万欧元(不是人民币)的商业软件,而且主要用于自控、机器视觉等工业领域,而不是大学。
     国内,可能是对于Halcon的了解不够。
     其实,图像处理的核心,图像识别、分类,都离不开机器学习、人工智能
     大家看看opencv的发展路线就可以清楚看到,从cv1.0的图像,到cv1.0的机器学习,以及目前cv3.0的GPU、cuda人工智能模块,AI在其中所占据的份额越来越大。

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

这个脚本,AI方面不算复杂,建模就是先拍摄几张产品的照片,直接匹配。
      通常,Halcon建模,需要进行200次(默认参数)迭代。

脚本80多行,很简单。
    虽然这个脚本和前面的酸奶分类脚本,都很简单,其实,应用领域很广
    自动流水线、物流、智能仓库等,无论是元器件的自动识别、包裹自动分类,以及产品的QC等等,核心模块,就是这些代码、算法、

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

 1 * This example program shows how to apply a general GMM
 2 * classification to distinguish citrus fruits using the
 3 * features ‘area‘ and ‘circularity‘. Additionally, the
 4 * 2D feature space for the extracted fruits is visualized.
 5 *
 6 read_image (Image, ‘color/citrus_fruits_01‘)
 7 get_image_pointer1 (Image, Pointer, Type, Width, Height)
 8 dev_close_window ()
 9 dev_open_window (0, 0, Width, Height, ‘white‘, WindowHandle)
10 set_display_font (WindowHandle, 12, ‘courier‘, ‘true‘, ‘false‘)
11 dev_set_draw (‘margin‘)
12 dev_set_line_width (2)
13 dev_display (Image)
14 dev_update_window (‘off‘)
15 dev_update_pc (‘off‘)
16 dev_update_var (‘off‘)
17 *
18 FeaturesArea := []
19 FeaturesCircularity := []
20 ClassName := [‘orange‘,‘lemon‘]
21 *
22 * Create a GMM classifier
23 create_class_gmm (2, 2, 1, ‘spherical‘, ‘normalization‘, 10, 42, GMMHandle)
24 *
25 * Add training samples
26 for i := 1 to 4 by 1
27 read_image (Image, ‘color/citrus_fruits_‘ + i$‘.2d‘)
28 dev_display (Image)
29 * ‘Add Samples‘
30 get_regions (Image, SelectedRegions)
31 dev_display (SelectedRegions)
32 count_obj (SelectedRegions, NumberObjects)
33 for j := 1 to NumberObjects by 1
34 select_obj (SelectedRegions, ObjectSelected, j)
35 get_features (ObjectSelected, WindowHandle, Circularity, Area, RowRegionCenter, ColumnRegionCenter)
36 FeaturesArea := [FeaturesArea,Area]
37 FeaturesCircularity := [FeaturesCircularity,Circularity]
38 FeatureVector := real([Circularity,Area])
39 if (i <= 2)
40 add_sample_class_gmm (GMMHandle, FeatureVector, 0, 0)
41 disp_message (WindowHandle, ‘Add to Class:‘ + ClassName[0], ‘window‘, RowRegionCenter, ColumnRegionCenter - 100, ‘black‘, ‘true‘)
42 else
43 add_sample_class_gmm (GMMHandle, FeatureVector, 1, 0)
44 disp_message (WindowHandle, ‘Add to Class:‘ + ClassName[1], ‘window‘, RowRegionCenter, ColumnRegionCenter - 100, ‘black‘, ‘true‘)
45 endif
46 endfor
47 disp_continue_message (WindowHandle, ‘black‘, ‘true‘)
48 stop ()
49 endfor
50 dev_clear_window ()
51 *
52 * Visualize the feature space
53 visualize_2D_feature_space (Cross, Height, Width, WindowHandle, FeaturesArea[0:5], FeaturesCircularity[0:5], ‘dim gray‘, 18)
54 * ‘oranges‘, 40, 440
55 visualize_2D_feature_space (Cross, Height, Width, WindowHandle, FeaturesArea[6:11], FeaturesCircularity[6:11], ‘light gray‘, 18)
56 * ‘lemons‘, 70, 440
57 disp_continue_message (WindowHandle, ‘black‘, ‘true‘)
58 stop ()
59 *
60 * Train the classifier
61 train_class_gmm (GMMHandle, 100, 0.001, ‘training‘, 0.0001, Centers, Iter)
62 *
63 * Classify
64 for i := 1 to 15 by 1
65 read_image (Image, ‘color/citrus_fruits_‘ + i$‘.2d‘)
66 dev_display (Image)
67 * ‘Classify Image‘, 10, 10
68 get_regions (Image, SelectedRegions)
69 dev_display (SelectedRegions)
70 count_obj (SelectedRegions, NumberObjects)
71 for j := 1 to NumberObjects by 1
72 select_obj (SelectedRegions, ObjectSelected, j)
73 get_features (ObjectSelected, WindowHandle, Circularity, Area, RowRegionCenter, ColumnRegionCenter)
74 FeaturesArea := [FeaturesArea,Area]
75 FeaturesCircularity := [FeaturesCircularity,Circularity]
76 FeatureVector := real([Circularity,Area])
77 classify_class_gmm (GMMHandle, FeatureVector, 1, ClassID, ClassProb, Density, KSigmaProb)
78 disp_message (WindowHandle, ‘Class: ‘ + ClassName[ClassID], ‘window‘, RowRegionCenter, ColumnRegionCenter - 100, ‘black‘, ‘true‘)
79 disp_message (WindowHandle, ‘KSigmaProb: ‘ + KSigmaProb, ‘window‘, RowRegionCenter + 30, ColumnRegionCenter - 100, ‘black‘, ‘true‘)
80 endfor
81 if (i != 15)
82 disp_continue_message (WindowHandle, ‘black‘, ‘true‘)
83 endif
84 stop ()
85 endfor
86 *
87 * Clear the classifier from memory
88 clear_class_gmm (GMMHandle)

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

时间: 2024-10-14 04:18:58

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

【《zw版&#183;Halcon与delphi系列原创教程》 zw_halcon人脸识别

[<zw版·Halcon与delphi系列原创教程> zw_halcon人脸识别 经常有用户问,halcon人脸识别方面的问题. 可能是cv在人脸识别.车牌识别方面的投入太多了. 其实,人脸识别.车牌识别,只是图像处理,机器视觉一个很小的领域,对于halcon而言,非常简单. 人脸识别.车牌识别,ocr.汉字识别原理.算法都差不多,自己建库就可以了. halcon与cv不同,面对的是工业(超市)流水线,建库基本是全自动的,扫描一下,和二维码差不多,就自动生成了相关的模型库. 非常简单,halc

《zw版&#183;ddelphi与halcon系列原创教程》Halcon的短板与delphi

[<zw版·delphi与Halcon系列原创教程>Halcon的短板与delphi 看过<delphi与Halcon系列>blog的网友都知道,笔者对Halcon一直是非常推崇的,简直是天下第一,无所不能.     的确,Halcon是目前蓝星上最强的图像库,也许某些国家军用卫星的图像库,精度会高一点,这个只能猜测.     Halcon毕竟只是图像库而已,作为开发平台,与专业的delphi.vs相比,还是有很大差距的.      有经验的用户,特别是从事二次开发的外包团队,采用

《zw版&#183;delphi与Halcon系列原创教程》THOperatorSetX版hello,zw

<zw版·delphi与Halcon系列原创教程>THOperatorSetX版hello,zw 下面在介绍v3版的hello,zw. Halcon两大核心控件,THImagex.THOperatorSetX控件. THImagex控件效率极高,可以视为内部数据交换模式,但与标准的Halcon函数有所差异,建议有经验的用户使用. THOperatorSetX控件,采用类似仿真的模式,向Halcon模块提供脚本指令,由Halcon系统处理后,生成结果数据,再回传给delphi.c等开发系统.指令

《zw版&#183;delphi与halcon系列原创教程》zw版_THImagex控件函数列表

<zw版·delphi与halcon系列原创教程>zw版_THImagex控件函数列表 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就要7w多行,但核心控件就是两个: THImagex,图像数据控件,v11版,包括488个函数和子程序 THOperatorSetX,操作主接口控件,v11版,包括1929个子程序 以上两大核心控件,已经删除个别delphi内部属性函数,不影响日常使用. 其他控件,基本上,都是为配合两个控件,提供数据类型支持.辅助功能.已经一些特殊应用(

《zw版&#183;Halcon-delphi系列原创教程》 zw版-Halcon常用函数Top100中文速查手册

<zw版·Halcon-delphi系列原创教程> zw版-Halcon常用函数Top100中文速查手册 Halcon函数库非常庞大,v11版有1900多个算子(函数). 这个Top版,对最常用的函数,做了中文说明,目前约250条,以后会逐步优化.增减. 目标是,类似常用英文单词500一样,做成<Halcon常用函数300条>.<halcon常用函数500条>等版本,方便大 家学习. 考虑到通用性,函数采用的是Halcon手册格式,没有转成delphi版,请大家注意.

《zw版&#183;Halcon-delphi系列原创教程》 Halcon分类函数017&#183;point点函数

<zw版·Halcon-delphi系列原创教程> Halcon分类函数017·point点函数 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“procedure” :: 用大写字母“X”,替换:“IHUntypedObjectX” :: 省略了字符:“const”.“OleVariant” [示例] 说明 函数: procedure AddNoiseWhiteContourXld( const Contours: IHUntypedObjectX;

《zw版&#183;Halcon-delphi系列原创教程》 Halcon分类函数007, match,图像匹配

<zw版·Halcon-delphi系列原创教程> Halcon分类函数007, match,图像匹配 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“procedure” :: 用大写字母“X”,替换:“IHUntypedObjectX” :: 省略了字符:“const”.“OleVariant” [示例] 说明 函数: procedure AddNoiseWhiteContourXld( const Contours: IHUntypedObject

《zw版&#183;Halcon-delphi系列原创教程》 Halcon分类函数006, image,影像处理(像素图)

<zw版·Halcon-delphi系列原创教程> Halcon分类函数006, image,影像处理(像素图) 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“procedure” :: 用大写字母“X”,替换:“IHUntypedObjectX” :: 省略了字符:“const”.“OleVariant” [示例] 说明 函数: procedure AddNoiseWhiteContourXld( const Contours: IHUntypedO

《zw版&#183;Halcon-delphi系列原创教程》 Halcon分类函数005&#183;graphics-obj,基本绘图单元,包括线段、矩形、椭圆、圆形

<zw版·Halcon-delphi系列原创教程> Halcon分类函数005·graphics-obj,基本绘图单元,包括线段.矩形.椭圆.圆形 graphics-obj,基本绘图单元,包括线段.矩形.椭圆.圆形 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“procedure” :: 用大写字母“X”,替换:“IHUntypedObjectX” :: 省略了字符:“const”.“OleVariant” [示例] 说明 函数: procedure