使用MatConvNet生成一個字符識別的動態鏈接庫(下)

用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)

發佈了37 篇原創文章 · 獲贊 31 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章