使用C++语言读取*.mat文件中的数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Destiny0321/article/details/54138434

简介:借助于Matlab的接口函数,在Visual Studio中使用C++语言读取*.mat文件中的数据(这里主要是2维矩阵(灰度图像)和3维矩阵(彩色图像))到OpenCV中的Mat数据结构中并显示图像,同时实现将灰度图像转化为伪彩色图像(类型为Matlab中的colormap jet),最后调用Windows的API函数实现窗口尺寸的自由调整。

源代码下载地址:http://download.csdn.net/detail/destiny0321/9730563


工具:(1)Matlab R2015b(x64) (2)Visual Studio 2013 (3)OpenCV 3.0.0


一、 在Visual Studio配置Matlab和OpenCV

假设Matlab的安装路径为“E:\Program Files\MATLAB”,OpenCV的安装路径为“E:\Program Files\opencv”。

1. 配置环境变量

在“控制面板》系统和安全》系统》高级系统设置》环境变量》系统变量”中找到变量名“Path”,编辑之,在变量值的末尾添加“;E:\Program Files\MATLAB\R2015b\bin\win64;E:\Program Files\opencv\build\x64\vc12\bin”。如下图所示。

图1

2. 配置配置管理器

在Visual Studio 2013中新建一个“Win32控制台应用程序”,在菜单栏“生成”中打开“配置管理器”选项。将“活动解决方案平台”中的“Win32”选为(新建为)“x64”。如下图所示。
图2

3. 配置属性管理器

在菜单栏“视图”中打开“属性管理器”选项,右键点击Debug|x64下的Microsoft.Cpp.x64.user并打开“属性”选项,如下图所示。
图3

在“Microsoft.Cpp.x64.user属性页”中找到“通用属性”下的“VC++目录”,在其右侧的“包含目录”下添加路径“E:\Program Files\opencv\build\include”、“E:\Program Files\opencv\build\include\opencv”、“E:\Program Files\opencv\build\include\opencv2”、“E:\Program Files\MATLAB\R2015b\extern\include”、“E:\Program Files\MATLAB\R2015b\extern\include\win64”,一共5个路径。然后在“库目录”下添加路径“E:\Program Files\opencv\build\x64\vc12\lib”、“E:\Program Files\MATLAB\R2015b\extern\lib\win64\microsoft”,一共2个路径,如下图所示。
图4

在“通用属性”下的“链接器”中找到“输入”选项,在右侧的“附加依赖项”中添加库“opencv_ts300.lib”、“opencv_world300d.lib”、“opencv_world300.lib”、“libmat.lib”、“libmx.lib”、“libmex.lib”、“libeng.lib”,一共7个库,如下图所示。
图5

到此,所有配置工作到此结束。


二、 data.mat文件中数据介绍

为了便于测试,本文在Matlab中创建了3个变量:mat2D、mat3D、lena,并使用命令“save”将3个变量保存到data.mat中。3个变量的说明如表1所示。


表1

Name Value
mat2D 4×5 double
mat3D 2×4×3 double
lena 1×1 struct



变量mat2D是一个4×5的矩阵,在Matlab的表示如下图所示。
图6


变量mat3D是一个2×4×3的矩阵,在Matlab的表示如下图所示。
图7


变量lena是一个结构体,其说明如表2所示。


表2

Field Value
lenaColor 400×500×3 uint8
lenaGray 400×500×3 uint8

域lenaColor是400×500的彩色lena图像。
域lenaGray是400×500的灰度lena图像。

三、 读取data.mat文件中的数据

1. 相关函数介绍

a. matOpen:打开.mat文件。如果想打开文件“data.mat”,则MATFile pMF = matOpen(“data.mat”,”r”);


b. matClose:关闭*.mat文件。如果想关闭文件“data.mat”,则matClose(pMF);


c. matGetVariable:获取变量,对应于表1中的“Name”。如果想获取变量“mat3D”,则mxArray* pA = matGetVariable(pMF,”mat3D”);


d. matGetPr:获取变量的实部数据。如果想获取变量“mat3D”的实部,则double* pAReal = mxGetPr(pA);


e. mxGetNumberOfDimensions:返回变量的维度。如果想获取变量“mat3D”的维度,则int D = mxGetNumberOfDimensions(pA);此时D = 3;对于变量“mat2D”,D = 2


f. mxGetM:获取变量的行数。如果想获取变量“mat3D”的行数,则 int M = mxGetM(pA);此时M = 2;对于变量“mat2D”,M = 4


g. mxGetN:获取变量在mxArray中的列数。如果想获取变量“mat3D”的实际列数,则 int N = mxGetN(pA)/D;此时,N = 4;假设pA已经指向变量“mat2D”,对于变量“mat2D”,应使用int N = mxGetN(pA);此时,N = 5


h. mxGetField:获取结构体中的域,对应于表2中的“Field”。假设pS已经指向变量“lena”,如果想获取域“lenaGray”,则mxArray* pF = mxGetField(pS,0,”lenaGray”);

2. mxArray和Mat在数据存储结构上的比较

a. 对于2维矩阵变量“mat2D”,在Mat是按行优先存储的,而在mxArray中则是按列优先存储的,如下图所示。
图8


b. 对于3维变量“mat3D”,在Mat中是按第3维、行、列的优先顺序存储的,而在mxArray中是按列、行、第3维的顺序存储的,如下图所示。
图9


c. 在处理彩色图像的时候,应当把Mat中按RGB存放的顺序改为BGR的顺序,这样才能正常显示图像。

四、 灰度Gray图像转伪彩色Jet图像

对于灰度图像的每个像素值,找到其对应的RGB映射值即可。在0到255上Gray与Jet的映射关系如下图所示,其中横坐标表示像素值,纵坐标表示映射值。
图10

五、 使用Windows的API函数实现窗口尺寸的自由调整

假设已经存在窗口“lenaJet”,此时窗口尺寸为500×400,如果要将尺寸调整为800×600,则需要包含头文件Windows.h,并且添加下列三行代码:

HWND hWnd = (HWND)cvGetWindowHandle(“lenaJet”);
HWND hParentWnd = GetParent(hWnd);
SetWindowPos(hParentWnd,NULL,0,0,800,600,SWP_NOMOVE);

从文件“data.mat”从读取出的变量“lenaGray”显示如图1所示,变量“lenaColor”显示如图2所示,伪彩色Jet图像“lenaJet”显示如图3。
图11
图1


图12
图2

图13
图3

猜你喜欢

转载自blog.csdn.net/Destiny0321/article/details/54138434