Halcon例程(基于GMM模型的分类)详解 —— classify_citrus_fruits.hdev

一、例程简介

该例程比较有代表性,属于Halcon里的分类方法之一,直接调用Halcon封装好的GMM分类器(高斯混合模型)对橘子和柠檬进行分类。GMM属于概率分类方法,属于P(Y|X),通过对样本的概率密度分布进行估计,然后对模型进行加权求和,并通过投影,最后选取概率最大的类所为判决结果,这种分类方法只在不同检测类之间有明显的区别(在两类物体圆度和面积有较大区别)的情况下适用。
具体原理可以详见有位大佬的解释说明,链接如下:
[原理]https://blog.csdn.net/weixin_42555080
后面我也会针对机器学习的相关方法进行分享,求点赞评论哦。

二、代码详解(对每一步进行注释)

第一篇注释下,后面再写就只注释关键部分了。

*读取图片
read_image (Image, 'color/citrus_fruits_01')
*返回输入图像对象Image的第一个通道的Pointer(指示器)。另外,这个算子也返回图像类型和图像的大小(width和height)。
get_image_pointer1 (Image, Pointer, Type, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'white', WindowHandle)
*用来设置当前窗口的字体属性,参数意思为字体大小为12,字体类型为“Courier New字体”,粗体,不倾斜。
set_display_font (WindowHandle, 12, 'mono', 'true', 'false')
* 定义region的填充模式, 如果参数DrawMode设置为'fill',region显示为填充,如果设置为'margin',则只显示轮廓。
dev_set_draw ('margin')
*设置线宽
dev_set_line_width (2)
*显示图片
dev_display (Image)
*其实以下几句可以写为一句dev_update_off ()
dev_update_window ('off')
dev_update_pc ('off')
dev_update_var ('off')
* 为特征量(区域的面积,圆度,和分类名)赋值
FeaturesArea := []
FeaturesCircularity := []
ClassName := ['orange','lemon']* 创建GMM分类器(特征数量,样本分类个数,类中心的个数,协方差矩阵的形式,预处理的形式,转换特征数,随机种子初始化GMM,GMM句柄)
create_class_gmm (2, 2, 1, 'spherical', 'normalization', 10, 42, GMMHandle)
* 
* 添加训练样本
for I := 1 to 4 by 1read_image (Image, 'color/citrus_fruits_' + I$'.2d')dev_display (Image)* 自定义函数,将图片进行预处理,得到区域特征。get_regions (Image, SelectedRegions)*将彩色图片分离为三个单通道图片(decompose3 (Image, ImageRed, ImageGreen, ImageBlue)*用于区域对象的颜色设为白dev_set_color ('white')*对单通道图片进行阈值处理,得到灰度值在50-255区间的图片threshold (ImageRed, Region, 50, 255)*将区域进行填充fill_up (Region, RegionFillUp)*用来计算输入区域中的所有连通域connection (RegionFillUp, ConnectedRegions)*根据形状特征(这里是面积)对区域进行筛选,对于大于50小于999999的形状保留。select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 50, 999999)return ())dev_display (SelectedRegions)*计算区域数量count_obj (SelectedRegions, NumberObjects)*对三个目标进行遍历,获取特征for J := 1 to NumberObjects by 1*从一个对象元组中选择一个区域,区域的排序索引应该是根据上面计算连通域的时候完成的。select_obj (SelectedRegions, ObjectSelected, J)*自定义函数,分别对圆度和面积进行计算,并返回区域中心点的坐标值。get_features (ObjectSelected, WindowHandle, Circularity, Area, RowRegionCenter, ColumnRegionCenter)(circularity (ObjectSelected, Circularity)area_center (ObjectSelected, Area, Row, Column)dev_set_color ('white')return ())* 对变量赋值FeaturesArea := [FeaturesArea,Area]FeaturesCircularity := [FeaturesCircularity,Circularity]*将元组的数值转换为浮点型FeatureVector := real([Circularity,Area])*该方法已提前将样本分为两类,每类数量已提前设定好,橘子和柠檬各两张图片if (I <= 2)*将训练样本添加到训练数据中(GMM句柄,特征向量,类别ID为0,不添加高斯噪声)add_sample_class_gmm (GMMHandle, FeatureVector, 0, 0)*此过程在图形窗口“窗口句柄”中的位置(Row,Column)显示文本。(文本显示Add to Class加类名,行坐标,列坐标,黑色,box参数为ture,表示文本显示在橙色框中)disp_message (WindowHandle, 'Add to Class:' + ClassName[0], 'window', RowRegionCenter, ColumnRegionCenter - 100, 'black', 'true')else*ID为1add_sample_class_gmm (GMMHandle, FeatureVector, 1, 0)disp_message (WindowHandle, 'Add to Class:' + ClassName[1], 'window', RowRegionCenter, ColumnRegionCenter - 100, 'black', 'true')endifendfor*显示 'Press Run (F5) to continue' 在屏幕的右下角disp_continue_message (WindowHandle, 'black', 'true')stop ()
endfor
dev_clear_window ()
* 
* 自定义函数,构建可视化空间,可以显示圆度和面积的二维坐标系,里面内容有点复杂,包括画坐标系,显示特征值两部分,有兴趣的同学可以仔细看看里面的代码来复现一遍,这里就不细述。两个特征变量里面分别有12个值,对应每个对象的特征值,将其放到坐标系中,橘子为深灰,柠檬为浅灰色。
visualize_2D_feature_space (Cross, Height, Width, WindowHandle, FeaturesArea[0:5], FeaturesCircularity[0:5], 'dim gray', 18)
* 'oranges', 40, 440
visualize_2D_feature_space (Cross, Height, Width, WindowHandle, FeaturesArea[6:11], FeaturesCircularity[6:11], 'light gray', 18)
* 'lemons', 70, 440
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* 训练分类器(句柄,最大迭代次数,阈值,计算方法,防止协方差矩阵异常的正则化值,类中心数量,每个类的迭代次数)这里就是halcon的便利之处,直接将大量的代码封装,我们只需要更改几个关键参数即可,但也要对GMM训练算法有所了解,后面会专门写一篇GMM算法的文章。
train_class_gmm (GMMHandle, 100, 0.001, 'training', 0.0001, Centers, Iter)
* 
* 分类,下面的基本就是上面提取特征值的过程,没啥特殊的,就不每行注释了。
for I := 1 to 15 by 1read_image (Image, 'color/citrus_fruits_' + I$'.2d')dev_display (Image)* 'Classify Image', 10, 10get_regions (Image, SelectedRegions)dev_display (SelectedRegions)count_obj (SelectedRegions, NumberObjects)for J := 1 to NumberObjects by 1select_obj (SelectedRegions, ObjectSelected, J)get_features (ObjectSelected, WindowHandle, Circularity, Area, RowRegionCenter, ColumnRegionCenter)FeaturesArea := [FeaturesArea,Area]FeaturesCircularity := [FeaturesCircularity,Circularity]FeatureVector := real([Circularity,Area])*应用上面训练的模型对测试数据的特征进行分类(句柄,特征向量,最佳类数(我的理解是指返回一种结果),分类结果(橘子是0,柠檬是1),后验概率,概率密度,归一化概率(通过这个概率进行判断))classify_class_gmm (GMMHandle, FeatureVector, 1, ClassID, ClassProb, Density, KSigmaProb)*显示信息disp_message (WindowHandle, 'Class: ' + ClassName[ClassID], 'window', RowRegionCenter, ColumnRegionCenter - 100, 'black', 'true')disp_message (WindowHandle, 'KSigmaProb: ' + KSigmaProb, 'window', RowRegionCenter + 30, ColumnRegionCenter - 100, 'black', 'true')endfor*如果测试图片数量不等于15,显示暂停。if (I != 15)disp_continue_message (WindowHandle, 'black', 'true')endifstop ()
endfor
* 清除分类器内存
clear_class_gmm (GMMHandle)

三、总结

Halcon进行GMM分类的全过程包括以下几部分:

  1. 预处理,包括阈值处理,二值化,提取区域或者轮廓特征等;
  2. 提取样本特征;可以是圆度,面积,也可以是颜色,轮廓,主要看那种特征适合分类。
  3. 用add_sample_class_gmm将样本特征添加到分类器,对特征进行训练,得到最终GMM模型。
  4. 提取测试样本的特征。
  5. 应用分类器对测试数据进行分类,这里Halcon把代码封装了,大家可以去看看C++或python版本的分类代码,会对这个分类方法有更深的了解,至于先验后验概率密度之类的东西,大家自己查下吧,哈哈,要慢慢理解。
    第一次写博客,希望将自己的学习过程记录下来,也分享给大家,希望共同进步。必须强调一点,一🗡三连。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正则表达式匹配不包含特定字符串解决匹配溢出问题

匹配溢出问题在正则表达式当中算是比较常见的问题&#xff0c;它常常导致我们匹配结果莫名其妙的出错&#xff0c;本文专门为你讲解如何通过匹配不包含特定字符串的方法来解决这类问题。 那么&#xff0c;什么是匹配溢出呢&#xff1f; 下面我们来看个例子&#xff1a; 源文本&…

numpy——mgrid

x1,x2 np.mgrid(x1min:x1max:num1j,x2min:x2max:num2j)x1返回的是x1min到x1max间均匀分成num1个数&#xff0c;进行横向扩展为方阵 x2返回的是x2min到x2max间均匀分成num2个数&#xff0c;进行纵向扩展为方阵 Examples -------- >>> np.mgrid[0:5,0:5] array([[[0,…

Halcon例程(基于3D形状匹配识别方法)详解 —— create_shape_model_3d_lowest_model_level.hdev

一、例程简介 最近在研究3D识别方面的东西&#xff0c;查了不少资料&#xff0c;发现halcon里有不少关于三维物体识别的例程&#xff0c;这里对其中一个做出详解。该例程是基于三维匹配方法的&#xff0c;因为有三维模型SM3&#xff0c;所以不需要自己创建&#xff1b;另因为例…

15.瀑布流、测量

排行界面TopProtocol &#xff1a;json数据就是写字符串&#xff0c;所以不需要写bean对象public class TopProtocol extends BaseProtocol<List<String>> { Override public List<String> paserJson(String json) { List<String> datasnew ArrayList&…

linear-gradient线性渐变

background:linear-gradient(180deg, sliver 20%, skyblue 80%, gray 100%);180deg 是线性渐变的角度,水平方向;如果是90deg,则是垂直方向. silver 20% 是最上面的颜色和该颜色所在的位置,可以为负值,,如 linear-gradient(180deg, silver -7%, pink 80%, skyblue 127%);的效果是…

numpy——stack

np.stack(array,axis,outNone)&#xff0c;函数原型。 其中最重要是的这个axis怎么理解的。 举例说明&#xff1a;arrays [np.random.randn(3, 4) for _ in range(10)] 会生成一个 10 *( 3 * 4 )的矩阵列表。十个矩阵&#xff0c;每个矩阵是(3 * 4)大小。 首先说明一下axis的映…

C# —— 简单工厂设计模式详述

一、基本概念 众所周知&#xff0c;C#是一种面向对象的语言&#xff0c;而其中封装&#xff0c;继承&#xff0c;多态是面向对象的三大重要特征&#xff0c;简单工厂的设计模式则可以完全体现这些特征。要彻底理解这个模式&#xff0c;必须要先将封装&#xff08;访问修饰符的…

【计算机视觉】计算机视觉、模式识别、机器学习常用牛人主页链接

计算机视觉、模式识别、机器学习常用牛人主页链接 牛人主页&#xff08;主页有很多论文代码&#xff09; Serge Belongie at UC San DiegoAntonio Torralba at MITAlexei Ffros at CMUCe Liu at Microsoft Research New EnglandVittorio Ferrari at Univ.of EdinburghKristen G…

C# 中的 ConfigurationManager类引用方法

c#添加了Configuration;后&#xff0c;竟然找不到 ConfigurationManager 这个类&#xff0c;后来才发现&#xff1a;虽然引用了using System.Configuration;这个包&#xff0c;但是还是不行的。 后来终于找到一个解决方法&#xff0c;就是在解决方案资源管理器里找到类文件选择…

机器学习——支持向量机SVM之python实现简单实例一(含数据预处理、交叉验证、参数优化等)

目录 一、SVM理论 二、numpy的相关函数介绍 三、python实现之准备 1、数据集的下载

工业相机常用类型详述

一、工业相机定义 工业相机是应用于工业领域、安防和交通等对相机要求较高领域的摄像机&#xff0c;功能就是将光信号转变成有序的电信号&#xff0c;此信号经过模数转换为数字信号&#xff0c;然后传递给图像处理器。与一般的家用相机相比&#xff0c;其具有更高的稳定性能&a…

机器学习——SVM之python实现数据样本标准化和归一化

目录 一、标准化和归一化的目的 1、标准化 2、归一化 二、标准化和归一化常用的理论公式 1、归一化 2、标准化 三、python实现SVM样本数据标准化和归一化 1、标准化 2、归一化 本文源代码&#xff1a;《机器学习——支持向量机SVM之python实现简单实例一》 一、标准化…

[黑群晖经典教程] 一步一步建立自己的黑群晖

【申明&#xff1a;本文并非本人所作&#xff0c;为内部网络中一位大神所写&#xff0c;个人觉得写得很好&#xff0c;遂原文搬了过来&#xff0c;如有侵犯原作者的权利&#xff0c;请及时与我联系】 PS:有好几个兄弟觉得我擅自转发&#xff0c;不是很妥。解释一下&#xff1a;…

Java为什么能跨平台运行

因为java程序编译之后的代码不是能被硬件系统直接运行的代码&#xff0c;而是一种“中间码”--字节码。不同的硬件平台上装有不同的java虚拟机&#xff08;JVM&#xff09;&#xff0c;由JVM来把字节码再翻译成所对应的硬件平台能够执行的代码&#xff0c;因此java可以跨平台运…

C++和Opencv4.5 实现全景图像拼接

前言 最近刚下了最新版的opencv4.5&#xff0c;急不可待的试下操作&#xff0c;就用了opencv自带的Stitcher类拼接下图像&#xff0c;结果傻眼了&#xff0c;程序显示Stitcher没有createDefault成员&#xff0c;看了好久&#xff0c;终于找到了解决方法。 Stitcher原理 Stit…

机器学习——python实现SVM模型w,b的查看

基于源代码&#xff1a;《机器学习——支持向量机SVM之python实现简单实例一》进行讲解 1、线性模型 这里以二特征三类&#xff0c;一对多策略为案例 kernel “linear”&#xff1a;线性核&#xff0c;参数有w&#xff0c;b 线性模型的决策边界是&#xff1a;w0iTx0i w1i…

Codeforces-712C-Memory and De-Evolution

转载于:https://www.cnblogs.com/GrowingJlx/p/6642764.html

移动端输入框弹出键盘控制

在移动端&#xff0c;我们公司通过输入框主要收集用户的姓名和电话&#xff0c;以下是对输入框获取焦点时&#xff0c;控制弹出键盘的样式来增强用户体验。 输入姓名 我们的用户都是中国人&#xff0c;输入用户名为中文&#xff0c;所以弹出键盘是输入中文状态即可&#xff0c;…

Opencv4.5-C++ 摄像头画面镜像显示及文件保存

前言 想试下新买电脑的摄像头好用不&#xff0c;就写了个摄像头调用程序&#xff0c;实现了镜像和图片截取保存。 代码 #include <iostream> #include <opencv2/stitching.hpp> #include <opencv2\opencv.hpp> #include <opencv2/highgui/highgui.h…

机器学习之支持向量机SVM之python实现ROC曲线绘制(二分类和多分类)

目录 一、ROC曲线 二、TP、FP、TN、FN 三、 python绘制ROC曲线(二分类) 1、思路 2、关键代码