我是靠谱客的博主 聪慧小鸽子,最近开发中收集的这篇文章主要介绍Matlab 调用opencv函数前期准备例子,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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函数前期准备例子所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部