首页 > 技术文章 > OPENCV320+VS2015+MATLAB2016b混编配置

BEETLE-SY 2017-09-26 16:07 原文

〇、环境配置

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" )

之后,编译运行正常的。

推荐阅读