「復刻版」MATLAB関数を呼び出し対、DLLをコンパイルしています

オリジナル

MATLAB関数は、DLLをコンパイルし、対DLLのメソッドを呼び出しています

免責事項:この記事は従って、ブロガーオリジナル記事です。CC 4.0 BY-SAの著作権契約を、再現し、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/A15216111693/article/details/79232288

のDLLのステップにコンパイラMATLABの.mファイル:

この記事では、コンパイル済みのツールのみを使用する方法を説明し配備ツール

  1.   ツール配備ツールを開いて、配備ツールのコマンドを入力します

第三の選択肢を選択して「ライブラリコンパイラ」


トップを選択し、右エクスポートする機能を追加するためのプラス記号をクリックして、あなたはもっと追加することができますし、「エクスポート機能を追加」の次に、「C ++共有ライブラリ」のコーナーを左に


.M機能を追加した後、右端の「パッケージ」dllファイルを生成するために、それをクリックして、緑の選択に変わり


2メソッド呼び出しVS

本論文では、vs2015は、表示モード使用してDLLの呼び出し(DLL限り、主に面倒は、ないの.hと.libファイルません。)

  • 新しいコンソールプロジェクトコールDLLのテストを作成します。
  • これは、インターフェイスSDK MATLABおよびC ++のが含まれています
移動: - 属性-VC ++ディレクトリ - 右プロジェクトディレクトリ、追加.. \ MATLAB \ R2017a \にextern \含めます

ライブラリディレクトリを追加します。.. \ MATLAB \ R2017a \にextern \ libに\ win64の\マイクロソフト


リンカ - 入力 - 追加の依存、次のlibを追加

mclmcr.libの
mclmcrrt.lib

libmx.lib

libmex.lib

libmat.lib

libeng.lib

测试主函数

用deploytool生成dll时,也会生成.h文件,里面有用到的函数声明

如果要使用某个函数,先调用初始化函数(.h文件里面有它的声明),再调用你的功能函数

具体见下面的测试函数,这个是一个图像处理函数,哈哈


//MeterRecognizeDLL调用测试20180201
//采用mexFunction
void FuncMeterRecognizeDLL(cv::Mat I)
{
HINSTANCE h = LoadLibraryA("MeterRecognizeDLL.dll");

//DLL初始化函数
typedef bool(*pInitialize)(void);//初始化函数
pInitialize Initialize = NULL;
Initialize = (pInitialize)GetProcAddress(h, "MeterRecognizeDLLInitialize");//函数声明在.h文件里面

//MeterRecognizeDLL功能函数
typedef bool(*pmlx)(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);//mlxMeterRecognizeDLL 函数声明在.h文件里面
pmlx mlxMeterRecognizeDLL = NULL;
mlxMeterRecognizeDLL = (pmlx)GetProcAddress(h, "mlxMeterRecognizeDLL");


if (!Initialize()) //初始化,必需要有,不要怀疑哦
{
// system("pause");
cout << "Could not initialize" << endl;
exit(0);
}

// I是opencv图像数据结构
mxArray *是matlab c++形式的矩阵指针。
如何转换呢?
先定义一个 mxArray *指针
int M = I.rows; //图像的行数
int N = I.cols; //图像的列数
mxArray * pmxArray = mxCreateDoubleArray(M,N,mxREAL);
double* prmxArray = mxGetPr( pmxArray );
//I.data是opencv图像的头指针,prmxArray是matlab矩阵的头指针,使用memcpy将opencv图像数据复制到matlab矩阵当中
memcpy((double*)I.data,prmxArray ,sizeof(double)*M*N);

mxArray * ptArrayIn0 = cvMat2pMxArrayDouble(I);//输入

mxArray* ptArrayOut0 = mxCreateDoubleMatrix(1, 1, mxREAL);//输出
double *prOut0 = mxGetPr(ptArrayOut0);
*prOut0 = 0;

int nlhs = 1; //左边参数个数,即输出参数个数
 mxArray *plhs[] = { ptArrayOut0 };//输出
int nrhs = 1; //右 边参数个数,即输入参数个数
mxArray*prhs[] = { ptArrayIn0 };//输入

mlxMeterRecognizeDLL(nlhs, plhs, nrhs, prhs);// 功能函数
输出结果在 plhs中
plhs[0]:mxArray* 类型,第一个输出参数,依次类推,plhs[1],第二个
比如,查看输出结果
double* prOut0 = mxGetPr(plhs[0]);
for (int i=0;i <M*N;i++)
 cout<<*prOut0(i++)<<endl;

cv::Mat BW = pMxArrayDouble2cvMat(plhs[0]); //

}

整个过程中,可能会出现一些错误:







文章最后发布于: 2018-02-01 20:05:36

おすすめ

転載: www.cnblogs.com/miki123/p/11883201.html
おすすめ