EMGU(3.xx)中的机器学习算法之:SVM算法

c# + Emgu.CV学习(一):基本图像处理 目录一、图形处理1、创建图像2、图像的读取、保存、展示3、绘制文本和绘制图形3、颜色提取4、灰度图片5、二值化(先将图片转化为灰度图像)6、图像差7、图像合成二、加载图像 一、图形处理 1、创建图像 Mat image = new Mat(); 2、图像的读取、保存、展示 1.1、图像读取(路径) string path=@"E:\\0.jpg"; //图片路径 Mat imageRead = CvInvoke.Imread(Path); //读取图片 1.2、图像读取(图片) Mat i 阅读详情

前言

EMGU官方文档中有几种机器学习的案例,但是由于EMGU算法跟随OpenCV算法在升级,官方文档中SVM (Support Vector Machine) in CSharp描述的EM算法中多个方法已经重写(弃用),使用较高版本的EMGU并不能复现例程。本文参考OpenCv中的SVM算法,修改了部分源码并测试通过。

问题解决

复现过程有两个关键问题:

1、异常:‘Integer division by zero’

这个问题困扰了很久,直到发现这篇文章给出了答案Emgucv 3.* 下的SVM示例,非常简答,把例程中的分类矩阵trainClasses的数据类型由float改为int即可。但是作者还有个关键问题没弄明白,什么是支持向量,这篇文章给了很好的解释SVM通俗详解。所以Emgucv 3.* 下的SVM示例文中获取的支持向量是不正确的,如下:

// changed the GetSupportVectors()
                Mat supvec = model.GetSupportVectors();
                int c = supvec.Height;
 
                for (int i = 0; i < c; i++)
                {
                    // The way the data is received changed as well 
                    byte[] b = supvec.GetData(i);
                    float[] v = new float[] { (float)b[0], (float)b[1] };
 
                    PointF p1 = new PointF(v[0], v[1]);
                    img.Draw(new CircleF(p1, 4), new Bgr(128, 128, 128), 2);
                }

————————————————
版权声明:本文为优快云博主「马超514」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_26996385/article/details/79418921

GetSupportVectors()方法获取的是支持向量,并不是支持向量的支撑点,而且supvec.GetData(i)获取的是一个byte数组,作者把字节数组的前两位作为点也没什么意义,所以在结果展示上并未圈出在样本点集中作为支撑的点,下图分别是不正确的支撑点和官方例程中的支撑点展示:
未识别真正的支撑点官方例程中圈出的支撑点
由此引出第二个问题

2、如何获取支持向量的点

本文通过把训练的SVM结果保存到本地,发现了xml数据中包含这些点集数据和GetSupportVectors()方法获取的支持向量。

<sv_total>3</sv_total>
  <support_vectors>
    <_>
      -4.26625609e-02 -4.20124875e-03</_>
    <_>
      -2.49704085e-02 3.23080271e-02</_>
    <_>
      1.82409845e-02 6.01602904e-02</_>
  </support_vectors>
  <uncompressed_sv_total>7</uncompressed_sv_total>
  <uncompressed_support_vectors>
    <_>
      2.13789581e+02 3.70247894e+02</_>
    <_>
      1.92192932e+02 2.29739059e+02</_>
    <_>
      2.65889404e+02 3.17239105e+02</_>
    <_>
      2.58218262e+02 3.95134766e+02</_>
    <_>
      5.11033264e+02 2.53483795e+02</_>
    <_>
      3.28194794e+02 2.72949036e+02</_>
    <_>
      1.15855988e+02 1.08835411e+02</_>
  </uncompressed_support_vectors>

测试环境

  • EMGU版本:3.4.1
  • .NetFrameWork:4.7.1

正文

using Emgu.CV;
using Emgu.CV.ML;
using Emgu.CV.Structure;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;

namespace SVM__Support_Vector_Machine_
{
    internal class Program
    {
        static void Main(string[] args)
        {
            SVMBase();
        }
        private static void SVMBase()
        {
            int trainSampleCount = 150;
            int sigma = 60;

            #region Generate the training data and classes

            Matrix<float> trainData = new Matrix<float>(trainSampleCount, 2);
            Matrix<float> trainClasses = new Matrix<float>(trainSampleCount, 1);

            Image<Bgr, Byte> img = new Image<Bgr, byte>(500, 500);

            Matrix<float> sample = new Matrix<float>(1, 2);

            Matrix<float> trainData1 = trainData.GetRows(0, trainSampleCount / 3, 1);
            trainData1.GetCols(0, 1).SetRandNormal(new MCvScalar(100), new MCvScalar(sigma));
            trainData1.GetCols(1, 2).SetRandNormal(new MCvScalar(300), new MCvScalar(sigma));

            Matrix<float> trainData2 = trainData.GetRows(trainSampleCount / 3, 2 * trainSampleCount / 3, 1);
            trainData2.SetRandNormal(new MCvScalar(400), new MCvScalar(sigma));

            Matrix<float> trainData3 = trainData.GetRows(2 * trainSampleCount / 3, trainSampleCount, 1);
            trainData3.GetCols(0, 1).SetRandNormal(new MCvScalar(300), new MCvScalar(sigma));
            trainData3.GetCols(1, 2).SetRandNormal(new MCvScalar(100), new MCvScalar(sigma));

            Matrix<float> trainClasses1 = trainClasses.GetRows(0, trainSampleCount / 3, 1);
            trainClasses1.SetValue(1);
            Matrix<float> trainClasses2 = trainClasses.GetRows(trainSampleCount / 3, 2 * trainSampleCount / 3, 1);
            trainClasses2.SetValue(2);
            Matrix<float> trainClasses3 = trainClasses.GetRows(2 * trainSampleCount / 3, trainSampleCount, 1);
            trainClasses3.SetValue(3);

            #endregion
            try
            {
                using (SVM model = new SVM())
                {
                    
                    //SVMParams p = new SVMParams();
                    //p.KernelType = Emgu.CV.ML.MlEnum.SVM_KERNEL_TYPE.LINEAR;
                    //p.SVMType = Emgu.CV.ML.MlEnum.SVM_TYPE.C_SVC;
                    //p.C = 1;
                    //p.TermCrit = new MCvTermCriteria(100, 0.00001);
                    model.SetKernel(SVM.SvmKernelType.Linear);
                    model.Type = SVM.SvmType.CSvc;
                    model.C = 1;
                    model.TermCriteria = new MCvTermCriteria(100, 0.00001);

                    //bool trained = model.Train(trainData, trainClasses, null, null, p);
                    //bool trained = model.TrainAuto(trainData, trainClasses, null, null, p.MCvSVMParams, 5);
                    TrainData TD = new TrainData(trainData, Emgu.CV.ML.MlEnum.DataLayoutType.RowSample, trainClasses);
                    bool trained = model.TrainAuto(TD);
                    //把训练模型保存到本地
                    model.Save("mySVM.xml");
                    for (int i = 0; i < img.Height; i++)
                    {
                        for (int j = 0; j < img.Width; j++)
                        {
                            sample.Data[0, 0] = j;
                            sample.Data[0, 1] = i;

                            float response = model.Predict(sample);

                            img[i, j] =
                               response == 1 ? new Bgr(90, 0, 0) :
                               response == 2 ? new Bgr(0, 90, 0) :
                               new Bgr(0, 0, 90);
                        }
                    }
                    //获取支持向量(这里获取的是3个向量,即直线方程)
                    //Mat c = model.GetSupportVectors();
                    ////model.get
                    //Matrix<float> xx = new Matrix<float>(c.Rows, c.Cols);
                    //c.CopyTo(xx);
                    //for (int i = 0; i < c.Rows; i++)
                    //{
                    //    // The way the data is received changed as well 
                    //    byte[] b = c.GetData(i);
                    //    PointF p1 = new PointF((float)(b[0]), (float)(b[1]));
                    //    img.Draw(new CircleF(p1, 4), new Bgr(128, 128, 128), 2);
                    //}
                    //Console.WriteLine(c.Cols);
                    //Console.WriteLine(c.Rows);


                    //----获取支持向量-----
                    PointF[] sv_pfs= GetSupportPointfs();
                    foreach (PointF item in sv_pfs)
                    {
                        img.Draw(new CircleF(item, 4), new Bgr(128, 128, 128), 2);
                    }
                }

                // display the original training samples
                for (int i = 0; i < (trainSampleCount / 3); i++)
                {
                    PointF p1 = new PointF(trainData1[i, 0], trainData1[i, 1]);
                    img.Draw(new CircleF(p1, 2.0f), new Bgr(255, 100, 100), -1);
                    PointF p2 = new PointF(trainData2[i, 0], trainData2[i, 1]);
                    img.Draw(new CircleF(p2, 2.0f), new Bgr(100, 255, 100), -1);
                    PointF p3 = new PointF(trainData3[i, 0], trainData3[i, 1]);
                    img.Draw(new CircleF(p3, 2.0f), new Bgr(100, 100, 255), -1);
                }

                Emgu.CV.UI.ImageViewer.Show(img);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
           
        }
        /// <summary>
        /// 获取支持向量的点集
        /// @Author:Heliophyte
        /// </summary>
        private static PointF[] GetSupportPointfs()
        {
            XDocument document = XDocument.Load("mySVM.xml");
            XElement root = document.Root.Element("opencv_ml_svm");
            //获取支持向量的点集数量
            int pCounts = int.Parse(root.Element("uncompressed_sv_total").Value);
            if (pCounts == 0)
            {
                return null;
            }
            PointF[] vfs = new PointF[pCounts];
            //2.13789581e+02 3.70247894e+02
            //1.92192932e+02 2.29739059e+02
            //2.65889404e+02 3.17239105e+02
            //2.58218262e+02 3.95134766e+02
            //5.11033264e+02 2.53483795e+02
            //3.28194794e+02 2.72949036e+02
            //1.15855988e+02 1.08835411e+02
            string ps = root.Element("uncompressed_support_vectors").Value;
            for (int i = 0; i < pCounts; i++)
            {
                string vi = ps.Split(new string[] { "\n " }, StringSplitOptions.RemoveEmptyEntries)[i];
                string[] pf = vi.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
                vfs[i] = new PointF(float.Parse(pf[0]),float.Parse(pf[1]));
            }
            return vfs;
        }
    }
   
}


结果展示

准确圈出支持向量

OpenCV的C#版本EmguCV-1、安装和环境配置 目录一、前言二、EmguCV安装和配置1、EmguCV exe软件安装2、EmguCV库文件方法三、C#工程中引用工程下载连接在.NET中使用EmguCV可以分为两种方式,一种就是将下载的exe程序安装、配置好后在工程中应用,另一种就是将DLL库文件和运行需要的文件直接拷贝到工程中。EmguCV是OpenCV的.NET版本,支持C#、VB.NET等编程语言。本次测试软件环境为win10+VS2013+EmguCV3.0。EmguCV各个版本官方下载地址:Emgu CV - Browse /emgucv at 阅读详情

相关推荐

emgucv4学习25----MaskRcnn分割+vs2019

前面我们介绍了MaskRcnn算法以及在emgucv上的实现,但只是作为目标检测使用,但实际上MaskRcnn不仅仅能作为目标检测来使用,还可以作为分割,接下来我们就看看如何实现检测加分割。小伙伴可以看看我之前的博客对于Maskrcnn在目标检测上的使用。 emgucv4学习24----emgucv4+MaskRcnn目标检测+vs2019_zhangdaoliang1的博客-优快云博客之前在emgucv上实现了yolov3,yolov4,ssd,openpose等模型得加载推理,接下来实现maskrc

qianxun 803

初步了解C#版图像处理库emgucv

初步了解C#版图像处理库emgucv;

bcbobo21cn的专栏 3734

TensorRT+图像分类:采用ResNet18预训练权重图像分类---训练

前面我们介绍了基于手写AlexNet网络得图像分类模型得训练以及相应得TensorRT部署,但是有时候自己搭建网络可能使我们更加深入得理解网络但是训练太慢,所以更多的时候我们采用的是预训练模型。 TensorRT+图像分类:手动搭建AlexNet得图像分类---训练_zhangdaoliang1的博客-优快云博客https://blog.csdn.net/zhangdaoliang1/article/details/122982620TensorRT+图像分类:手动搭建AlexNet得图像分类---部署

qianxun 1326

EMGU中的机器学习算法之:EM算法

使用EMGU3.4.1版本,修复了EMGU.ML中的EM算法。

Zythonista的博客 449

电工电子实验——3BIT延时电路的设计与实现

设计一个 3BIT延时电路。 设计分析: Ⅰ.根据触发器的特性,只有来两个触发脉冲时才能恢复到原来的状态。也就是说触发器的输出信号比触发信号延迟了一个触发脉冲周期即1bit。据此3bit就需要3个触发器。 Ⅱ.输出要可控就要加一控制器,可用选择器实现。 Ⅲ.为便于观察输出信号的延迟,可设计一个F1信号。

qq_55543315的博客 1128

深度学习中 Internal Covariate Shift 问题以及 Batch Normalization 的作用

深度学习中 Internal Covariate Shift 问题以及 Batch Normalization 的作用前言一、Batch Normalization是什么?1.1 Internal Covariate Shift1.2 Internal Covariate Shift 带来的影响1.3 如何减缓 Internal Covariate Shift 问题带来的影响白化(Whitening)白化存在的问题二、Batch Normalization2.1 传统 Normalization2.2 改进

一扣解千愁的博客 4297

【 Emgu CV教程】1.1、Emgu CV 简介及使用

C#利用Emgu CV进行图像、视频处理的简单教程。

活宝的博客 1万+

宏基因组功能注释实战:从CAZyme到VFDB的完整流程(含数据库下载与脚本优化)

本文详细介绍了宏基因组功能注释的完整流程,涵盖CAZyme、eggNOG、CARD和VFDB四大核心数据库的实战应用。从环境配置、数据库下载与预处理到注释流程执行与优化,提供了全面的操作指南和脚本优化建议,帮助研究人员高效完成宏基因组数据分析。特别针对CAZyme注释等关键步骤给出了参数优化方案和常见问题排查方法。

weixin_29289821的博客 295

【Emgu】一起学EmguCV(一)配置与使用

  首先先介绍一下OpenCV,OpenCV的全称是:Open Source Computer Vision Library,OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很...

weixin_34097242的博客 535

群晖Git Server权限配置全攻略:如何让普通用户(非admin)也能安全提交代码?

本文详细解析了群晖Git Server权限配置方案,特别针对普通用户(非admin)安全提交代码的需求。通过SSH服务配置、精细化用户权限管理及仓库创建自动化脚本,实现在DS218+等群晖NAS设备上的高效代码协作,同时确保系统安全。

weixin_42528780的博客 463

​基于stm32的智能空气加湿器设计(含源代码和Proteus仿真)

课程设计分享

LoongSTUDIO的博客 2927

C#使用EmguCV库(图像读取、显示、保存)(二)

使用C#+EmguCV处理图像入门(图像读取_显示_保存)二 上个随笔已经介绍EmguCV的一些常用库和程序安装以及环境变量的配置,这次写的是如何使用这个类库对图像进行操作。 EmguCV图像处理系统组成(个人见解): 图像的基本操作: 贴个代码: using Emgu.CV; //使用命名空间 using Emgu.CV.Structure; using Emgu.CV.CvEnum; using Emgu.Util; static void Main(string[] a.

WarGames_dc的博客 4638

华为od 面试八股文_前端_01_含答案

华为od 面试八股文_前端_01_含答案

MISAYAONE的博客 2748

C#使用EmguCV库介绍(一)

OpenCV(Open Source Computer Vision Library)是一个(开源免费)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android、ios等操作系统上,它轻量级而且高效---由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的诸多通用算法。 EmguCV是OpenCV的一个跨平台的.Net封装,由于OpenCV是用C和C++编写的,Emgu用C#对其进行封装,允许用.Net语...

WarGames_dc的博客 4093

前言:为什么要学习爬虫和逆向,该如何学习?

学习爬虫和逆向技术是当今数字化时代的重要技能,尤其在数据分析、安全研究、自动化工具开发等领域有广泛应用。以下是详细的学习理由、路径和方法:

数据知道的博客 1万+

深度强化学习在足式机器人中的应用 (一):基础原理与仿真环境

我们将首先深入探讨其背后的核心挑战与技术栈,然后详细推导机器人学和强化学习的基本数学原理,特别是剖析在机器人控制领域表现卓越的PPO算法。下面的独立Python脚本展示了Isaac Gym的基本API用法,加载一个Go1机器人(假设URDF已准备好),并让它执行一个简单的预设动作(正弦波运动),以此来熟悉仿真流程。:代码的核心是直接操作GPU上的PyTorch张量,避免了CPU和GPU之间的数据拷贝,这是实现高性能的关键。:所有计算(如伪策略中的正弦波计算)都应该是向量化的,一次性为所有。

VectorShift的博客 228

C#下的openCV(Emgu CV)

http://blog.csdn.net/gaaranaruto/article/details/6328358 2011-04-16 20:582871人阅读评论(5)收藏举报 Emgu CV下载地址 http://sourceforge.net/projects/emgucv/files/ 找最新的下就行了,傻瓜式安装,选择目录后自动完成安装,然后提示安装VS2008和VS2010

数学屌丝走在it的道路上 6850

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

EMGU:开发用于图像处理的C#窗体程序

为C++算法程序添加GUI界面

水木年崋 2347

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Emgu CV3+C#图像处理(一):Emgu CV学习目录+EmguCV安装配置与使用

Emgu CV是OpenCV图像处理库的跨平台.Net包装器。允许从.NET兼容语言(C#,VB,VC ++,IronPython等)调用OpenCV函数。下面开始安装配置Emgu CV,并开始第一个测试程序。 环境:Win7 +Emgu CV3.0.0 安装配置 首先从Emgu CV下载地址处下载安装包。这里我们使用3.0.0版本的Emgu CV。然后选择适当位置解压/运行得到一个文件...

akadiao的博客 3万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

c#结合emgucv进行人脸检测_Java机器学习库(OpenCV)(级联分类器实现人脸识别)...

级联分类器这里简单的介绍一下级联分类器的概念。以人脸识别为例,为了提高人脸检测的速度和精度,最终的分类器是通过几个强分类器级联得到,这就是所说的级联分类器。在一个级联分类系统中,对于每一个输入图片,顺序通过每个强分类器,前面的强分类器相对简单,其包含的弱分类器也相对较少,后面的强分类器逐级复杂,只有通过前面的强分类检测后的图片才能送入后面的强分类器检测,比较靠前的几级分类器可以过滤掉大部分的不合格...

weixin_39829307的博客 332

C#机器学习(1)-Azure AI(1)

Azure 认知服务是基于云的人工智能 (AI) 服务,可帮助开发人员在不具备直接的 AI 或数据科学技能知识的情况下将认知智能内置于应用程序中。可采用常用开发语言通过 REST API 和客户端库 SDK 使用此类服务。借助 Azure 认知服务,开发人员可以通过能够看、听、说和分析的认知解决方案,轻松将认知功能添加到他们的应用程序中。认知服务类别影像语音语言决策Azure OpenAI 服务使用基于云的计算机视觉 API,开发人员可以访问用于处理图像并返回信息的高级算法。

The research on computer technolog 2241

Emgu学习之(一)----Emgu简介

OpenCVOpenCV是一个开源的跨平台的计算机视觉库,它的设计目标时执行速度尽量快,主要关注实时应用。可以运行在Linux、Windows、Mac OS、Android、IOS、Maemo、FreeBSD、OpenBSD等操作系统上。OpenCV采用C/C++语言开发和使用外还支持使用C#、Ruby、Java等编程语言,同时提供了对Python、MATLAB等语言的接口,实现了图像处...

aa156580801的博客 776

C#机器学习(5)-科学计算(1)

Math.NET Numerics是Math.NET计划的一部分,是将dnAnalytics与Math.NET铱合并的结果,取代了两者。Math.NET Numerics是Math.NET项目的数值基础,旨在为科学、工程和日常使用中的数值计算提供方法和算法。Math.NET Numerics是Math.NET倡议的数值基础,旨在为科学、工程和日常使用中的数值计算提供方法和算法。涵盖的主题包括特殊函数、线性代数、概率模型、随机数、统计学、插值、积分、回归、曲线拟合、积分变换(FFT)等。

The research on computer technolog 2083

c#结合emgucv进行人脸检测_通过ZAT结合机器学习进行威胁检测

机器学习概述在机器学习中我们针对安全数据的处理显得异常重要,针对不同的攻击类型数据我们需要选择合适的算法但是大体过程都是分为以下几个步骤:获取数据特征抽取特征预处理特征降维模型训练模型评估通过zat处理zeek全流量日志数据今天这篇文章主要是介绍通过zat处理zeek的全流量数据的分析方法。zeek是开源NIDS入侵检测引擎,目前使用较多的是互联网公司的风控业务。zeek中提供了一种供z...

weixin_39624733的博客 211

学习OpenCV(6) EmguCV 双目视觉

使用EmguCV进行双目视觉的基本操作 EmguCV是什么? 简单的来讲,EmguCV是一个在.NET环境下的对OpenCV中的函数进行了封装的库,类似的还有OpencvSharp,其实如果我们想在C#的程序里面调用OpenCV,可以使用的方法有很多,例如可以使用COM的方式,导出C函数在C#程序里面使用DLLImport进行引用,或者编写托管C++,在公共语言运行时的帮助下直接使用DLL中...

安娜的修行 2891

c# + Emgu.CV学习(二):直方图均衡化、滤波、形态

目录一、图像处理1、直方图均衡化2、滤波2.1、高斯滤波2.2、均值滤波2.3、中值滤波3、形态3.1、腐蚀、膨胀3.2、开操作、闭操作 一、图像处理 1、直方图均衡化 在这里插入代码片 2、滤波 2.1、高斯滤波 2.2、均值滤波 2.3、中值滤波 3、形态 3.1、腐蚀、膨胀 3.2、开操作、闭操作 ...

qq_41373415的博客 1562
上一篇: EMGU中的机器学习算法之:EM算法
下一篇: Yolov5Net报错【已解决】:System.IndexOutOfRangeException: ‘Index was outside the bounds of the array.
Heliophyte阳
博客等级 码龄9年 40粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值