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