Matlab 调用opencv函数

    xiaoxiao2023-11-21  172

    Matlab 调用opencv函数

    前期准备例子

    前期准备

    使用matlab2018a和vs2015(先安装),网上一般将mex -setup作为第一步。首先在matlab命令行窗口(不需要考虑文件路径)输入mex –setup。出现 这里是警告,可以忽略。网上有的博客说,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)
    最新回复(0)