国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
Matlab調(diào)用C程序心得

Matlab調(diào)用C程序心得

from http://hi.baidu.com/bittnt/item/c8f51b200daee5cba5275a97

問題描述:
Matlab調(diào)用CPP不新鮮,無非就是把寫好的c語言編譯成mex,然后直接調(diào)用唄。很多帖子和書都有描述。具體可以參考附錄。這里描述的是如何用Matlab調(diào)用Opencv庫支持的cpp函數(shù)。

解決方法:
0、當(dāng)然,你得先設(shè)置好起碼的mex -setup,就是指定編譯器,如果在M¥中大家都設(shè)成VS2008,VS2005之類的吧。
進(jìn)入正題
1、首先打開我的Matlab2009b,然后輸入mex -v,可以發(fā)現(xiàn)清單中Options file對應(yīng)那項,直接選中那個文件名,在我這里差不多就是C:\Users\bit\AppData\Roaming\MathWorks\MATLAB\R2009b\mexopts.bat這個文件名,然后右鍵打開所謂open selection。
2、進(jìn)入編輯狀態(tài)后,找到所謂PAPTH,INCLUDE,LIB等地方,和在Visual Studio中設(shè)置options中那個VC diectory目錄一樣。
3、然后還得改LINKFLAGS=后面一大堆。如我這里把這個地方一行加成這樣子
set LINKFLAGS=/dll /export:%ENTRYPOINT% /LIBPATH:"%LIBLOC%" cxcore200d.lib cv200d.lib highgui200d.lib ml200d.lib cvaux200d.lib libmx.lib libmex.lib libmat.lib /MACHINE:X86 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /incremental:NO /implib:"%LIB_NAME%.x" /MAP:"%OUTDIR%%MEX_NAME%%MEX_EXT%.map"
其實(shí)就是和調(diào)用Opencv里面設(shè)置lib那一大堆文件一樣。
4、這不算完,然后在VS中新建一個project,選擇建立DLL動態(tài)鏈接庫工程,最好都是空的。按照正常方式設(shè)置好opencv。然后在source files下添加你的code,比如我這里添加了Wrapper.cpp的程序。往里面填代碼。其具體方式給個例子:
#include "mex.h"
#include <cv.h>
#include <highgui.h>
#include <cvaux.h>
#include <cxcore.h>
#include <ml.h>
using namespace cv;
void mexFunction (int nlhs, mxArray *plhs[], // 輸出參數(shù)個數(shù),及輸出參數(shù)數(shù)組
int nrhs, const mxArray *prhs[]) // 輸入?yún)?shù)個數(shù),及輸入?yún)?shù)數(shù)組
{
int m, n;
double *params, *des, *loc;
char name[256];
int buflens = mxGetNumberOfElements(prhs[0]);
mxGetString(prhs[0], name, buflens+1);
params = mxGetPr(prhs[1]);
loc = mxGetPr(prhs[2]);
m = mxGetM(prhs[2]);
n = mxGetN(prhs[2]);
if (mxGetM(prhs[1]) != 9 || mxGetN(prhs[1]) != 1)
{
mexErrMsgTxt("Error in parameter\n");
}
if (m <= 0 || n != 2)
{
mexErrMsgTxt("Error in location\n");
}
if (!mxIsChar(prhs[0]))
{
mexErrMsgTxt("First parameter must be string\n");
}
//mexPrintf(name);
IplImage * img = cvLoadImage(name, 1);
Mat mat(img);
//Mat mat = imread(name, 1);
if (mat.data == NULL)
{
mexErrMsgTxt("Error in image\n");
}
NamedWindows("1",1);
imshow("1",mat);
WaitKey(0);
return;
}
當(dāng)然同目錄下還得加入一個Wrapper.def文件,這個里面內(nèi)容最好是如下:
LIBRARY Wrapper
EXPORTS mexFunction
6、這不算完,打開Tools->options,然后看到Project and solutions后往下面找VC++ Directories中那個Excutable files,變更為Include Files,然后添加你的matlab根目錄\extern\include\win32還有include兩個目錄。此外,添加Library files中根目錄\extern\lib\win32\microsoft。以及在Source files下添加Opencv2.0\Vc2008\src這個路徑。
跑到Proejct property下面找additional dependencies,在opencv一大堆lib后面繼續(xù)添加libmex.lib libmx.lib libmat.lib。
7、編譯這個文件。然后開始debug,不出意外,會打開一個matlab 2009b的主程序,這樣子后。找到你的vs  project下面,然后在命令框輸入mex Wrapper.obj,然后再輸入Wrapper('lena.jpg');,這樣子就可以調(diào)用opencv中那個函數(shù)了。

tips:
1、報錯問題:這個不是有效的win32程序。
解決方案:在vs中編譯源文件,64位的matlab需要編譯成64位的obj文件;32位的matlab需要編譯成32位的obj文件。
2、報錯問題:找不到指定的模塊。
解決方案:重新編譯release和debug版本的opencv,然后編譯完后記得在install下面繼續(xù)編譯即安裝,然后再次編譯你的程序就ok了。

Copyright@Shuai Zheng in baidu hi.2010
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Matlab以MEX方式調(diào)用C源代碼
Matlab與C++混合編程(依賴OpenCV)
Visual Studio創(chuàng)建Matlab mex(dll)函數(shù)
用C編寫mex程序
64位windows下mex文件中稀疏矩陣出錯的問題
Matlab與C/C++混合編程接口應(yīng)用總結(jié) .
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服