1. 程式人生 > >Matlab與C/C++混合程式設計之Matlab呼叫OpenCV庫函式

Matlab與C/C++混合程式設計之Matlab呼叫OpenCV庫函式

研究計算機視覺的同學們對OpenCV和Matlab應該非常熟悉,OpenCV作為最大的計算機視覺開源庫已經得到了非常廣泛的使用,在視覺研究領域的地位不可動搖,其主要是基於C/C++實現的,主要的開發平臺包括VS,Qt等等。Matlab以其在矩陣運算方面獨有的優勢在影象處理領域如魚得水,Matlab的影象處理工具箱IPT已經集成了常見的影象處理函式,現在很多研究論文的程式碼都是基於用Matlab實現的。由於C\C++和Matlab在處理不同問題的時候各有千秋,如何將兩者結合起來程式設計顯得尤為重要,事實上,在計算機視覺研究領域,很多大牛的文章就是用C\C++和Matlab混合程式設計實現的,最後一般給的都是matlab的介面。

廢話少說,下面介紹如何在Matlab中呼叫OpenCV的庫函式,也方便日後查閱,進一步學習。

平臺:Win7 64,Matlab R2012a 64,OpenCV 2.4.10,VS2010

預設以上軟體均在計算機中安裝好了,可以利用VS2010成功建立基於OpenCV的應用程式。下面是在Matlab中呼叫OpenCV庫函式的詳細步驟。

1. 首先是在Matlab中設定C\C++編譯器,選擇Mirosoft Visual C++ 2010。


2. 第二步在Matlab的Mex配置檔案中新增OpenCV庫支援,這一步類似於在VS2010的專案屬性中設定OpenCV的相關資訊。

在Matlab的命令列中輸入 mex -v,找到mexopts.bat檔案所在的位置,用記事本或其他程式開啟。


修改如下地方:


這樣在matlab中的OpenCV已經配置好了。

3. 新建useOpenCV.cpp檔案,程式碼如下:

#include"mex.h"

#include     "cv.h"

#include    "highgui.h"

void mexFunction (int nlhs, mxArray *plhs[], // 輸出引數個數,及輸出引數陣列

    int nrhs, const mxArray *prhs[]) // 輸入引數個數,及輸入引數陣列

{

    char name[256];

    int buflens =mxGetNumberOfElements(prhs[0]);

    mxGetString(prhs[0], name, buflens+1);

     if(!mxIsChar(prhs[0]))

     {

        mexErrMsgTxt("First parameter must be string/n");

     }

    mexPrintf(name);

    IplImage * img = cvLoadImage(name, 1);

     if(img->imageData == NULL)

     {

        mexErrMsgTxt("Error in image/n");

     }

    cvNamedWindow("1",1);

    //imshow("1",mat);

    cvShowImage("1",img);

    cvWaitKey(0);

    return;

}
4. 在matlab裡面輸入mex useOpenCV.cpp編譯,會生成一個名為useOpenCV.mexw64的檔案(類似於windows中的dll檔案)。

5. 在matlab裡輸入呼叫語句,useOpenCV('test.jpg');即可顯示我們輸入的影象。

以上內容參考了,http://blog.csdn.net/sxjk1987/article/details/8783016及http://blog.csdn.net/raodotcong/article/details/8785358兩篇博文。