如何让opencv成为MATLAB中的一个工具箱

来源:互联网 发布:json remove key 编辑:程序博客网 时间:2024/05/01 21:15

如何让opencv成为MATLAB中的一个工具箱

前言

谈到图像处理的编程工具,MATLAB和opencv是最经常提到的,两者各有优缺点,比如,MATLAB的数据可视化做得很好,而且还有其它可以方便调用的工具箱,但是在图像的处理上面,不如opencv中的函数完备,使用opencv的库,数据可视化不好。如何将两者结合起来,那么编程效率肯定会大大提高。本文介绍如何将opencv中实现的函数变成MATLAB中可以调用的类似脚本一样的文件。其关键是利用的MATLAB提供的mex编译工具。

目录

  • 如何让opencv成为MATLAB中的一个工具箱
    • 前言
    • 目录
    • 关于mex文件
    • 下载mexopencv
    • 编译安装

关于mex文件

MEX文件是一种可在matlab环境中调用的C(或fortran)语言衍生程序,MEX文件的后缀名按32位/64位分别为 .mexw32/.mexw64。MEX文件是由C或Fortran语言编写的源代码,经matlab编译器处理而生成的二进制文件。它是可以被matlab解释器自动装载并执行的动态链接程序,类似windows下的dll文件。

MEX文件实现了一种其它语言与MATLAB的接口,通过MEX文件可以在MATLAB中像调用内嵌函数一样调用使用C语言和Fortran等语言编写的函数,实现了代码重用,同时也能提高MATLAB环境中数据处理的效率。

利用MATLAB自带的mex编译工具编译一个c程序的例子:

#include "mex.h"//编写mex输出函数void mexFunction ( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ){   double* pin1, *pin2, *pout;   int m,n;   pin1 = mxGetPr(prhs[0]);   pin2 = mxGetPr(prhs[1]);   m = mxGetM(prhs[0]);   n = mxGetN(prhs[0]);   plhs[0] = mxCreateDoubleMatrix(m,n, mxINT32_CLASS,mxREAL);   pout = mxGetPr(plhs[0]);   printf("test mex\n");   for(int i=0;i<m;i++)   {       for(int j=0;j<n;j++)       {           *(pout+n*i+j) = *(pin1+n*i+j) + *(pin1+n*i+j);       }   }}

在MATLAB中编译:mex test_mex.c

完成后,test_mex就相当于MATLAB中的的函数,可以直接调用。

说明:

mex文件的编写格式:

#include "mex.h"void mexFunction ( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ){}

nlhs 是输出参数个数

plhs 是输出参数指针

nrhs 是输入参数个数

prhs 是输入参数指针

操作输入数据:

mxGetPr 得到数据的指针地址

mxGetM 和 mxGetN 得到矩阵数据的行和列 (返回整数)

对于实矩阵,我们可以定义 double *M; 来对实矩阵数据操作。

double *M;int m,n;M = mxGetPr(prhs[0]);   //指针指向第一个参数的数据地址m = mxGetM(prhs[0]);n = mxGetN(prhs[0]);

操作输出数据:

对于输出数据,需要首先用专门的mex函数分配内存空间,

plhs[0] = mxCreateDoubleMatrix(m,n, mxINT32_CLASS,mxREAL); //生成m x n 的实矩阵

同输入数据一样,要对输出数据操作,我们也需要一个指向数据的指针变量,

double *A;A = mxGetPr(plhs[0]);

注意:MATLAB矩阵数据的存储顺序是”从上到下,从左到右的,这点和Fortran是一样的。也就是说对于MATLAB的m x n的矩阵A。 A(1,1) 就是 M,A(2,1) 就是 (M+1) ,以此类推,A(i,j) 就是 *(M + m(j-1) + (i-1))

利用MATLAB自带的mex编译工具,有所限制,在源程序中只能调用一些C的标准库,不能调用opencv的库。在github上有人已经开发了一个mex工具包,提供了部分opencv库向MATLAB的转换的mex文件,我们可以下载我编译,还可以自己编写mexFunction并利用工具包中的mex编译工具添加相应的函数。

下面介绍安装的步骤。

下载mexopencv

在github上选择相应的版本下载,下载地址

下载后解压。

编译安装

文件中的readme.md文件有详细的安装教程,针对不同的平台(Linux、windows)

在windows下的安装步骤(在这之前先安装好opencv哦):

  1. 配置mex工具

    打开MATLAB,在命令行中输入:

    mex -setup
  2. 编译

    将MATLAB的工作目录切换至下载文件的根目录,

    mexopencv.make('opencv_path', 'C:\OpenCV\build')

    注意:以上的opencv的目录要根据自己情况而定。下面是较为漫长的编译过程,之后我们就可以在MATLAB调用opencv的相应的函数,比如cv.findContours()

  3. 生成帮助文档

    addpath('utils');MDoc;

原创粉丝点击