Matlab和C++混合編程

1 利用 mexopencv 實現各類數據的轉換

int i = MxArray(prhs[0]).toInt();
double d = MxArray(prhs[0]).toDouble();
bool b = MxArray(prhs[0]).toBool();
std::string s = MxArray(prhs[0]).toString();
cv::Mat mat = MxArray(prhs[0]).toMat(); // For pixels
cv::Mat ndmat = MxArray(prhs[0]).toMatND(); // For N-D array
cv::Point pt = MxArray(prhs[0]).toPoint();
cv::Size siz = MxArray(prhs[0]).toSize();
cv::Rect rct = MxArray(prhs[0]).toRect();
cv::Scalar sc = MxArray(prhs[0]).toScalar();
cv::SparseMat s = MxArray(prhs[0]).toSparseMat(); // Only double to float
plhs[0] = MxArray(i);
plhs[0] = MxArray(d);
plhs[0] = MxArray(b);
plhs[0] = MxArray(s);
plhs[0] = MxArray(mat);
plhs[0] = MxArray(ndmat);
plhs[0] = MxArray(pt);
plhs[0] = MxArray(siz);
plhs[0] = MxArray(rct);
plhs[0] = MxArray(sc);
plhs[0] = MxArray(sp); // Only 2D float to double

2 Matlab struct/cell to C++

例1 :for struct:
matlab.m 文件中:數組

options.name=’xlh’;
options.age=25;
options.arr=[10 20 30;5 6 7];

調用函數:markdown

res=mex_function(options);

mex_function.cpp 文件中:函數

/* * pm [index].fieldname,所以,options 是一個 1*1 的結構體,故下面的函數中第二個參數爲 0 * 其中 pm 是 mxArray *類型。 */
mxArray *mx_name=mxGetField(prhs[0],0,’name’);
//下面用兩個方法得到 name 中的’xlh’:
//for mexopencv
string str_name=MxArray(mx_name).toString();
//for mx
char * str_name= mxArrayToString(mx_name);

例2:for cell:
matlab.m 文件中:ui

opt_param.table{1,1}=[1 2 3 4 5];
opt_param.table{1,2}=[6 7 8 9 10];
opt_param.table{2,1}=[11 12 13 14 15];
opt_param.table{2,2}=[16 17 18 19 20];

調用函數:lua

res=mex_function(options);

mex_function.cpp 文件中:spa

mxArray *table=mxGetField(prhs[0],0,’table’); //獲取 table 元胞。
mxArray *elem=mxGetCell(table,1);//獲取 table 元胞中的第二個元素,由於 matlab 是按列存儲的,mxGetCell 函數中的 1,表示索引, 多維數組的索引計算參考 matlab 幫助文檔中。
Mat mat=MxArray(elem).toMat();

所以:mat 的結果爲:[11 12 13 14 15]。注意輸出數據安裝 mat.at輸出,由於 matlab 中
的數字的存儲默認爲 double 類型。code

3 C++ to Matlab struct/cell

matlab.m 文件中:xml

table=mex_function(img);//其中 img 是一個圖像.
mex_cpp 文件中;
咱們的目的是想實現 C++中的 plhs[0]( 即輸出參數) 傳到 matlab 有以下的形式(即元胞的
形式):
table{1,1}=feature_vector
table{1,2}= feature_vector

table{n,n}=feature_vector;
其中 feature_vector 是一個列矢量,也能夠是一個圖像矩陣。索引

mex_cpp 文件中:接口

mxArray * mx_cell=mxCreateCellMatrix(2,2);//建立2*2大小的cell plhs[0]=mx_cell;//使輸出指向這個cell Mat feature1=(Mat_<double>(1,5)<<1,2,3,4,5); Mat feature2=(Mat_<double>(1,5)<<6,7,8,9,10); Mat feature3=(Mat_<double>(1,5)<<11,12,13,14,15); Mat feature4=(Mat_<double>(1,5)<<16,17,18,19,20); mxArray * mx_feat1=MxArray(feature1);//使用mexopencv實現,也能夠使用mx函數實現。 mxArray * mx_feat2=MxArray(feature2); mxArray * mx_feat3=MxArray(feature3); mxArray * mx_feat4=MxArray(feature4); mxSetCell(plhs[0],0,mx_feat1); mxSetCell(plhs[0],1,mx_feat2); mxSetCell(plhs[0],2,mx_feat3); mxSetCell(plhs[0],3,mx_feat4);

註釋:
Matlab和C++的接口信息均可以經過下面的方式查詢:

matlab->Advanced Software Development->MATLAB API for Other Languages->C/C++ Matrix Libray API
API 描述
Data Types 數據類型
Create or Delete Array 建立/刪除數組
Validate Data 檢驗數據的類型/有效性
Access Data 訪問數據
Convert Data Types 轉換數據類型
相關文章
相關標籤/搜索