前一段时间转过一篇调用opencv库的文章
matlab调用opencv的函数,但是没有程序示例,这次用一个简单的图像拷贝来演示一次过程。
#include "mex.h"
#include "highgui.h"
#include "cv.h"
using namespace cv;
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
if (nrhs != 1 || mxGetClassID(prhs[0]) != mxUINT8_CLASS)
{
mexErrMsgTxt("The number of input should be 1, and type first input must be uchar.");
}
if (nlhs != 1)
{
mexErrMsgTxt("The number of output should 1");
}
uchar * pData;
int width, height;
pData = (uchar *) mxGetPr(prhs[0]);
height = mxGetM(prhs[0]);
width = mxGetN(prhs[0]);
// 复制数据
Mat srcImg(height, width, CV_8U);
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
srcImg.at
(i, j) = pData[height*j + i];
}
}
// 因为C与Matlab的存储方式不同,C是按行存储,Matlab是按列存储
// 所以将图片转置
Mat dstImg = srcImg.t();
/* output data */
mwSize dims[2] = {height, width};
plhs[0] = mxCreateNumericArray(2, dims, mxUINT8_CLASS, mxREAL);
memcpy(mxGetPr(plhs[0]), dstImg.data, mxGetNumberOfElements(plhs[0])*sizeof(uchar));
}
img = imread('muct-landmarks.jpg');
img = rgb2gray(img);
dst = genCopyImage(img);
dst = reshape(dst, size(img));
imshow(dst);
这里以OpenCV的cvtColor函数为例。程序编写完成后,在matlab下使用mex命令生成相应的mex文件:
mex -g genCopyImage.cpp -I'D:\Program Files\OpenCV2.4.6\opencv\build\include' -I'D:\Program Files\OpenCV2.4.6\opencv\build\include\opencv' -I'D:\Program Files\OpenCV2.4.6\opencv\build\include\opencv2' -L'D:\Program Files\OpenCV2.4.6\opencv\build\x86\vc9\lib' -lopencv_core246d -lopencv_highgui246d -lopencv_imgproc246d
注:
1、genCopyImage.cpp为生成MEX文件的主文件;
2、-I后的字符串为opencv头文件路径;
3、-L后的字符串为opencv的Lib路径,-lopencv_ml246d-lopencv_core246d,为程序运行所需的lib。
4、加入'-g'参数,可以生成可调试的mex文件,去掉它即生成不可调试的mex文件。
在matlab下编写程序mexTest.m 进行测试,最终得到输出结果。
如果运行过程中,Matlab出现:“... 找不到可用的指定模块”,是因为系统找不到对lib 相对应的动态链接库(windows下为dll文件),这时需要把动态链接库的路径加入到电脑 系统的环境变量中(加入后需注销或重启),或者放在执行文件的同级目录下。