编程环境和工具:
Windows XP SP3、MSVS 2005、Matlab R2009、OpenCV 1.0
折腾:
Matlab用于算法的开发测试,然后封装为DLL供C/CPP程序调用
OpenCV用于简化图像操作
1. Matlab编译工具配置
>> mbuild -setup
Select a compiler:
[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2009b\sys\lcc
[2] Microsoft Visual C++ 2005 SP1 in D:\Program Files\Microsoft Visual Studio 8
选择[2]并确认。
2. 将m程序文件输出为DLL文件
>> mcc -B cpplib:YourLibName a.m b.m c.m
编译完成后在当前目录下输出一堆文件,其中有用的文件包括:
YourLibName.h, YourLibName.lib, YourLibName.dll
这三个文件是接下去用VC混合编程所需要的,包含了Mablab算法的函数声明和实现。
3. VisualStudio环境配置
Tools->Options->Projects and Solutions->VC++ Directories,
在Include files中,添加:
D:\Program Files\MATLAB\R2009b\extern\include
在Library files中,添加:
D:\Program Files\MATLAB\R2009b\extern\lib\win32\microsoft
4. 在VC程序中包含必要的头文件和库文件
如在stdafx.h中,添加以下语句:
#include "YourLibName.h" // 包含matlab编译后生成的头文件
#pragma comment(lib, "YourLibName.lib") // 包含相应的库文件
#pragma comment(lib, "mclmcrrt.lib") // 包含混编所需要的运行时库文件
说明:
YourLibName.h文件中,已经包含了以下两个头文件,因此在vc工程中不需要重复包含:
#include "mclmcrrt.h" // 混编所需要包含的头文件
#include "mclcppclass.h" // 定义了mwArray等Matlab数据结构
5. 开始编写vc程序
首先,在程序初始化或者调用Matlab算法前,初始化库文件:
if (!mclInitializeApplication(NULL,0) ||!YourLibNameInitialize())
{
AfxMessageBox("error");
}
然后,参看YourLibName.h中的函数声明,开始编写程序吧!如其中一个函数foo声明为:
extern LIB_YourLibName_CPP_API void MW_CALL_CONV foo(intnargout, mwArray& out, const mwArray& in);
其中,第一个参数表示输出参数的个数;第二个参数为输出参数;第三个参数为输入参数。
参数使用Matlab混编特定的数据类型,因此需要将vc中的数据类型转换为Matlab所使用的数据类型(矩阵形式)。
比较有用的一个数据类即为 mwArray,该类的声明包含在"mclcppclass.h"。
类的定义和初始化:
mwArray in(m, n, mxUINT8_CLASS);
上述语句创建了一个mwArray类的实例in,其中m表示数据矩阵的行数,n表示数据矩阵的列数,mxUINT8_CLASS表示数据类型为8位无符号整型,可以指定更多类型的数据,详见帮助文件。
获取数据:
in.SetData(Data, m*n);
其中,Data为待赋值数据的头地址指针,数据长度为m×n。
注意,Matlab的习惯是按例读取和存储,因此Data中的数据按顺序取出来后,是按照先列再行的顺序依次填入in中的。
输出数据:
in.GetData(Data, m*n);
其