〇、环境配置算法
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" )
以后,编译运行正常的。