zoukankan      html  css  js  c++  java
  • 使用VS2010调用matlab的mat格式文件

    做实验需要将matlab实现的meanshift的结果中的region的Iabels矩阵,需要把labels.mat读入VS2010中,实现功能,在此把实现过程记录下来。

    C++读取mat文件的步骤如下。

    1. vs2010的配置

    新建一个工程,在属性管理器中选择 工程->属性->VC++目录。

    设置包含目录为:D:MATLABR2010aexterninclude(我的matlab装在D盘);

    设置库目录为:D:MATLABR2010aexternlibwin32microsoft。

    2.设置环境变量path

    计算机->属性->高级系统设置->高级->环境变量

    在Path中已经存在D:MATLAB_2011aR2011ain,但是D:MATLAB_2011aR2011ainwin32下有个重要的libmat.dll。如果不把d:MATLABR2010ain改为D:MATLAB_2011aR2011ainwin32程序将无法运行。

    理论上D:MATLAB_2011aR2011ain应该会向深一步检索到libmat.dll。坑爹的windows这一步并没有去做。这步设置完后要重启(环境配置完毕)。

    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内容存储在图像中并显示。

    注意:在Studio中一定要注意,默认读取.mat的方式是按列读取,不是按行读取。这是matlab数据存储的特色!

    #include "stdafx.h"  
    
    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);  
    
    
        map<<span>int,int>regSize;  
        int m=0;  
        for (int r=0;r
        {  
            int n=0;  
            m++;  
            uchar *id=regId.ptr(r);  
            for (int c=0;c
            {  
                id[c]=(*pm);  
                pm++;  
                regSize[*pm]++;  
            }  
        }  
    
        cout<<"regSize:"<<regSize.size()<<endl;  
    //  for(map::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();  
    }
  • 相关阅读:
    Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04
    练oj时的小技巧(大多都在oj记录里,这是被忘记的部分)
    HDU 3032 (SG打表找规律)
    SG 大法(Sprague-Grundy函数)
    基于Linux的MySQL基本操作
    java.sql.SQLException: Unable to load authentication plugin ‘caching_sha2_password‘.解决方法
    手把手教你安装和配置MYSQL数据库
    理解Python闭包,这应该是最好的例子
    SQL基础
    MySQL令人咋舌的隐式转换
  • 原文地址:https://www.cnblogs.com/arxive/p/5928966.html
Copyright © 2011-2022 走看看