用MCC生成動態鏈接庫
雖然標題是說用mcc,但是因爲有三個文件,懶得打那麼多命令,在matlab命令行下使用deploytool調出工具包,選擇編譯共享庫
添加之前寫的三個函數DUCO_LoadNet、DUCO_LoadImgAve、DUCO_OCRNum
點擊package開始編譯
在一段時間的等待後(編譯的真慢),會在當前目錄下生成一個新的文件夾,在裏面找到生成的DLL、LIB和h文件
再次封裝
再封裝是爲了方便別人,如果直接使用上面生成的DLL的話,需要調用者也要會使用c++matlab混編用的一些類型還有項目配置,所以我們再打包一次。
參照這個鏈接http://www.ithao123.cn/content-10197080.html配置一個VS項目(網上資料太多不重複寫了)。
新的封裝接口
//DUCO_OCR.h
#pragma once
#include <windows.h>
//初始化庫
extern "C" __declspec(dllexport) bool Init(void);
//加載CNN參數
extern "C" __declspec(dllexport) void LoadNet(const char* netPath,const char* imgavePath);
//識別數字
extern "C" __declspec(dllexport) int GetNum(BYTE *img,int width,int height);
//結束調用庫
extern "C" __declspec(dllexport) void Release(void);
接口實現
//DUCO_OCR.cpp
#include "mclmcrrt.h"
#include "DUCO_OCRNum.h" //用MCC生成的頭文件
#include "DUCO_OCR.h"
#pragma comment(lib, "mclmcrrt")
#pragma comment(lib, "mclmcr")
#pragma comment(lib, "DUCO_OCRNum")
//初始化庫
bool Init(void){
return DUCO_OCRNumInitialize();
}
//加載神經網絡數據
void LoadNet(const char* netPath,const char* imgavePath){
mwArray mxNetPath(netPath);
mwArray mxImgPath(imgavePath);
DUCO_LoadNet(mxNetPath);
DUCO_LoadImgAve(mxImgPath);
}
//識別數字
int GetNum(BYTE *img,int width,int height){
mwArray mxRes(1,1,mxINT32_CLASS);
mxRes=-1;
mwArray mxImg(width, height, mxUINT8_CLASS);//跟原始圖像長寬顛倒
int capcity = height * width;
mxImg.SetData(img, capcity);
DUCO_OCRNum(1,mxRes,mxImg);
return (int)mxRes;
}
//釋放庫
void Release(void){
DUCO_OCRNumTerminate();
return ;
}
然後就可以直接調用使用了,使用時有幾個注意的地方。
Init函數不要頻繁調用,其會加載MCR,是個非常耗時間的操作(十幾秒)。另外第一次調用函數時也很慢,之後恢復正常速度。基本和matlab下識別一張圖片的時間等價(不到20ms)