Matlab 調用opencv函數
- 前期準備
- 例子
前期準備
使用matlab2018a和vs2015(先安裝),網上一般将mex -setup作為第一步。首先在matlab指令行視窗(不需要考慮檔案路徑)輸入mex –setup。出現
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLwYzN4IzM1EjM1ITNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
這裡是警告,可以忽略。網上有的部落格說,MATLAB和vs安裝的先後順序将影響使用,通過下面方法https://blog.csdn.net/xiamentingtao/article/details/77981336,可以解決問題不用重新安裝。我是一次成型,沒有驗證真假。
例子
寫一個例子,matlab調用vs程式進行矩陣運算。
先上代碼後解釋
(1) 建立1個test.cpp
#include <iostream>
#include "mex.h"
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
Mat mat1,mat2,mat3;
/*輸入1*/
double *data;
int M,N;
data=mxGetPr(prhs[0]);//擷取矩陣首位址
M=mxGetM(prhs[0]); //擷取行
N=mxGetN(prhs[0]);//擷取列
mat1 = Mat::zeros(M, N, CV_32FC1);
for(int j=0;j<N;j++)
for(int i=0;i<M;i++)
mat1.at<float>(i,j)=data[j*M+i];
/*輸入2*/
data=mxGetPr(prhs[1]);
M=mxGetM(prhs[1]);
N=mxGetN(prhs[1]);
mat2 = Mat::zeros(M, N, CV_32FC1);
for(int j=0;j<N;j++)
for(int i=0;i<M;i++)
mat2.at<float>(i,j)=data[j*M+i];
/*計算*/
mat3=mat1*mat2;
/*輸出1*/
plhs[0]=mxCreateDoubleMatrix(mat3.rows,mat3.cols,mxREAL);//建立想要輸出矩陣大小
data=mxGetPr(plhs[0]);
for (int j=0;j<mat3.cols;j++)
for (int i=0;i<mat3.rows;i++)
data[j*mat3.rows+i]=mat3.at<float>(i,j);
}
下面是分析過程
mexFunction内部有4個輸入參數,假設在matlab中寫[a,b]=test(c,d,e),那麼
nlhs=2,代表輸入數量
plhs[0]相當于a,plhs[1]相當于b
nrhs=3,代表輸出數量
prhs[0] 相當于c,prhs[1] 相當于d,prhs[2] 相當于e,
plhs與prhs是以指針的形式在記錄資料,是以要明白矩陣結構體等指針存放資料原則,這裡以矩陣為例,mxGetPr擷取矩陣的首位址,矩陣按列放入指針中,其餘資訊可以參照注釋。其他接口規範可以參考https://www.cnblogs.com/haoyul/p/5606720.html。
(2) 編譯test.cpp生成test.mexw64檔案。在test.cpp所在檔案夾下目錄下,在指令行視窗輸入
>> mex test.cpp -I"E:\opencv2.4.9\build\include" -I"E:\opencv2.4.9\build\include\opencv" -I"E:\opencv2.4.9\build\include\opencv2" -L"E:\opencv2.4.9\build\x64\vc12\lib" -lopencv_calib3d249 -lopencv_contrib249 -lopencv_core249 -lopencv_features2d249 -lopencv_flann249 -lopencv_gpu249 -lopencv_highgui249 -lopencv_imgproc249 -lopencv_legacy249 -lopencv_ml249 -lopencv_nonfree249 -lopencv_objdetect249 -lopencv_ocl249 -lopencv_photo249 -lopencv_stitching249 -lopencv_superres249 -lopencv_ts249 -lopencv_video249 -lopencv_videostab249
下面是分析過程:
這裡mex為編譯指令,test.cpp為編譯檔案,–I"E:\opencv2.4.9\build\include" -I"E:\opencv2.4.9\build\include\opencv" -I"E:\opencv2.4.9\build\include\opencv2"要給工程添加包含目錄,-L"E:\opencv2.4.9\build\x64\vc12\lib"添加庫目錄,我的opencv在"E:\opencv2.4.9"下,這兩步相當于在opencv在vs中配置環境,見下圖。
後面那一些-lopencv_calib3d249,相當于添加附加依賴項,見下圖
(3) 在matlab指令窗下執行,指令行視窗所在路徑下應有test.mexw64檔案
a=[1,2,3;4,5,6]
b=[1;2;3]
c=test(a,b)