人家其他图像处理的小组都做完了project,我们小组还在争论用什么写。真蛋疼。自从组队后,我由用java写转成用c++,看到人家用matlab方便,然后我们组改成matlab。到现在,出现了分歧,有人喜欢c++,有人喜欢matlab。对于我这种喜欢偷懒的人,必然爱matlab啊。
然后我突然想起之前一段时间,高中同学刘景辉跟我提起他在搞一个project,结合使用vc++和matlab。不过他貌似通过dll来交互。于是我查了一下资料,没想到vc++和matlab的结合使用挺流行的,并且有很多方法。我就挑了一种我认为比较容易操作的方法试试,就是调用matlab的engine。关于调用engine的函数这篇博客有http://blog.sina.com.cn/s/blog_62466e480100l642.html。
不过在调用之前要做一些配置,有点烦。
1. 必须的步骤:
1.1. Vs中打开项目属性,点配置属性->vc++目录。
1.2. 在包含目录中添加如下
其中上面添加的目录为engine.h头文件所在的目录。
1.3. 在库目录下添加如下:
其中上面添加的目录为libmx.lib,libmat.lib,libeng.lib,
所在的目录
1.4. 点配置属性->链接器->输入,可以看到附加依赖项
1.5. 在附加依赖项中添加:libmx.lib;libmat.lib;libeng.lib三项。
此外,还要配置好环境变量,否则有些dll找不到,比如libmx.dll。
只要把dll所在的文件夹添加到环境变量的path中就可以了。我的电脑是F:\matlab\bin\win32。(在其他电脑运行一定要配置好这个环境变量)
关于配置问题,我参考了一下两个网页:
http://hi.baidu.com/magicdmer/blog/item/4eea2612871267dca6ef3f36.html
以下是加入高斯噪声的代码:
CString strPathName;
strPathName = GetPathName();
//我是用了ta的mfc的demo,GetPathName函数是原有的,就是返回图像的路径
mxArray *path,*img;
Engine *ep;
ep = engOpen(NULL);//打开引擎
if(ep == NULL)
exit(EXIT_FAILURE);
engSetVisible(ep,false);
path = mxCreateString(strPathName);
engPutVariable(ep,"fileName",path);//在matlab空间加入fileName变量,并赋值
engEvalString(ep,"K=imread(fileName)");//发送读图命令
engEvalString(ep,"J=imnoise(K,'gaussian',0,0.01)");//加入高斯噪声
img = engGetVariable(ep,"J");//这句没什么用,只是当初我想在c++显示图片,后来觉得,干脆直接用matlab显示图片吧
engEvalString(ep,"figure,imshow(J)");//调用matlab显示图片
效果图: