法一(常用方法):使用engine。
1、添加matlab環境:
在vs2013中vc-directory中添加matlab的excutable 、include、library的directory
Include:
E:\matlab2014\extern\include
Library:
E:\matlab2014\extern\lib\win64\microsoft
然後再linker的input中添加依賴項:
mclmcr.lib
mclmcrrt.lib
mclbase.lib
mclcommain.lib
libmex.lib
libmx.lib
libmat.lib
libeng.lib
然後再在系統環境變量中添加:
E:\matlab2014\bin\win64
ps:注意選擇平臺,是64位還是32位要對應,不然報錯。
2、然後使用
Engine *ep;
if(!(ep = engOpen("")))
{
cout << "ERROR";
}
打開engine,下面主要介紹如何將參數傳進去(主要是c++中的類):
mxCreateStructMatrix函數:
mxArray *mxCreateStructMatrix(mwSize m, mwSize n, int nfields,
const char **fieldnames);
m爲要建立的結構體的個數,n爲結構體的每個成員變量的數組數(這個一般就是1!!!若是2則會出現現params.xxx有2個cell),nfields爲成員變量的個數,fieldnames爲成員變量名):
mxSetField()函數:
void mxSetField(mxArray *array_ptr, int index,
const char *field_name, mxArray *value);
array_ptr爲struct指針,index爲數組索引,即上面說的那個n,在create的時候如果設置爲1表示此成員在此struct裏面就一個,故set的時候index = 0(c++從0開始索引).
const char* fields[] = { "padding", "output_sigma_factor", "sigma", "lambda", "learning_rate", "compression_learning_rate", "non_compressed_features", "compressed_features", "num_compressed_dim", "w2c", "pos","z_npca", "z_pca", "alphaf_num", "alphaf_den", "old_cov_matrix", "projection_matrix", "positions", "max_response","im","target_sz","sz"};
mxArray *params = mxCreateStructMatrix(1,1,22, fields);
mxSetField(params, 0, "padding", mxCreateDoubleScalar(1.0));
mxSetField(params, 0, "output_sigma_factor", mxCreateDoubleScalar(1.0 / 16));
mxSetField(params, 0, "sigma", mxCreateDoubleScalar(0.2));
mxSetField(params, 0, "lambda", mxCreateDoubleScalar(1e-2));
mxSetField(params, 0, "learning_rate", mxCreateDoubleScalar(0.075));
mxSetField(params, 0, "compression_learning_rate", mxCreateDoubleScalar(0.15));
mxSetField(params, 0, "non_compressed_features", mxCreateString("gray"));
mxSetField(params, 0, "compressed_features", mxCreateString("cn"));
mxSetField(params, 0, "num_compressed_dim", mxCreateDoubleScalar(2));
mxSetField(params, 0, "w2c", pMxArray);
.......
法二:建立c++ shared library
此方法老是出現問題在調試的時候竟然是opencv的函數出了問題。。。。。
步驟:
1.matlab命令行輸入deploytool
2.選擇Library Compiler
3.建立compiler
4.此過程大概會有好幾分鐘到幾十分鐘,然後得到如下幾個文件:
在for_testing或者for_redistribution_files_only裏找到下面3個文件:
這3個文件事實上就是自己的庫了,然後照添加庫的操作把其添加到自己的環境中即可。我的方法:將dll文件拖入c:\system32中(或者通過動態鏈接庫來做,不過c++做這個比較麻煩,直接拖最快),.lib的文件路徑直接加到vc directory中,然後.h文件加入工程。
5調用的時候需要初始化,並且任何根matlab數據結構有關的操作都應該是在….之中,否則會報錯,無法初始化:
mclInitializeApplication(NULL, 0);
xxxxInitialize();
....
xxxxTerminate();
mclTerminateApplication();