matlab与c/c++混合编程

假设我们有一个用c++写的读图并显示的函数:void imread(const char* imgpath, cv::Mat& img);这里用到了opencv的一些接口,那么怎样用matlab调用这个接口呢?要用到mex.h中定义的mexFunction函数,关于这个函数可以在matlab的help文档里学习。代码如下:

#include "opencv2/opencv.hpp"
#include "mex.h"

void imread(const char* imgpath, cv::Mat& img)
{
	img = cv::imread(imgpath);
	cvNamedWindow("image", 0);
	cv::imshow("image", img);
    cv::waitKey(100);
}

void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
	if (nrhs < 1)
	{
		mexErrMsgTxt("Not enough input arguments.\n");
	}
	else if (nrhs > 1)
	{
		mexErrMsgTxt("Too many input arguments.\n");
	}
	char imgpath[100];
	int imgpathlen = mxGetNumberOfElements(prhs[0]);
	mxGetString(prhs[0], imgpath, imgpathlen+1);//why plus 1, see matlab help document

	cv::Mat img;
	imread(imgpath, img);
	mexPrintf("image size: %d, %d\n", img.cols, img.rows);
	if (nlhs == 0)
	{
		return;
	}
	int rows, cols, channels;
	rows = img.rows;
	cols = img.cols;
	channels = img.channels();

	mexPrintf("channels: %d\n", channels);
	if (channels == 1)
	{
		mwSize dims[2] = {rows, cols};
		plhs[0] = mxCreateNumericArray(2, dims, mxUINT8_CLASS, mxREAL);
		cv::Mat tmpimg = img.t();
		memcpy(mxGetPr(plhs[0]), tmpimg.data, rows*cols*mxGetElementSize(plhs[0]));
	}
	else if (channels == 3)
	{
		mwSize dims[3] = {rows, cols, 3};
		plhs[0] = mxCreateNumericArray(3, dims, mxUINT8_CLASS, mxREAL);
		std::vector<cv::Mat> ch;
		split(img, ch);
		cv::Mat R = ch[2].t();
		int bitdepth = sizeof(uchar);
		memcpy((uchar*)mxGetData(plhs[0]), R.data, rows*cols*bitdepth);
		//mxGetPr返回值为double*,此处应为mxGetData,返回值为void*,须进行强制转换
		cv::Mat G = ch[1].t();
		memcpy((uchar*)mxGetData(plhs[0])+rows*cols*bitdepth, G.data, rows*cols*bitdepth);
		cv::Mat B = ch[0].t();
		memcpy((uchar*)mxGetData(plhs[0])+rows*cols*bitdepth*2, B.data, rows*cols*bitdepth);
		//opencv的Mat是按行存储,且顺序为BGR,即先存第一行:(B,G,R),(B,G,R)...
		//matlab的Mat是按列存储,且先存完R,再存G,再存B,即第一列:R;R;R...G;G;G...B;B;B...
	}
}

上述代码保存为imread.cpp文件,有了此代码,打开matlab,当前工作目录切换到imread.cpp所在的目录,matlab命令窗口中输入

 mex -IE:\opencv\build\include -LE:\opencv\build\x86\vc10\lib -lopencv_core248 -lopencv_highgui248  imread.cpp

关于mex的具体用法,可参见help,-I指定第三方头文件目录,-L指定第三方lib文件目录,-l指定lib文件目录下所依赖的具体lib,注意此处不能用opencv的debug库,最后是要编译的cpp文件。还有一种方法是采用mexopts.bat文件,在C:\Users\New\AppData\Roaming\MathWorks\MATLAB\R2010b\mexopts.bat下,可通过在并令窗口中输入fullfile(prefdir,'mexopts.bat')获得该文件的路径,一般不要在原文件中修改,而是把它考出来放到imread.cpp目录下,在其中添加依赖的第三方头文件和库目录,最后用mex -f mexopts.bat imread.cpp编译即可。

编译通过会生成一个imread.mexw32的文件,有了它,接口就生成了。命令窗口输入img=imread(path of image);即能成功显示图像并将图像数据存储在img中。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值