使用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.使用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();  
}

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM