天天看點

Matlab 調用opencv函數前期準備例子

Matlab 調用opencv函數

  • 前期準備
  • 例子

前期準備

使用matlab2018a和vs2015(先安裝),網上一般将mex -setup作為第一步。首先在matlab指令行視窗(不需要考慮檔案路徑)輸入mex –setup。出現

Matlab 調用opencv函數前期準備例子

這裡是警告,可以忽略。網上有的部落格說,MATLAB和vs安裝的先後順序将影響使用,通過下面方法https://blog.csdn.net/xiamentingtao/article/details/77981336,可以解決問題不用重新安裝。我是一次成型,沒有驗證真假。

例子

寫一個例子,matlab調用vs程式進行矩陣運算。

Matlab 調用opencv函數前期準備例子

先上代碼後解釋

(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中配置環境,見下圖。

Matlab 調用opencv函數前期準備例子

後面那一些-lopencv_calib3d249,相當于添加附加依賴項,見下圖

Matlab 調用opencv函數前期準備例子

(3) 在matlab指令窗下執行,指令行視窗所在路徑下應有test.mexw64檔案

a=[1,2,3;4,5,6]
b=[1;2;3]
c=test(a,b)
           

繼續閱讀