〇、環境配置算法
win10 64位操做系統數組
OPENCV320僅支持64位less
MATLAB2016b按裝的64位版本ide
VS2015也是64位版本測試
1、MATLAB中的C++編譯器查看方法spa
在matlab命令行中輸入指令操作系統
mex –setup命令行
可能會出現多個C++編譯器的選擇,但個人計算機上目前只有一個debug
2、Opencv在MATLAB中的配置方法指針
修改mex_C++win64.xml,文件所在位置以下圖所示
修改其中的PATH,INCLUDE,LIB,LIBPATH,以下圖
圖中
PATH指的是DLL文件路徑;
INCLUDE是頭文件路徑;
LIB是lib文件所在路徑;
LIBPATH添加與LIB一樣的配置路徑。
3、CPP接口文件編寫
在編寫的接口文件(假設命名testOpenCV.cpp)中添加
#include"mex.h"
#include "opencv.hpp"
#pragma comment( lib, "opencv_world320.lib" )// 使用release版本
//using namespace cv;
// nlhs:輸出參數數目 (Left-hand side)
// plhs:指向輸出參數的指針
// nrhs:輸入參數數目
// prhs:指向輸入參數的指針
void mexFunction ( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
char name[256];
if (nrhs < 1)
{
mexErrMsgTxt("the number of input param less than 1");
return ;
}
if( !mxIsChar(prhs[0]))
{
mexErrMsgTxt("First parameter must be string");
return ;
}
int buflens = mxGetNumberOfElements(prhs[0]);
mxGetString(prhs[0], name, buflens+1);
mexPrintf(name);
IplImage * img = cvLoadImage(name);
if(img == NULL || img->imageData == NULL)
{
mexErrMsgTxt("Error in image");
return;
}
int flag = cvSaveImage( "b.bmp", img );
cvReleaseImage(&img);
// cvNamedWindow("test");
// cvShowImage("test",img);
// cvWaitKey(0);
return;
}
在MATLAB的命令窗口輸入
mex -v -g -compatibleArrayDims testOpenCV.cpp
而後運行在命令窗口運行testOpenCV('a.bmp')便可。
假設a.bmp是與testOpenCV.mexw64文件相同路徑下的圖像文件。
4、錯誤解決方案
問題一
若是報錯找不到testOpenCV.mexw64模塊之類的錯誤,大概是由於PATH路徑設置沒有發揮做用,把用到的opencv的release版本的dll文件放到
C:\Program Files\MATLAB\R2016b\bin\win64
路徑下便可(每臺計算機的MATLAB安裝路徑可能不一樣,因此在查找該路徑是要開動思路)
在下配置的是openCV320版本的,對應的dll文件只有一個
opencv_world320.dll
將opencv_world320.dll放到C:\Program Files\MATLAB\R2016b\bin\win64
便可解決「若是報錯找不到testOpenCV.mexw64模塊之類的錯誤」。
問題二
若是在運行時遇到如下錯誤,如圖所示
基本上是由於testOpenCV.cpp文件中運行過程當中有內存錯誤,遇到這一類問題,主要仍是本身代碼中的錯誤形成的,
MATLAB沒有VS開發環境那麼方便的運行調試界面,返回信息也很少,只會彈出如上圖所示的錯誤信息。
只要仔細琢磨代碼中可能出錯的地方,尤爲須要注意指針判空,或者數組越界之類,修改其中的錯誤便可正確運行。
另外,還有人提示說多是由於使用opencv debug版本的lib和dll,也會形成以上錯誤提示,經測試發現
使用#pragma comment( lib, "opencv_world320d.lib" )時,調用OpenCV中提供的LSD直線檢測算法的確會出現以上錯誤信息,
將#pragma comment( lib, "opencv_world320d.lib" )修改成
#pragma comment( lib, "opencv_world320.lib" )
以後,編譯運行正常的。