《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. java用spring实现文件下载

    今天是我第一博客文章,希望写出来的东西能让大家看明白,欢迎大家给我留言. html页面: <a href="#" onclick="downLoad()" ...

  2. jQuery控制DOM对象

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  3. Java学习-016-CSV 文件读取实例源代码

    上文(CSV文件写入)讲述了日常自动化测试过程中将测试数据写入 CSV 文件的源码,此文主要讲述如何从 CSV 文件获取测试过程中所需的参数化数据.敬请各位小主参阅,若有不足之处,敬请大神指正,不胜感 ...

  4. C++经典编程题#1:含k个3的数

    总时间限制:  1000ms 内存限制:  65536kB 描述 输入两个正整数 m 和 k,其中1 < m < 100000,1 < k < 5 ,判断 m 能否被19整除, ...

  5. http://www.cnblogs.com/zhaoyang/archive/2012/01/07/2315436.html

    http://www.cnblogs.com/zhaoyang/archive/2012/01/07/2315436.html

  6. 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化

    高性能Linux服务器 第10章    基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...

  7. Java 语句总结

    一.替代if语句x = a ? b:c; 等价:if (a){ x=b;}else{x=c;}二.页面展示二维数组 <s:iterator var="rt" value=&q ...

  8. Apache kafka原理与特性(0.8V)

    前言: kafka是一个轻量级的/分布式的/具备replication能力的日志采集组件,通常被集成到应用系统中,收集"用户行为日志"等,并可以使用各种消费终端(consumer) ...

  9. iPhone批量删除照片/视频最好用的方法

    iPhone批量删除照片/视频最好用的方法 经过大量的搜索和不懈的尝试,今天终于找到了批量删除iPhone照片最好用的方法, 于是决定写一篇博客为更多的果粉们造福! 1. 通过USB将iPhone手机 ...

  10. Using Amazon API Gateway with microservices deployed on Amazon ECS

    One convenient way to run microservices is to deploy them as Docker containers. Docker containers ar ...