Matlab与.NET混合编程解决人脸识别问题

原文:【原创】Matlab与.NET混合编程解决人脸识别问题

如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标。 

【原创分享】Matlab.NET混编调用Figure窗体 http://www.cnblogs.com/asxinyu/archive/2013/04/14/3020813.html  

【原创】Matlab与.NET基于类型安全的接口编程入门 http://www.cnblogs.com/asxinyu/archive/2013/05/16/3082299.html

【原创】开源.NET下的XML数据库介绍及入门  http://www.cnblogs.com/asxinyu/archive/2013/03/25/2980086.html  

【原创】关于.NET下开源及商业图像处理(PSD)组件 http://www.cnblogs.com/asxinyu/archive/2013/03/21/2972491.html  

【原创】.NET开源压缩组件介绍与入门  http://www.cnblogs.com/asxinyu/archive/2013/03/05/2943696.html  

【原创】开源Word读写组件DocX介绍与入门[资料已发送]  http://www.cnblogs.com/asxinyu/archive/2013/02/22/2921861.html  

【原创】C#开源轻量级对象数据库NDatabase介绍【资料已发送】  http://www.cnblogs.com/asxinyu/archive/2013/02/20/2918066.html 

关键词:混合编程,Matlab编程,Matlab混编,C#调用Matlab,Matlab与C#混编

1.前言

Matlab的强大计算引擎和工具箱,让很多人垂涎欲滴,Mathworks也对其他语言的支持越来越好,对.NET平台的支持也越来越强大。3年前偶然接触Matlab与C#混合编程,期间断断续续完成了很多不同类型问题的处理,并完成了几个小项目,积累了不少经验,现在已经很熟练的能够解决Matlab和C#的混编问题。鉴于很多大学毕业生或者研究生接触混编,有很大难处,也有很多人经常来问很基础的问题,所以2012年年底录制了国内第一套比较完成的Matlab与,NET的混合编程入门视频教程,即将在ILoveMatlab论坛发布。最近完成了一个Matlab和C#混合编程解决“人脸识别”的案例,再次分享一下经验。

2.Matlab.NET混合编程概述 

这方面就不仔细阐述了,主要是利用Matlab的Deploytool工具将m函数编译为.NET程序集,然后在C#中调用的过程。然后程序可以在安装MCR的机器上运行,这个过程如果懂Matalb和C#的人,看看Matlab NE Builder工具箱的帮助入门文档,也很容易的可以搞定,只不过是英文的,要花点时间和耐心。下面简单说一下Matlab和.NET混合编程的步骤和注意要点: 

1.只有Matlab的Function才能被混编调用,也就是一定要是M函数才行;

2.Matlab和C#混编的项目,客户机或者服务器需要安装对应版本的MCR,才能运行。

3.有一些工具箱函数不能被混编,暂时不支持,少数,官方也在努力使得越来越多的工具箱支持混编,详细的可以混编的工具箱可以在这里查看。 

4.2点经常人提起的:神经网络工具箱可以train,不能Test,符号工具箱也不能混编,所以如果想用C#和Matlab解决上述2类问题的人,提前罢手。 

5.Matlab和C#混编的基本步骤,这里只是混合编程的方法之一,也是基本方法. 

1) 编写M函数,并首先在Matlab中测试是正确可以调用的。注意命名规范,注释规范; 

2) 使用命令打开 deploytool工具,设置项目名称,选择类型:.NET Assembly,然后新建一个类,并添加编写好的M函数 

3) 编译,生成dll,并在C#项目中添加引用(还需要引用对应版本的MWArray),利用对象浏览器查看生成dll的方法结构,并根据Matlab和C#的类型转换规则,进行数据转换即可。 

3.混合编程解决人脸识别 

人脸识别是图像处理里面比较常见和经典的问题之一吧。现在研究也很成熟了,本文的人脸识别的Matlab源程序也是一个开源的人脸识别例子。经过分析和改进,进行了重构,最后再进行混编。原始的人脸识别程序,主要有下面几个部分: 

1.人脸检测:这个过程主要是对输入的人脸图像进行肤色判断椭圆类聚判断,把符合人脸特征的矩形标记出来,截取人脸。 

2.人脸数据库训练:这是整个问题的核心,人脸特征的训练直接关系到识别的准确率。主要过程是将目标的人脸数据库进行训练,得到一个最好的分类系数和特征值,作为人脸识别的参数和比较目标。 

3.人脸识别:将目标图像进行人脸特征提取,并进行傅立叶变换,利用遗传算法提取特征值,然后与特征库里面的人脸特征进行距离计算,得到结果。 

原始的项目程序都是Matlab程序,很多不规范的地方,不完全是M函数,参数定义也不规范,我接受后,对整个Matlab项目程序进行了重构,功能更加清晰,函数定义更加合理,然后混编后,在C#中调用也方便多了。看看主要界面和核心代码:

另外,在C#中由于需要存储人脸数据库以及人脸特征,特意选择了一个.NET开发的XML数据库,详细使用可以参考我的这篇博客:开源.NET下的XML数据库介绍及入门  http://www.cnblogs.com/asxinyu/archive/2013/03/25/2980086.html  ,这个还是很方便的。只不过的后期发现了一个Bug,主要是这个XML数据库内部默认采用了“当前目录”找出的,当前目录和程序启动目录是有区别的,因为当前目录是根据软件使用过程,可能会有变化的。后来把源程序找出来,调试修复了这个错误。我把修复后的版本源代码发出来,大家有需要的下载使用吧。主要是在构造函数里面加了一个程序启动路径,说来也奇怪,Win7下是好的,XP就有这个问题。当然修复后都没这个问题了。看看C#混合编程调用Matlab生成程序集的核心代码:

 

上面是混编项目的结构,下面是人脸识别中c#中的核心代码,调用Matlab生成的程序集进行识别。

就这么多吧。混编真的很强大,对做科研的朋友来说,真是一大福音啊。但这对开发的基础要求也很高,否则遇到很多奇怪的错误,还是要靠经验去解决,并不是一次都能够完全学会Matlab混编的。

时间: 2024-08-31 00:08:00

Matlab与.NET混合编程解决人脸识别问题的相关文章

【原创】Matlab与.NET混合编程解决人脸识别问题

              本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标.  [原创分享]Matlab.NET混编调用Figure窗体 http://www.cnblogs.com/asxinyu/archive/2013/04/14/3020813.html   [原创]Matlab与.NET基于类型安全的接口编程

Matlab与.NET混编解决人脸识别问题

原文 http://www.cnblogs.com/asxinyu/archive/2013/05/29/3107013.html 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标.  [原创分享]Matlab.NET混编调用Figure窗体 http://www.cnblogs.com/asxinyu/archive/2013/04/14/3020813.html   [原创]Matlab与.NET基于类型安全的接口编程入门 http://www.cnblogs.com

c++-MATLAB和C++混合编程问题:如何让C中的全局变量不和matlab共享内存

问题描述 MATLAB和C++混合编程问题:如何让C中的全局变量不和matlab共享内存 我在做matlab2014和VS2013的混合编程,我在C的源码中有一个全局变量g,然后我在matlab中使用并行计算对c程序进行循环调用时,这个全局变量居然不会在c程序结束的时候被释放,而是一直在内存中,每次循环的时候都不断变化...例如一开始g=100,matlab调用一次c程序g++,然后在matlab中循环调用c程序,按理c程序中的全局变量应该在c程序结束时被释放,也就是输出结果应该是100,101

vs2010 界面设计以及与matlab之间的混合编程

问题描述 vs2010 界面设计以及与matlab之间的混合编程 vs2010 界面设计以及与matlab之间的混合编程...????... 解决方案 vs2010只是开发环境,你可以选择用vc++/mfc,qt,sdk或者C#/wpf,winforms来设计界面.C++.VB.C#等等调用matlab的方法也各不相同.具体可以google下. 解决方案二: matlab 2012 vs2010混合编程 解决方案三: 需要调用matlab的接口

界面划窗口设计-matlab与vs混合编程中,用户操作界面怎么设计,而且界面上的输入如何与matlab对应的值相对应??

问题描述 matlab与vs混合编程中,用户操作界面怎么设计,而且界面上的输入如何与matlab对应的值相对应?? matlab与vs混合编程中,用户操作界面怎么设计,而且界面上的输入如何与matlab对应的值相对应?? 解决方案 你界面用matlab做的还是用winform做的?

matlab与c#混合编程遇到解决不了的问题

问题描述 我写了一个简单的测试文件,遇到一个摸不着头脑的问题matlab测试代码functiontest_cs(h)y=imread(h);imshow(y);endc#代码usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.F

MATLAB与VC++混合编程实现一维小波多尺度分解.

引言 小波分析世纪80年代开始发展成熟起来的一个数学分支,其应用领域十分广泛,并逐步成为信号分析的又一有力工具.MATLAB的小波工具箱为我们提供了小波多尺度分解函数,方便了我们对小波的使用.但是用它所编写的软件不能脱离MATLAB编程环境在Windows平台下直接运行,代码执行效率低下,运行时占较多的系统资源,不能达到某些用户的需求. VC++是由美国Microsoft 公司开发的可视化C/C++集成编程环境,是目前功能最强大的软件开发工具之一.被广泛应用于Win32平台的基础应用程序的开发.

【5.1送礼】国内第一部Matlab和C#.Net混合编程视频教程【免费】

              本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 上一次写博客很久了,一直在忙彩票分析系统架构的事情,写博客真是件费神的事情,非常花时间.今天抽空发布这篇博客,是为了开源一部自己录制的视频教程-Matlab和C#.Net混合编程视频教程[入门级].下面说说这部视频教程的来由和一些事情,想获取的仔细看看,别忘了点[推荐]哦! 一.为啥要开源 1.1 视频的来源 这部视

【原创】Matlab.NET混合编程技巧之找出Matlab内置函数

              本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯定不难.反之,有时候一个小错误,可能抓破脑袋,加班几个晚上,调试才能解决.同样,由于Matlab.NET混编的特殊性,加上MathWorks的原因,英文文档和没有披露一些详细的细节(甚至不允许反编译MWArray.dll,呵呵,它不允许