您的位置:新葡亰496net > 奥门新萄京娱乐场 > 新葡亰496net:人脸识别Emgucv,调用本地摄像头

新葡亰496net:人脸识别Emgucv,调用本地摄像头

发布时间:2019-09-27 13:50编辑:奥门新萄京娱乐场浏览(158)

    OpenCV

    多年来合营社让做一款产品!要求要用到人脸识别技能,稍后有时间本身整理下思路以及选用的技巧!

     

    OpenCV是由C/C 编写的图像管理库,C#不能够直接调用,

    【百度健全】

    OpenCV是三个开源的跨平台的Computer视觉库,它的安顿性指标时实践进度尽量快,主要关心实时应用。能够运营在Linux、Windows、Mac OS、Android、IOS、Maemo、FreeBSD、OpenBSD等操作系统上。OpenCV采取C/C 语言开辟和利用外还辅助使用C#、Ruby、Java等编制程序语言,同一时间提供了对Python、MATLAB等语言的接口,达成了图像管理和测算视觉方面包车型客车成百上千通用算法。OpenCV包罗的函数500几个,覆盖了Computer视觉的大队人马应用领域,如工厂产品检验、工学成像、新闻安全、顾客分界面、摄像机标定、立体视觉和机器人、显卡加快等。

     

      工欲善其事,必先利其器。

    但是EmguCV是使用C#对openCV进行包装。

      LIBSVM是四川高校林智仁(Lin Chih-Jen)教师等开荒设计的一个简单易行、易于使用和高速有效的SVM格局识别与回归的软件包,他不光提供了编写翻译好的可在Windows体系系统的施行文书,还提供了源代码,方便创新、修改以及在其余操作系统上行使;该软件对SVM所提到的参数调度相对少之又少,提供了成都百货上千的暗中认可参数,利用那么些默许参数能够缓和多数主题素材;并提供了交互核查(CrossValidation)的效果与利益。该软件能够消除C-SVM、ν-SVM、ε-SV逍客和ν-SVEscort等难点,包涵基于一对一算法的多类形式识别难点……

    Emgu 介绍

     

    一、下载

    那么难题的话,EmguCV如何使用?

      要是您对libsvm还远远不足掌握,建议先浏览下百度百科等对libsvm的牵线~

    Emgu CV是将OpenCV使用.NET编制程序语言(C#)封装成的.NET库,使用Emgu CV就能够在.NET平台上调用OpenCV的意义。

    EmguCv简介

      Emgucv学习在此以前,大家先要搭建好开荒环-Emgucv库、VS开采平台。

    自己那边开垦条件是VS2011 Win7

    【C# Wrapper 动机】

    Emgu历史进度如下:

    EmguCV 是.NET 平台下对OpenCV 图像管理库的包裹。也正是OpenCV的.NET 版。它运维在.NET 包容的编制程序语言下调用OpenCV的函数,如C#、VB、VC 、IronPython 等。那些封装库能够在Mono 下编写翻译和在Linux / Mac OS X 上运转。目前在互连网上关于Emgucv 的小说非常多,可是出于EmguCv 各个版本都有退换一有的函数,版本向下包容做的不是很好,所以相比散乱,。笔者的开采条件为VS2016 EmguCv3.1.0 版本。

      (1)VS开辟平台,个人认为VS二〇一四非常好用的,譬喻:自定义窗口布局、更优的代码编辑器、Shared Project 集成、Bower和NPM中的代码智能提示、调节和测验Lambdas表明式等。

    1、首先需求下载EmguCV ,下载地址:

      参预过多个档案的次序,使用IDE是VS winform,工具包为EmguCV 2.4.10。我们知晓OpenCV第22中学的svm部分是基于libsvm-2.6编写制定的,该版本的libsvm已经能够estimate预测可能率了(libsvm首页的change log中有详尽表明),不过OpenCV却吐弃了predictProbability。在切实的类型中,假设得以获取预测可能率音信,那将对拉长识别性有相当的大的相助。然则,opencv2抛弃了辨识几率,包涵opencv3,作者看源代码的svm部分也是基于libsvm-2.6修改的,也尚未引进predictProbability。

    二〇〇八年三月 第二个版本开源版本EmguCV 1.1.1发布

    EmguCv安装和配备

    其一的下载能源能够找度娘,这里提供网盘的下载链接。

    下载完结后,进行设置,安装步骤是傻瓜式安装,但要记着温馨的设置路径(eg:C:Emguemgucv)

      由此,在EmguCV的ML知足不断的情状下,萌生了多个主张:

    2009年十一月 EmguCV 1.2.2 正式发表,达成了从Image和Matrix类中赢得》NET数组O(1)操作,以及三个窗体图像显示控件Image博克斯。

    一、去官方网站下载 Emgucv : 

    链接: 密码:z4wh

    2、必要配备情状变量。

        一是修改OpenCV代码,然后再一次CMake获得cvextern.dll;

    二零一零年八月 EmugCV 1.3.0标准透露,改正了数不完bug,新扩展了Bgra色彩空间,同期引进了ZedGraph组件展现直方图,而且对程序集完成了强签字。

    新葡亰496net 1

      (2)Emgucv库跟OpenCV同样都是开源库,可通过上面地址下载自身索要的本子

    展开笔者的Computer ==>> 张开高档系统安装==>>张开景况变量==>>在系统变量中找到Path变量==>>在对话框中的文本框中的最后增多EmguCV的安装路线,如自己的装置路线为:C:Emguemgucvbin==>>点击分明,供给时重启计算机生效。

        二是平素找其余的svm库。

    二〇〇九年十二月 EmugCV 1.4.0 正式布告,匡助OpenCV 1.1Pre1版本。

     

      

    渠道要求指向bin目录下。

      首先尝试CMake。像OpenCV那样的大门类,CMake起来着实不便于,更何况是从零始发学CMake。在时光不允许的规范下,只得走第二条路。找到libsvm夏普后,笔者如获宝贝。不过,极快作者又重新失望了,因为实时性需要满意不断(EmguCV自带SVM能够在5ms内达成辨认预测,而libsvmSharp要求500ms)。

    二〇一〇年十月 EmugCV 1.5.0 正式公布,新添了机械学习库。

     

    新葡亰496net 2

    新葡亰496net 3

      这是干吗?

    二零零六年十月 EmugCV 2.0.1 正式发表,基于OpenCV 2.0付出

    新葡亰496net 4

    自家下载了:libemgucv-windows-universal-3.0.0.2157-0

    高级系统装置

      同样是C#对C 的wrapper,同样都以基于libsvm,同样是对C 所编写翻译的dll的引用,效用竟相差百倍!本着一颗学习的心,小编决定一探毕竟……

    二零一零年一月 EmguCV 2.2.0 正式宣告,,新扩展了特征检查测量试验,并早先辅助VS 二零零六支出条件。

    设置很简短,这里就背着了

    二、安装

    新葡亰496net 5

    【现有libsvm的C#/.Net版本】

    二零一二年3月 EmguCV 2.2.1 正式公布,新添GPU硬件加快组件。

    设置到位后所赢得获得的目录结构

    Emgucv库安装包下载下来是多少个.exe文件,双击安装就能够。

    境遇变量

      目前,LIBSVM拥有C、Java、Matlab、C#、Ruby、Python、奇骏、Perl、Common LISP、Labview等数十种语言版本。最常使用的是C、Matlab、Java和命令行(c语言编写翻译的工具)的版本。

    二零一二年10月 EmguCV 2.3.0 正式透露,使用tesseract 3.0新添OC福特Explorer检查实验,同期加强及修复GPU组件成效。

     新葡亰496net 6

    分选设置路线

    新葡亰496net 7

      首先大家看张libsvm官方网站首页上的截图:

    二〇一三年5-3月 EmguCV 2.4.X(0,2) 正式发表,新增加IOS及Android方面包车型大巴经济贸易版本,相同的时候将GPU组件塑造在CUD蒙迪欧.2本子之上。

     

    新葡亰496net 8

    系统变量中的Path变量

    新葡亰496net 9

    二〇一二年十二月-二〇一五年二月 EmguCV 2.4.9 (Alpha,Beta)宣布,GPU构架不在注重顾客机Nvidia显卡驱动程序,并开首扶助Windows Store App,新添CLAHE算法。

    简短介绍下上航海用教室的目录结构,

    到上面这一步后,点击安装,就能够依据提示实现。

    新葡亰496net 10

      下边,我们看看今后libsvm有啥样C#版本:

    2014年12月 EmguCV 2.4.10发布,基于OpenCV 2.4.10开发。

    bin :里面有以往建项目所用倒的 dll(动态链接库)

    新葡亰496net 11

    Path里面增加EmguCV的装置路线

      1、SVM.NET by Matthewa Johnson

    二零一五年十二月 Emgu CV 3.0.0 候选版发布,基于OpenCV 3.0.0-rc1版本,新扩张对Windows Phone8.1、Unity5.0的帮忙。

    Emgu.CV.Example: 官方给出的有个别demo

    设置完结后,在PC上生成目录如下:

    3、VS2013中配置EmguCV。

      二〇一〇年,伊利诺伊香槟分校学院的马特hewa 约翰逊博士将SVM.NET更新到了V2.89,约等于未来的新式版本。无语今后不FQ竟已经找不到SVM.NET的原生版了。那份神秘感使自个儿认为,那些C#本子的libsvm应该是质感最高的。

    二〇一五年七月 发布Emgu CV3.0.0,基于OpenCV 3.0.0,将非托管代码合併到叁个dll库(cvextern.dll)。新增加对VS 二〇一六的支撑,移除VS 二零零六 的调节和测验可视化帮忙。

    Emgu.CV.Documentation.chm: 官方的提交的证实文书档案日语版,

    新葡亰496net 12

    新建叁个Windows窗体程序==>>增多对C:Emguemgucvbin目录下的对EmguCVd的援引(共4个零件:Emgu.CV.World.dll  ZedGraph.dll  Emgu.CV.UI.GL.dll  Emgu.CV.UI.dll)。

      后人有在V2.89的底子上做一些改造,提议了:SVM.NET with Parallel Optimization。相关描述为:When finding parameters, C and Gamma, in Grid-search algorithm using ParameterSelection.PGrid instead of the original ParameterSelection.Grid will increase the calculation speed.

    二零一五年三月 公布 Emgu CV 3.1.0不再扶助x86上的CUDA,CUDA 7.0版本早就扬弃了x86协助。

     

    三、配置

    新葡亰496net 13

      2、NSVM by Joannes

    二〇一五年7月 公布 Emgu CV 3.1.0-r16.12,CUDA营造基于CUDA 8.0并帮助最新的NVIDIA设备。

    布置情形变量:

     Emgucv的配备相对于Opencv来讲依旧比较简单的。

    vs加多4个援引文件

    新葡亰496net 14

    二〇一七年11月 宣布Emgu CV 3.2.0,基于OpenCV 3.2,晋级Tesseract OCR到 4.0-dev版本,况兼采用越来越好的LSTM -OC奥迪Q7引擎代替原先的OC哈弗引擎

      1.此Computer(小编的win10)右键属性

    (1)配置遇到变量

    布局进度到此为完毕。

        3年时光,却唯有2下载量,何其惨淡……好呢,恐怕你也像本身同样主观臆断了。

    新葡亰496net:人脸识别Emgucv,调用本地摄像头。前年5月 公布Emgu CV3.3.0 基于OpenCV 3.3,Windows版本使用Visual Studio 2017构建,同时将CUDA进级到9.0。

      新葡亰496net 15

    右击 计算机 ,选取属性,选择高级系统设置 -> 高等 ->意况变量 ->系统变量:Path选项下,增添:";D:Emguemgucv-windesktop 3.3.0.2824bin",即大家增加的不二等秘书籍前用分号面前边隔开分离。

    4、具体代码完成。

    3、KMLib(Kernel Machine Library with GPU SVM solver in .Net) by Krzysztof Sopyła

    2018年4月 发布EmugCV 3.4.1 基于OpenCV 3.4.1 ,升级CUDA到9.1。

     

    (2)配置开荒条件

    在Windows窗体上 ,拖多个ImageBox、一个开关到到窗体上。双击按键,编写Click事件代码

      Key Features

    Emug能源地址:

     

    在行使Emgucv开采时,VS工程中,必要在援引中加多Emgucv相关的动态链接库

    编写Click事件代码。具体代码如下:

      • .Net implementation
      • Parallel kernel implementation
      • SVM CUDA acceleration – kernels and solver
      • CUDA SVM with sparse data formats: CSR, Ellpack-R, Sliced-Ellpack
      • 新葡亰496net:人脸识别Emgucv,调用本地摄像头。For non commercial and academic use: Free MIT license when use please cite: Bibtex CUDA SVM CSR

    Emgu CV官网:

     新葡亰496net 16

    新葡亰496net 17

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using Emgu.CV;
    namespace WinFrom1
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }
    private VideoCapture capture;
    private bool isProcess = false;
    private void button1_Click(object sender, EventArgs e)
    {
    if (capture != null)
    {
    if (isProcess)
    {
    Application.Idle -= new EventHandler(ProcessFram);
    this.startBtn.Text = "Stop";
    }
    else
    {
    Application.Idle = new EventHandler(ProcessFram);
    this.startBtn.Text = "Start";
    }
    isProcess = !isProcess;
    }
    else
    {
    try
    {
    capture = new VideoCapture();
    }
    catch (NullReferenceException expt)
    {
    MessageBox.Show(expt.Message);
    }
    }
    }
    private void ProcessFram(object sender, EventArgs arg)
    {
    imageBox1.Image = capture.QueryFrame();
    }
    }
    }

      另外,还会有点内需重申的是,它是基于libsvm的java版本变换过来的。也正因如此,作者感觉用起来恐怕会略带劳累,故并未有选取。

    Emug CV 安装文件下载地址:

    新葡亰496net 18

    点击浏览,找到Emgucv安装目录的bin目录

    5、运转进程中大概出现的Bug。

    4、libsvmSharp by ccerhan

    Emgu CV 源码地址:

     

    新葡亰496net 19

    a) 点击运营,可能会如下至极:System.TypeInitializationException”类型的未经管理的非常在 Emgu.CV.World.dll 中发出

      选用它的说辞很轻巧,有自然的下载量(从众心绪又初阶闹事了!)下载方便,用VS的Nuget package,通过命令“PM> Install-Package LibSVMsharp”即下载到本地。

    从官英特网你能够找到EmguCV的最新版本、基础教程和在线API文书档案。在自个儿写那篇作品时,EmguCV公布的新式版本为Emgu.CV-3.4.1,若是从官方网址下载速度一点也不快,你能够从自己的网盘下载,地址为::。下载获得的时三个名号为libemgucv-windesktop-3.4.1.2976.exe的安装程序,安装到位后,在装置目录内容如下图所示:

    配备路线: C:Emguemgucv-windesktop 3.1.0.2282binx64(正是您的Emgucv的装置路线) 

    慎选上边七个动态库,后续有更复杂的运用时,再加多任何的。

    化解办法:将EmguCV bin目录下的x64 x86文件拷贝到项目下Debug目录下就可以。(小编本地已调节和测量试验好,不报该错误了,暂无图片。)

    5、libsvm-net by Nicolas Panel

    新葡亰496net 20

     

    新葡亰496net 21

    b) 再一次运维,继续提示报错,如下图:

      下载起来同样丰盛实惠: NuGet package : PM> Install-Package libsvm.net,比起libsvmSharp有越来越高的人气。

    在Solution文件夹中有Visual Studio的品种文件,个中Example项目包罗了Emgu的源代码和例程,这几个例程包蕴形状检验、脸部检查实验、车牌检查测量检验、OCEnclave、交通标志检验、SU奇骏F特性相称、摄像拍卖等特别丰裕的示范,具体例程项目如下图:

    好啊到此 第一步截止,

    (3)加载Emgu.Cv.UI.dll中的控件

    新葡亰496net 22

    【分析libsvmSharp】

    新葡亰496net 23

    二、用Emgucv创造一个Hello World 

     【工具】→【选拔工具箱(如图1.14)】→【单击选用工具箱】→【在.NET Framework组件栏中单击浏览】→【选用设置路线下的bin文件夹下的Emgu.CV.UI.dll(如图1.15)】→【单击明确举办加多】→【增添成就在工具箱中就有所选取的工具】。

    那时候状态为缺少VC redit.exe程序。

      为何libsvmSharp.dll如此低效?

    新建项目

     

     新葡亰496net 24

    附链接地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=48145

      在反编写翻译后的源代码中(稍后将介绍如何反编写翻译C#编写翻译出来的dll文件),大家得以看看libsvmSharp所用的数据结构有:

    1、 新建二个调控台项目,项目名称设置为德姆o。

    新葡亰496net 25h

    新葡亰496net 26

        1、struct:svm_node、svm_model、svm_problem、svm_parameter;

    2、 添加Emgu引用

     (4)例程

    redit.exe程序

        2、calss:SVMNode、SVMModel、SVMProblem、SVMParameter。

    新葡亰496net 27新葡亰496net 28

    在VS中新建一个类型,选用Visual C#下的Windows窗体应用程序。

    傻瓜式安装改exe程序,必要时重启Computer。

    实在,结构体能做的事体,类完全也能做,就如结构体未有存在的必备。

    3、 增加OpenCV库—从安装目录下的libs X86(X64)文件夹中加多OpenCV库:

    向Form1窗体中增加三个PixctureBox控件和一个Button控件,如图PixctureBox的SizeMode属性为Zoom

    c)再一次运转程序。

      并且,能够旁观种种的达成中,有众多“结构体=>类”、“指针=>结构体”、“类=>指针”等这么的类型转变。大家理解,C#要援引C 所编写翻译的dll,用得最多的正是IntPtr这些数据结构。而libsvmSharp低效的因由,也正在于对指针的拍卖政策选用不当,它只在急需传指针的时候,硬生生地用马尔斯hal类重新在内存中开荒当前数据结构大小的区域,并重返指针,美其名曰convert到指针。这种艺术,无论是在时光上依然空中上,都有太多没须求的萧疏。

    新葡亰496net 29

    新葡亰496net 30

    新葡亰496net 31

      这里大家用libsvm中的svm_predict作为例子来教学。

    累加达成后入选它们,然后右击设置器属性,将“生成操作设置为”W无,“复制到输出目录设置为:如若较新则复制。

    在按键单击事件中增添如下代码:

    能够展现了,哈哈哈哈

      在libsvm.dll(该dll由C 编写翻译获得)中,函数为:

    新葡亰496net 32

    private void button1_Click(object sender, EventArgs e)
    {
      Image<Bgr, byte> image = new Image<Bgr, byte>(320,240,new Bgr(0,255,255));//成立一张320*240尺寸颜色为本白的图像
      imageBox1.Image = image;
    }

    ==>> 恭喜,成功了,可以洗洗睡了。

     double svm_predict(const svm_model *model, const svm_node *x)
    

    迄今,大家就创造了叁个得以动用的Emgu项目,在Program.cs中输入以下代码测量检验看是不是能健康运作。

    新葡亰496net 33

    新葡亰496net 34

      在libsvmSharp.dll(该dll由C#编写翻译得到)中,我们如此注脚它:

    static void Main(string[] args)
            {
                //从文件中读取图像
                var mat = new Mat("lena.jpg");
                //创建一个显示窗口
                CvInvoke.NamedWindow("Lena", Emgu.CV.CvEnum.NamedWindowType.AutoSize);
                //显示图像
                CvInvoke.Imshow("Lena", mat);
    
                //等等按键输入
                CvInvoke.WaitKey(0);
                //销毁显示窗口
                CvInvoke.DestroyWindow("Lena");
    
                //释放资源
                mat.Dispose();
            }
    

     

    哈哈哈哈

     [DllImport("libsvm.dll", CallingConvention = CallingConvention.Cdecl)]
     public static extern double svm_predict(IntPtr model, IntPtr x);
    

    运转作效果果:

    Image<Bgr, byte>为Emgucv库中的方法,出现上边结果,表达库配置成功。

    新葡亰496net 35

      DllImport时,更加多关于C 数据结构到C#数据结构的音信请读者查阅资料取得。由上可知,IntPtr是个很主要的数据结构,由它表明的变量实际上是一个指针值(即内存地址值)。第三个参数IntPtr model,须求传入model所在内部存款和储蓄器区域的地址,第叁个参数IntPtr x,供给传入特征节点数组所在内部存款和储蓄器区域的地方。上边,大家看看libsvmSharp是怎么利用这么些函数的:

    新葡亰496net 36

     

    1024

     1         public static double Predict(SVMModel model, SVMNode[] x)
     2         {
     3             if (model == null)
     4             {
     5                 throw new ArgumentNullException("model");
     6             }
     7             if (x == null)
     8             {
     9                 throw new ArgumentNullException("x");
    10             }
    11             IntPtr intPtr = SVMModel.Allocate(model);
    12             double result = SVM.Predict(intPtr, x);
    13             SVMModel.Free(intPtr);
    14             return result;
    15         }
    16 
    17         public static double Predict(IntPtr ptr_model, SVMNode[] x)
    18         {
    19             if (ptr_model == IntPtr.Zero)
    20             {
    21                 throw new ArgumentNullException("ptr_model");
    22             }
    23             if (x == null)
    24             {
    25                 throw new ArgumentNullException("x");
    26             }
    27             List<SVMNode> list = (from a in x
    28             select a.Clone()).ToList<SVMNode>();
    29             list.Add(new SVMNode(-1, 0.0));
    30             IntPtr intPtr = SVMNode.Allocate(list.ToArray());
    31             double result = libsvm.svm_predict(ptr_model, intPtr);
    32             SVMNode.Free(intPtr);
    33             return result;
    34         }
    

    作者:潘圣国

    -----于20171024晚,哦,,,,不,,,不,,,不  已经25号了,这些猿节就这么啊。

      留神的您有未有察觉什么难点?看不懂?毕竟自个儿是一孔之见。然则,请看第11行,每一回调用都要双重给model分配内部存款和储蓄器哦!再如,第27、28、29、30行,在谙习C 的人看来,that's what?参数字传送进来的可不是数组名吗,干嘛如此冥思遐想?内部存款和储蓄器不会被玩坏吗?

    出处:

      一切都以因为C#有指针,但不是丰硕大家所熟知的指针。C#不曾像Java同样完全撤废指针,但为了代码安全思虑而裁减指针。C#是面向对象的言语,里面其余一种数据结构都并未有指针这一质量,除非您本人在定义数据结构时,将指针作为成员变量。大家所熟悉的EmguCV正是这么完成对OpenCV的wrapper的。

    正文版权归小编全数,应接转发,但未经我同意必得保留此段注脚,且在篇章页面显著地方给出原来的文章连接。好的能源我们一块儿享受,共同提升。

    【开始libsvm的C# Wrapper之旅】

      很好,大家得以进来正题了。笔者将以wrapper libsvm为例,分步骤解说整个经过。读者能够一隅三反,希望本文能够帮忙你加深你对跨语言编制程序的理解。

      1.wrapper第一步(准备)

      获取你要wrapper的dll(由C 编写翻译得到),最佳有源代码,当然有参谋手册也得以,不过只要除去dll的名字,对该dll一窍不通,那也许就十分的小概了。

      安装C#的dll反编写翻译工具,这里推荐ILSpy。为啥要设置?比起自身乌黑中追寻,假如有能够参见借鉴的财富,不乏先例是何等缺憾的一件事呀。EmguCV真的可以称作wrapper中的经典。

    1. wrapper第二步(DllImport)

      首先,VS新建C#工程,项目体系选项类库,那样结尾生成解决方案后,便得以在bin/Debug目录下获得实用的dll文件了。笔者将品种命名称叫libsvmSharpCyc。

      其次,增加要求wrapper的C dll文件。右键单击应用方案能源管理器中的libsvmSharpCyc,然后加多现成项,把libsvm.dll增加进项目。

      接着,新建类,用于DllImport。作者建的是LsInvoke.cs,能够像下图所示那样,把想要使用的函数方法给Import进来:

    新葡亰496net 37

      该进程中,DllImport要什么样使用,感兴趣的读者可活动学习,这里要求专一的是C 函数中的数据结构到C#中的数据结构是有炫耀关系的,上面附上一张dll引用常用转化表:

                C              C#
            =====================================
            WORD              ushort
            DWORD             uint
            UCHAR             int/byte   大部分情况都可以使用int代替,而如果需要严格对齐的话则应该用bytebyte 
            UCHAR*            string/IntPtr
            unsigned char*    [MarshalAs(UnmanagedType.LPArray)]byte[]/?(Intptr)
            char*             string
            LPCTSTR           string
            LPTSTR            [MarshalAs(UnmanagedType.LPTStr)] string
            long              int
            ulong             uint
            Handle            IntPtr
            HWND              IntPtr
            void*             IntPtr
            int               int
            int*              ref int
            *int              IntPtr
            unsigned int      uint
            COLORREF          uint
    

    3、wrapper第三步(数据结构)

      这一步是最为重大的一步,在C#中新建数据结构,须求求与C 中的数据结构相平等,不然境遇无法预想的主题材料。

      前文已经轻巧地介绍过libsvm的数据结构了。这里再一次一下:

     1 struct svm_node
     2 {
     3     int index;
     4     double value;
     5 };
     6 
     7 struct svm_problem
     8 {
     9     int l;
    10     double *y;
    11     struct svm_node **x;
    12 };
    13 
    14 enum { C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR };    /* svm_type */
    15 enum { LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED }; /* kernel_type */
    16 
    17 struct svm_parameter
    18 {
    19     int svm_type;
    20     int kernel_type;
    21     int degree;    /* for poly */
    22     double gamma;    /* for poly/rbf/sigmoid */
    23     double coef0;    /* for poly/sigmoid */
    24 
    25     /* these are for training only */
    26     double cache_size; /* in MB */
    27     double eps;    /* stopping criteria */
    28     double C;    /* for C_SVC, EPSILON_SVR and NU_SVR */
    29     int nr_weight;        /* for C_SVC */
    30     int *weight_label;    /* for C_SVC */
    31     double* weight;        /* for C_SVC */
    32     double nu;    /* for NU_SVC, ONE_CLASS, and NU_SVR */
    33     double p;    /* for EPSILON_SVR */
    34     int shrinking;    /* use the shrinking heuristics */
    35     int probability; /* do probability estimates */
    36 };
    37 
    38 //
    39 // svm_model
    40 // 
    41 struct svm_model
    42 {
    43     struct svm_parameter param;    /* parameter */
    44     int nr_class;        /* number of classes, = 2 in regression/one class svm */
    45     int l;            /* total #SV */
    46     struct svm_node **SV;        /* SVs (SV[l]) */
    47     double **sv_coef;    /* coefficients for SVs in decision functions (sv_coef[k-1][l]) */
    48     double *rho;        /* constants in decision functions (rho[k*(k-1)/2]) */
    49     double *probA;        /* pariwise probability information */
    50     double *probB;
    51     int *sv_indices;        /* sv_indices[0,...,nSV-1] are values in [1,...,num_traning_data] to indicate SVs in the training set */
    52 
    53     /* for classification only */
    54 
    55     int *label;        /* label of each class (label[k]) */
    56     int *nSV;        /* number of SVs for each class (nSV[k]) */
    57                 /* nSV[0]   nSV[1]   ...   nSV[k-1] = l */
    58     /* XXX */
    59     int free_sv;        /* 1 if svm_model is created by svm_load_model*/
    60                 /* 0 if svm_model is created by svm_train */
    61 };
    

      对应地,我们在C#中确立数据结构:

        public struct svm_node
        {
            /// <summary>
            /// 索引
            /// </summary>
            public int index;
    
            /// <summary>
            /// 值
            /// </summary>
            public double value;
    
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="i"></param>
            /// <param name="v"></param>
            public svm_node(int i,double v)
            {
                this.index = i;
                this.value = v;
            }
            public bool Equals(svm_node x)
            {
                return this.index.Equals(x.index) && this.value.Equals(x.value);
            }
        }
        public struct svm_problem
        {
            /// <summary>
            /// 支持向量个数
            /// </summary>
            public int l;
    
            /// <summary>
            /// 标签值
            /// </summary>
            public IntPtr y;
    
            /// <summary>
            /// 节点情况
            /// </summary>
            public IntPtr x;
        }
        ……
    

      恐怕有读者会问,结构体你加构造函数和其余函数干嘛?那实际上是为着以往好简化代码。不然,每一趟对象创造于赋值分开操作有一些麻烦。

      举行到近期,大家只是达成了数据结构搭建的一小部分,上边是从EmguCV中学习到的杰出部分!就要下篇作介绍~

    本文由新葡亰496net发布于奥门新萄京娱乐场,转载请注明出处:新葡亰496net:人脸识别Emgucv,调用本地摄像头

    关键词: