【原創】Matlab與.NET混合編程解決人臉識別問題


              本博客所有文章分類的總目錄:【總目錄】本博客博文總目錄-實時更新

      Matlab和C#混合編程文章目錄 :【目錄】Matlab和C#混合編程文章目錄

如果這些文章對你有用,有幫助,期待更多開源組件介紹,請不要吝嗇手中的鼠標。 

關鍵詞:混合編程,Matlab編程,Matlab混編,C#調用Matlab,MatlabC#混編

1.前言

Matlab的強大計算引擎和工具箱,讓很多人垂涎欲滴,Mathworks也對其他語言的支持越來越好,對.NET平台的支持也越來越強大。3年前偶然接觸MatlabC#混合編程,期間斷斷續續完成了很多不同類型問題的處理,並完成了幾個小項目,積累了不少經驗,現在已經很熟練的能夠解決MatlabC#的混編問題。鑒於很多大學畢業生或者研究生接觸混編,有很大難處,也有很多人經常來問很基礎的問題,所以2012年年底錄制了國內第一套比較完成的Matlab,NET的混合編程入門視頻教程,即將在ILoveMatlab論壇發布。最近完成了一個MatlabC#混合編程解決“人臉識別”的案例,再次分享一下經驗。

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混編的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM