Matlab与VC联合编程在数字水印工程中的应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Matlab与VC联合编程在数字水印工程中的应用
车敏;张红梅
【摘要】在软件研发过程中,为了缩短软件的研发周期,通常会借助Matlab提供的丰富的工具箱函数,但是基于Matlab开发的软件很难满足人性化用户界面的要求,为此要使用基于强大的图形界面编辑功能的VC开发环境.只有采用二者联合编程才能高效的完成软件的开发.采用传统的Matlab和VC联合编程方法因无法脱离Matlab的运行环境而仅适用于软件的试验阶段,而无法应用于工程开发中. 为了克服传统Matlab和VC联合编程方法的弊端,提出了一种可以脱离Matlab运行环境的VC与Matlab联合编程新方法,并已经成功应用数字水印工程的开发中的.【期刊名称】《现代电子技术》
【年(卷),期】2010(033)024
【总页数】3页(P55-57)
【关键词】MAT文件;MEX文件;Matlab引擎;数字水印
【作者】车敏;张红梅
【作者单位】空军工程大学,理学院,陕西,西安,710051;空军工程大学,理学院,陕西,西安,710051
【正文语种】中文
【中图分类】TN911-34
0 引言
Matlab是Matrix Laboratory的缩写,早期主要用于现代控制中复杂的矩阵、向量的各种运算。

时至今日,经过MathWorks公司各行业专家的不断完善,Matlab已经发展成为适合多学科,多种工作平台的大型软件。

在设计研究单位和工业部门,Matlab被广泛用于科学研究和解决各种具体问题[1]。

但是Matlab对界面的支持能力较差,所编写的软件不能脱离Matlab编程环境,所以仅用于前期试验性开发。

Visual C++(简称VC)是软件开发人员最常用的编程工具之一,具有强大的图形界面编程能力,而且代码执行效率高,运行稳定,目前被广泛应用于各行业工程的开发[2]。

数字水印技术是近几年发展起来的一项具有跨学科性质的新技术,通过向多媒体数据(如图像、声音、视频等)中添加某些图像、数字信息以达到文件真伪鉴别、版权保护等功能[3]。

在数字水印工程开发的过程中,通过Matlab实现其核心算法,通过VC实现其唯美的软件界面无疑是最快捷、实用的编程途径。

但是目前传统的Matlab与VC联合编程方法无法脱离Matlab运行环境,本文给出了一种可以脱离Matlab环境的联合编程方法并成功应用于数字水印工程的开发,为Matlab与VC联合编程提供了一种全新的、行之有效的工程编程方式。

1 传统的VC与Matlab联合编程方法
Matlab提供与其他高级语言的接口包括:Matlab计算引擎、MEX文件;另外借助第三方软件Matcom也可以实现由Matlab 到VC++的代码转换[4] 。

Matlab计算引擎是一系列允许用户在别的程序中与Matlab交互的函数库和程序库。

Matlab计算引擎采用了客户机/服务器的体系结构,通过Windows的ActiveX通道或Unix的管道和Matlab进行连接。

实际应用中,客户的程序作为前端客户机,通过Matlab计算引擎在后台与Matlab服务器建立连接,实现动态的通信。

该种方法的缺点是必须有一个机器上安装有Matlab软件。

对于工程软件来说,要求用户安装Matlab软件是不现实的。

MEX文件是Matlab的外部程序调用接口,是一种具有特定格式的文件,用C语
言或Fortran语言编写,通过Matlab的API 函数库对其进行编译,生成一种动
态链接函数。

通过MEX文件进行Matlab与VC联合编程和通过Matlab引擎进
行联合编程有一个共同点的缺点,就是无法脱离Matlab运行环境。

通过第三方软件MATCOM 可以解决联合编程出的可执行程序无法脱离Matlab
运行环境的问题。

MATCOM是MathTools公司开发的一款软件,可以实现由Matlab 到VC++的代码转换,提供对Matlab程序解释执行和开发环境支持,同时具备Matlab的优良算法和VC++的高效执行特性。

但是对于小波、图像处理等方面代码不能实现转换。

尤其对于Matlab 6.5以后版本中的很多函数难以实现转换。

综上所述,目前并无完美的Matlab与VC联合编程方法来满足工程应用的需要。

所以必须研究更为实用的满足工程性要求的联合编程方法。

2 通过MAT文件进行Matlab与VC联合编程
2.1 MAT文件简介
MAT文件是Matlab系统保存文件的默认文件格式,这种格式为不同平台或不同
应用程序间交换Matlab数据提供了一种便利机制。

MAT文件不仅可以在Matlab中进行访问、读/写操作,Matlab同时也提供了一
套可供其他语言调用的API函数集。

通过这些函数,可以在VC中访问MAT文件,这样就在Matlab和VC之间建立了一条数据交换的途径[5]。

通过MAT文件可以存储Matlab计算中复杂运算的结果,同时VC通过访问MAT文件可以随时将计
算结果进行分析或者可视化处理,并直观地显示给用户。

2.2 Matlab中MAT文件的使用
在Matlab与VC联合编程的过程中,可以利用Matlab实现需要的核心算法,并将运算结果存储在MAT文件中。

在实现算法前,首先必须确定Matlab算法与VC程序之间进行信息交换需要的接口数据,并完成MAT文件的定义。

(1) MAT文件的格式[6]
了解MAT文件的格式首先需要了解Matlab支持的数据类型。

阵列(array)是Matlab语言惟一能够处理的数据对象,Matlab所有的基本数据类型:数量(scalar)、向量(vector)、矩阵(matrix)、字符串(string)、单元阵列(cell array)、结构体(structure)都属于阵列对象,只不过是阵列对象的不同构成方式。

所有要交换的数据在Matlab和VC中都必须有定义。

(2) 在Matlab中实现核心算法并将结果存储在MAT文件中
在Matlab中通过其丰富的工具箱函数实现核心算法,需要将计算的结果存储在MAT文件中。

首先完成MAT文件的定义,然后在Matlab的m文件中可以使用以下函数实现对MAT文件的操作。

save(′MATfile.mat′,′VarName′);//实现在文件名为MATfile的MAT文件中存入变量VarName;
MATFile pMAT;load(′MATfile.mat′);//在Matlab中导入文件名为MATfile.mat 的MAT文件
(3) 生成可执行文件
在Matlab中将m文件生成可执行文件的操作步骤如下:
运行mex-setup和mbuild-setup分别设置好Matlab的编译环境;
用mcc-B sglcpp <主文件.m>生成可执行文件。

2.3 VC中MAT文件的使用
在VC中要使用MAT文件,首先必须完成VC环境设置。

在VC的程序可以通过ShellExecute调用在Matlab下生成的可执行文件或者直接调用Matlab的数学库完成核心计算,然后读取MAT文件中存储的运算结果,进行分析或显示[7]。

(1) VC环境的设置
使用MAT文件时VC环境设置如下:
(2) 将Matlab安装目录中extern\lib\win32\microsoft\msvc60下的libmat.lib,libmx.lib以及libeng.lib复制到当前目录下;将Matlab安装目录中
extern\include下的mat.h,matrix.h,engine.h,tmwtypes.h复制到当前目录下;将Matlab安装目录中bin\win32下的libmat.dll、libmx.dll、libut.dll、libeng.dll复制到当前目录下。

在VC的Projection→Setting→Link→General以及Input下的Object/Library Modules中添加libmat.lib,libmx.lib以及libeng.lib。

在VC的工程中添加#include “mat.h”。

(3) VC中MAT文件的调用[3]
在VC下可以通过以下函数实现对MAT文件的读/写:
MatOpen: 打开/创建一个MAT文件;
MatClose: 关闭一个MAT文件;
matPutArray: 把矩阵存储入MAT文件;
matPutVariable: 把变量存储到MAT文件;
memcpy: 实现VC与Matlab间不同类型变量的相互赋值;
3 联合编程在数字水印工程中的应用
在数字水印工程开发过程中,核心部分是离散傅里叶变换[8],VC中较难编程实现的还包括数字水印提取后图像的显示。

下面就这两部分的核心部分举例实现。

通过Matlab提供的函数库在VC中实现的水印嵌入[9]以及提取过程[10]的核心代码如下:
double DX[200000];
double DY[200000];
mxArray *A=NULL;
A=mxCreateNumericMatrix(N,1,mxDOUBLE_CLASS,mxCOMPLEX); memcpy(mxGetPr(A),&DX,mxGetM(A)*sizeof(double)); memcpy(mxGetPi(A),&DY,mxGetM(A)*sizeof(double)); mxArray *FA=NULL;
mlfAssign(&FA,mlfFft(A,NULL,NULL)); EmbedWatermarking(FA);
//水印嵌入
//PickWatermarking(FA);
//水印提取
mlfAssign(&A,mlfFft(FA,NULL,NULL));
mxDestroyArray(FA);
memcpy(&DX,mxGetPr(A),mxGetM(A)*sizeof(double)); memcpy(&DY,mxGetPi(A),mxGetM(A)*sizeof(double)); mxDestroyArray(A);
在VC中通过MAT文件实现水印图像名的传输代码如下:
const char *Matfile="myMAT.mat";
MATFile *pmat;
pmat = matOpen(Matfile, "w");
if (pmat == NULL) {
::MessageBox(NULL,"MAT文件创建失败!","提示!",MB_OK);
return FALSE; }
CString strImagename;
mxArray *pa1;
pa1 = mxCreateString(strImagename.GetBuffer(50)); strImagename.ReleaseBuffer();
mxSetClassName(pa1, "Imagename");
matPutVariable(pmat, "Imagename", pa1);
mxDestroyArray(pa1);
if (matClose(pmat) != 0) {
::MessageBox(NULL,"MAT文件关闭失败!","提示!",MB_OK);
return FALSE;
}
在Matlab中实现的数字水印的显示代码如下:
MATFile pMAT;
pMAT = load(′myMAT.mat′);
WatermarkName =pMAT.Imagename;
I=imread(WatermarkName);
H_fig=figure;
set(H_fig,′MenuBar′,′none′);
set(H_fig,′Name′,′数字水印′);
set(H_fig,′NumberTitle′,′off′);
imshow(I);
在VC下利用Matlab开发的核心算法提取出的数字水印图像如图1所示。

图1 VC下调用Matlab提取出的水印图像
4 结语
联合编程方法在数字水印工程开发中的成功使用,证明本文所提出的Matlab与VC联合编程方法,可以完全脱离Matlab运行环境的限制,是一种名副其实的、
可以十分方便地应用于工程开发的联合编程方法。

参考文献
[1] 张志勇.精通Matlab 6.5[M].北京:北京航空航天大学出版社,2003.
[2] 赵辉,叶子青.Visual C++系统开发实例精粹[M].北京:人民邮电出版社,2005.
[3] 张海涛,李兆平,孙乐兵.地理信息水印系统的开发[J].测绘通报,2004(15):42-45.
[4] 飞思科技产品研发中心.Matlab 6.5应用接口编程[M].北京:电子工业出版社,2003.
[5] 刘志俭,潘献飞,连军想.Matlab外部程序接口(6.X)[M].北京:科学出版
社,2002.
[6] 董长虹.Matlab接口技术与应用[M].北京:国防工业出版社,2004.
[7] 周长发.精通Visual C++图像处理编程[M].3版.北京:电子工业出版社,2006.
[8] YEO In-Kwon, KIM Hyoung Joong. Modified patchwork algorithm: a novel audio watermarking scheme [J]. IEEE Transactions on Speech and Audio Processing, 2003, 11(4): 381-386.
[9] BAINI M, BARTOLINI F,CAPPELLINI V, et al. Copyright protection of digital images by embedded unperceivable marks [J]. Image and Vision Computing, 1998, 5: 897-906.
[10] 卢开澄.计算机密码学:计算机网络中的数据保密与安全[M].2版.北京:清华大学出版社,2002.。

相关文档
最新文档