做实验需要将matlab实现的meanshift的结果中的region的Iabels矩阵,需要把labels.mat读入VS2010中,实现功能,在此把实现过程记录下来:
C++读取mat文件:
1. vs2010的配置
新建一个工程,在属性管理器中选择 工程->属性->VC++目录。
设置包含目录为:D:\MATLAB\R2010a\extern\include(我的matlab装在D盘);
设置库目录为:D:\MATLAB\R2010a\extern\lib\win32\microsoft。
2.设置环境变量path
计算机->属性->高级系统设置->高级->环境变量
在Path中已经存在D:\MATLAB_2011a\R2011a\bin\,但是D:\MATLAB_2011a\R2011a\bin\win32下有个重要的libmat.dll。如果不把d:\MATLAB\R2010a\bin\改为D:\MATLAB_2011a\R2011a\bin\win32 程序将无法运行。
理论上D:\MATLAB_2011a\R2011a\bin\应该会向深一步检索到libmat.dll。坑爹的windows这一步并没有去做。这步设置完后要重启(环境配置完毕)。
3.
3.使用MATLAB 提供的MAT 文件接口函数
在C/C++程序中有两种方式可以读取MAT文件数据。利用MATLAB提供的有关MAT文件的编程接口函数。MATLAB的库函数中包含了MAT文件接口函数库,其中有各种对MAT文件进行读写的函数,都是以mat开头的函数。如表1所示。
表1 C语言中的MAT文件读写函数
MAT 函 数 | 功 能 |
matOpen | 打开 MAT 文件 |
matClose | 关闭 MAT 文件 |
matGetDir | 从 MAT 文件中获得 MATLAB 阵列的列表 |
matGetFp | 获得一个指向MAT 文件的ANSI C 文件指针 |
matGetVariable | 从MAT文件中读取MATLAB阵列 |
matPutVariable | 写MATLAB阵列到MAT文件 |
matGetNextVariable | 从MAT文件中读取下一个MATLAB阵列 |
matDeleteVariable | 从MAT文件中删去下一个MATLAB阵列 |
matPutVariableAsGlobal | 从MATLAB阵列写入到MAT文件中 |
matGetVariableInfo | 从MAT文件中读取MATLAB阵列头信息 |
matGetNextVariableInfo | 从MAT文件中读取下一个MATLAB阵列头信息 |
4.程序举例:读取.mat文件,并把mat内容存储在图像中并显示。
注意:坑爹的默认读取.mat的方式是按列读取,不是按行读取,害的劳资瞎忙乎一晚上!!!
- #include "stdafx.h"
-
-
- /*int main()*/
- int loadMat(Mat& regId)
- {
-
- MATFile *pmat;
-
- const char **dir;
-
- const char *file;
-
- const char *name;
-
- int ndir;
-
- mxArray *pa;
-
- file="D:/labels3_ms.mat";//双反斜杠防止转义
-
- pmat=matOpen(file, "r");//打开文件,返回指向文件指针
-
- if (pmat == NULL) {
-
- cout<<"Error opening file"<<><>< li="">
-
- return(1);
-
- }
-
- dir = (const char **)matGetDir(pmat, &ndir);
-
- //ndir 表示mat文件中含有矩阵数目
-
- if (dir == NULL) {
-
- std::cout<<"Error reading directory of file"<<><>< li="">
-
- return(1);
-
- }
-
- else
-
- {
-
- cout<<"Error opening file"<<><>< li="">
-
- for (int i=0; i < ndir; i++)
-
- cout<<"Mat NUM: "<<><>
-
- }
-
- pmat=matOpen(file, "r");//重新打开文件;
-
- pa = matGetNextVariable(pmat, &name);
-
- //返回指向文件头文件信息的指针,指针类型为*mxArray;
-
- //name 是矩阵的名字;
-
- cout<<><>< li="">
-
- pmat=matOpen(file, "r");
-
- int ii=mxGetM(pa);//矩阵行数400
-
- int jj=mxGetN(pa);//矩阵列数300
-
- int *pm=(int*)mxGetPr(pa); //获取矩阵数值,返回指向矩阵第一数值的指针;
-
- regId=Mat::zeros(jj,ii,CV_8UC1);
-
- /*ofstream out("D:/abc.txt");*/
-
-
- mapregSize;
- int m=0;
-
- for (int r=0;r<>< li="">
- {
-
- int n=0;
- m++;
- uchar *id=regId.ptr(r);
- for (int c=0;c<>< li="">
- {
- id[c]=(*pm);
- pm++;
- regSize[*pm]++;
-
- }
-
- }
-
- cout<<"regSize:"<<><>< li="">
- // for(map::iterator iter=regSize.begin();iter!=regSize.end();iter++)
- // {
- // cout<first<<" size: "<second<<>< li="">
- // }
- mxFree(dir);
- // //normalize(regId,regId,0,1,CV_MINMAX,CV_32FC1);
- regId=regId.t();
- //imshow("show",regId);
- //waitKey();
- //imwrite("D:/regId1.jpg",regId);
- //return 1;
- return regSize.size();
- }
另附:使用VS调用matlab的.m文件
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。