opencv matlab 混合编程,混合编程MatlabMS VisualStudioOpenCV 混编说明

编程环境和工具:

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);

你可能感兴趣的:(opencv,matlab,混合编程)