MATLAB中编译单个或多个.CPP文件(包括带OPENCV库的.CPP文件)

目录

一、编译单个.CPP文件

二、编译多个.CPP文件

三、编译带OPENCV库的.CPP文件

四、所有代码下载链接: 


一、编译单个.CPP文件

myadd.cpp

#include <stdio.h>
#include "mex.h"
//matlab接口函数,nlhs输出变量的个数,plhs输出的变量,nrhs输入变量的个数,prhs输入的变量
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    mexPrintf("输入个数:%d\n", nrhs); //打印
    int number = mxGetScalar(prhs[0]); //将第一个输入参数转为Scalar标量,也就是单数值
    mexPrintf("第一个输入:%d\n", number); //打印
    double *intput1 = mxGetPr(prhs[0]);//获得double型数据,matlab默认就是double型
    double *intput2 = mxGetPr(prhs[1]);
    double *output;
    plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); //让第一个输出参数指向一个1*1的矩阵
    output = mxGetPr(plhs[0]); //获得矩阵的第一个元素的指针
    *output = *intput1+*intput2;    //执行加法运算
}

compile.m

delete('*.mex*')   %先删除已有的编译文件
mex myadd.cpp      %编译.cpp文件

运行myadd(1,2)

MATLAB中编译单个或多个.CPP文件(包括带OPENCV库的.CPP文件)

二、编译多个.CPP文件

myadd.cpp

#include <stdio.h>
#include "mex.h"
#include "square_add.h"
//matlab接口函数,nlhs输出变量的个数,plhs输出的变量,nrhs输入变量的个数,prhs输入的变量
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    mexPrintf("输入个数:%d\n", nrhs); //打印
    int number = mxGetScalar(prhs[0]); //将第一个输入参数转为Scalar标量,也就是单数值
    mexPrintf("第一个输入:%d\n", number); //打印
    double *intput1 = mxGetPr(prhs[0]);//获得double型数据,matlab默认就是double型
    double *intput2 = mxGetPr(prhs[1]);
    double *output;
    plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); //让第一个输出参数指向一个1*1的矩阵
    output = mxGetPr(plhs[0]); //获得矩阵的第一个元素的指针
    *output = square_add(*intput1,*intput2);    //执行平方加法运算
}

square_add.cpp

double square_add(double a, double b)
{
	return a*a+b*b;
}

 square_add.h

//定义函数
double square_add(double a, double b);

 compile.m

delete('*.mex*')   %先删除已有的编译文件
mex myadd.cpp square_add.cpp   %编译.cpp文件

运行myadd(1,2)

MATLAB中编译单个或多个.CPP文件(包括带OPENCV库的.CPP文件)

三、编译带OPENCV库的.CPP文件

mygrayscale.cpp

#include <opencv2/opencv.hpp>
#include "mex.h"
//matlab图像转opencv Mat矩阵所需库文件
#include "MxArray.hpp"
#include <vector>
using namespace std;
using namespace cv;
//matlab接口函数,nlhs输出变量的个数,plhs输出的变量,nrhs输入变量的个数,prhs输入的变量
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    vector<MxArray> rhs(prhs,prhs+nrhs);
    Mat img = rhs[0].toMat(); //转化为Mat矩阵
    Mat imggray;              //创建灰度图像矩阵
    cvtColor(img, imggray,CV_RGB2GRAY);
    plhs[0] = MxArray(imggray);//转化为matlab矩阵
}

compile.m

delete('*.mex*')   %先删除已有的编译文件
mex myadd.cpp square_add.cpp   %编译.cpp文件

if ispc     % Windows machine
    % set opencv include path
    opencv_include = 'D:\Softwares\OpenCV\opencv\build\include\';
    % set opencv lib path
    opencv_libpath = 'D:\Softwares\OpenCV\opencv\build\x64\vc12\lib\';

    files = dir([opencv_libpath '*opencv*.lib']);
    lib = [];
    for i = 1:length(files),
        lib = [lib ' -l' files(i).name(1:end-4)];
    end

    eval(['mex mygrayscale.cpp MxArray.cpp -I' opencv_include ' -L' opencv_libpath ' ' lib]);

elseif isunix   % Unix machine
    % set opencv include path
    opencv_include = '/usr/local/include/';
    % set opencv lib path
    opencv_libpath = '/usr/lib/x86_64-linux-gnu/';

    lib = [];
    files = dir([opencv_libpath '*opencv*.so']);
    for i = 1:length(files)
        lib = [lib ' -l' files(i).name(4:end-3)];
    end

    eval(['mex mygrayscale.cpp MxArray.cpp -I' opencv_include ' -L' opencv_libpath ' ' lib]);

end

 grayscale.m

myadd(1,2)
src=imread('predictions.jpg');
gray=mygrayscale(src);
figure;
subplot(1,2,1)
imshow(src)
title('原图');
subplot(1,2,2)
imshow(gray)
title('灰度图');

注:MxArray.hpp和MxArray.cpp可在文末下载。

运行grayscale.m

MATLAB中编译单个或多个.CPP文件(包括带OPENCV库的.CPP文件)

 

四、所有代码下载链接: 

https://download.****.net/download/qq_17783559/11041549