《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等等,核心模块,就是这些代码、算法、

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

 * This example program shows how to apply a general GMM
* classification to distinguish citrus fruits using the
* features 'area' and 'circularity'. Additionally, the
* 2D feature space for the extracted fruits is visualized.
*
read_image (Image, 'color/citrus_fruits_01')
get_image_pointer1 (Image, Pointer, Type, Width, Height)
dev_close_window ()
dev_open_window (, , Width, Height, 'white', WindowHandle)
set_display_font (WindowHandle, , 'courier', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width ()
dev_display (Image)
dev_update_window ('off')
dev_update_pc ('off')
dev_update_var ('off')
*
FeaturesArea := []
FeaturesCircularity := []
ClassName := ['orange','lemon']
*
* Create a GMM classifier
create_class_gmm (, , , 'spherical', 'normalization', , , GMMHandle)
*
* Add training samples
for i := to by
read_image (Image, 'color/citrus_fruits_' + i$'.2d')
dev_display (Image)
* 'Add Samples'
get_regions (Image, SelectedRegions)
dev_display (SelectedRegions)
count_obj (SelectedRegions, NumberObjects)
for j := to NumberObjects by
select_obj (SelectedRegions, ObjectSelected, j)
get_features (ObjectSelected, WindowHandle, Circularity, Area, RowRegionCenter, ColumnRegionCenter)
FeaturesArea := [FeaturesArea,Area]
FeaturesCircularity := [FeaturesCircularity,Circularity]
FeatureVector := real([Circularity,Area])
if (i <= )
add_sample_class_gmm (GMMHandle, FeatureVector, , )
disp_message (WindowHandle, 'Add to Class:' + ClassName[], 'window', RowRegionCenter, ColumnRegionCenter - , 'black', 'true')
else
add_sample_class_gmm (GMMHandle, FeatureVector, , )
disp_message (WindowHandle, 'Add to Class:' + ClassName[], 'window', RowRegionCenter, ColumnRegionCenter - , 'black', 'true')
endif
endfor
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
endfor
dev_clear_window ()
*
* Visualize the feature space
visualize_2D_feature_space (Cross, Height, Width, WindowHandle, FeaturesArea[:], FeaturesCircularity[:], 'dim gray', )
* 'oranges', ,
visualize_2D_feature_space (Cross, Height, Width, WindowHandle, FeaturesArea[:], FeaturesCircularity[:], 'light gray', )
* 'lemons', ,
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*
* Train the classifier
train_class_gmm (GMMHandle, , 0.001, 'training', 0.0001, Centers, Iter)
*
* Classify
for i := to by
read_image (Image, 'color/citrus_fruits_' + i$'.2d')
dev_display (Image)
* 'Classify Image', ,
get_regions (Image, SelectedRegions)
dev_display (SelectedRegions)
count_obj (SelectedRegions, NumberObjects)
for j := to NumberObjects by
select_obj (SelectedRegions, ObjectSelected, j)
get_features (ObjectSelected, WindowHandle, Circularity, Area, RowRegionCenter, ColumnRegionCenter)
FeaturesArea := [FeaturesArea,Area]
FeaturesCircularity := [FeaturesCircularity,Circularity]
FeatureVector := real([Circularity,Area])
classify_class_gmm (GMMHandle, FeatureVector, , ClassID, ClassProb, Density, KSigmaProb)
disp_message (WindowHandle, 'Class: ' + ClassName[ClassID], 'window', RowRegionCenter, ColumnRegionCenter - , 'black', 'true')
disp_message (WindowHandle, 'KSigmaProb: ' + KSigmaProb, 'window', RowRegionCenter + , ColumnRegionCenter - , 'black', 'true')
endfor
if (i != )
disp_continue_message (WindowHandle, 'black', 'true')
endif
stop ()
endfor
*
* Clear the classifier from memory
clear_class_gmm (GMMHandle)

【《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版,对 ...

  10. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数·简明中文手册 总览

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数·简明中文手册 总览 Halcon函数库非常庞大,光HALCONXLib_TLB.pas文件,源码就要7w多行,但核 ...

随机推荐

  1. 常用jQuery代码03

    1.查看浏览器信息 navigator.userAgent 检索浏览器信息包括哪些字符 例如: if (navigator.userAgent.toLowerCase().indexOf(" ...

  2. margin负值

    一列li并排的时候,需要一些间距的时候,又不需要最右边或者最左边有间距. <!DOCTYPE html> <html lang="zh-CN"> <h ...

  3. c#中的linq一

    c#中的linq 测试数据: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  4. offset/client/scroll一些总结

    offset/client/scroll一些总结 1.offset 首先offset共有五个值 1.offsetParent 2.offsetTop 3.offsetLeft 4.offsetWidt ...

  5. 实践JAVA wait(), notify(),sleep方法--一道多线程的面试题

    建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC. 这个问题用Object的wait(),notify()就可以很方便的解决. publ ...

  6. EXP的flashback_scn和flashback_time

    数据库设置 a. 设置UNDO_RETENTION的初始值(在短时间内)代表你想要查过去多远的时间. b. 设置初始化参数UNDO_MANAGEMENT=AUTO. c. 建立一个还原点空间,要有足够 ...

  7. Power-BI 仪表盘实现动态预警

    BI系统中仪表盘“序列”中的“预警”属性可以手工填入固定的值,也可从数据集里取值设定预警范围 ,以实现动态预警.其中的“范围”属性手工输入固定值应该为百分比(0-1),而在下拉选择绑定列为值是为数值. ...

  8. 第六篇 Integration Services:初级工作流管理

    本篇文章是Integration Services系列的第六篇,详细内容请参考原文. 简介在前几篇文章中,我们关注使用增量加载方式加载数据.在本篇文章,我们将关注使用优先约束管理SSIS控制流中的工作 ...

  9. LINQ使用

    基于扩展方法和lamda表达式 1. 查询序列中满足一定条件 Where扩展方法 public interface ISlotPortBinding { byte SlotNumber { get; ...

  10. C#和VC++字符集和编码

    C# char 关键字用于声明 .NET framework 使用 Unicode 字符表示 System.Char 结构的实例. Char 对象的值是 16 位数字 (序号值.)将字符表示为 UTF ...