概述
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.9buildinclude" -I"E:opencv2.4.9buildincludeopencv" -I"E:opencv2.4.9buildincludeopencv2" -L"E:opencv2.4.9buildx64vc12lib" -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.9buildinclude" -I"E:opencv2.4.9buildincludeopencv" -I"E:opencv2.4.9buildincludeopencv2"要给工程添加包含目录,-L"E:opencv2.4.9buildx64vc12lib"添加库目录,我的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)
最后
以上就是聪慧小鸽子为你收集整理的Matlab 调用opencv函数前期准备例子的全部内容,希望文章能够帮你解决Matlab 调用opencv函数前期准备例子所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复