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檔案,程式碼如下:
4. 在matlab裡面輸入mex useOpenCV.cpp編譯,會生成一個名為useOpenCV.mexw64的檔案(類似於windows中的dll檔案)。#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; }
5. 在matlab裡輸入呼叫語句,useOpenCV('test.jpg');即可顯示我們輸入的影象。
以上內容參考了,http://blog.csdn.net/sxjk1987/article/details/8783016及http://blog.csdn.net/raodotcong/article/details/8785358兩篇博文。