〇、环境配置
win10 64位操作系统
OPENCV320仅支持64位
MATLAB2016b按装的64位版本
VS2015也是64位版本
一、MATLAB中的C++编译器查看方法
在matlab命令行中输入指令
mex –setup
可能会出现多个C++编译器的选择,但我的计算机上目前只有一个
二、Opencv在MATLAB中的配置方法
修改mex_C++win64.xml,文件所在位置如下图所示
修改其中的PATH,INCLUDE,LIB,LIBPATH,如下图
图中
PATH指的是DLL文件路径;
INCLUDE是头文件路径;
LIB是lib文件所在路径;
LIBPATH添加与LIB同样的配置路径。
三、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文件相同路径下的图像文件。
四、错误解决方案
问题一
如果报错找不到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" )
之后,编译运行正常的。