MATLAB中编译单个或多个.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)
二、编译多个.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)
三、编译带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