使用VS2010调用matlab的mat格式文件

做实验需要将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"<<file<<endl;

		return(1);

	} 

	dir = (const char **)matGetDir(pmat, &ndir);

	//ndir 表示mat文件中含有矩阵数目

	if (dir == NULL) {

		std::cout<<"Error reading directory of file"<<file<<endl;

		return(1);

	}

	else

	{

		cout<<"Error opening file"<<file<<endl;

		for (int i=0; i < ndir; i++)

			cout<<"Mat NUM: "<<dir[i]<<endl;//输出所含矩阵数目

	}

		pmat=matOpen(file, "r");//重新打开文件;

	pa = matGetNextVariable(pmat, &name);

	//返回指向文件头文件信息的指针,指针类型为*mxArray;

	//name 是矩阵的名字;

	cout<<name<<endl;

	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");*/


	map<int,int>regSize;
	int m=0;
	
	for (int r=0;r<jj;r++)
	{
		
		int n=0;
 		m++;
 		uchar *id=regId.ptr<uchar>(r);
		for (int c=0;c<ii;c++)
		{
 			id[c]=(*pm);
			pm++;
 			regSize[*pm]++;
			
		}

	}

 	cout<<"regSize:"<<regSize.size()<<endl;
// 	for(map<int,int>::iterator iter=regSize.begin();iter!=regSize.end();iter++)
// 	{
// 		cout<<iter->first<<" size: "<<iter->second<<endl;
// 	}
 	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文件

你可能感兴趣的:(Microsoft,File,matlab,iterator,Path,2010)