%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%html
辛苦原创所得,转载请注明出处
java
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%python
在配置前能够在matlab里输入 mex -setup 来看下环境,检测vs结果有网友说跟是否正版有关,本人也不是很清楚。ios
这里要说明的是安装很新版本matlab的时候,当破解文件拷贝完后仍然出现出现error -8错误没法启动,那是由于windows系统的问题,能够用windows 易升来对系统进行升级,而后就能够运行了,这块本身耗掉了好长时间。c++
有些matlab里会显示以下(matlab 2017a盗版),我电脑里有vs 2010和vs 2015,可是都没有检测出来,我本身按照后面的方式安装了mingw64了git
个人另外一个matlab 2014盗版的显示以下,说明检测出来vs 2010了(这个是选择vs2010编译器以后的图)github
学校提供的matlab 2017b正版能够检测出来以下,两个编译器都检测出来了.不过正版必须时刻联网都能用,不是很方便segmentfault
其实这时候选择vs的编译器就能够对c程序进行编译了,主要要使用mexFunction()进入接口函数.具体能够查看网上相关。windows
测试数组
mex_test.cpp:
#include "mex.h"
#include "iostream"
#include "mex_test.h"
using namespace std;
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
//void main()
{
//int *i;
//i = mxGetPr(prhs[0]);
//if (i[0] == 1)
int a = abc(1);
std::cout << a;
//mexPrintf("hello,world!\n");
//else
//mexPrintf("你们好!\n");
}
mex_test.h
#pragma once
int abc(int a);
abc.cpp
#include "mex_test.h"
int abc(int a)
{
return a;
}
以后在 matlab 里输入 mex a.c b.c c.c -output c.mexw64 这里其实不用输入 -output c.mexw64
若是实在不能检测出来vs编译器,还不想换matlab版本,那么按照下面来操做配置(不建议,比较麻烦)
1.先安装一些软件和进行一些配置
==错就错在没有,,每一个要被编译成mex的.c(c和c++同理)中有必须有下面的函数做为主函数(相似main函数的地位)取消选择:
// Matlab interface Function
// 参数:
// nlhs和nrhs表示调用该函数时返回值和参数的个数
// prhs[]和plhs[]表示参数和返回值数组
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
...
}
----------------------------------
若是想让matlab 2017a调用vs 2017编译器,则须要打个补丁,补丁下载地址以下
https://ww2.mathworks.cn/support/bugreports/1487958
解压并将下的两个文件复制到MATLAB安装文件夹对应目录下,而后就MATLAB就能够调用VS2017的编译器了。
---------------------------------------------------------------------------------------------------
matlab使用mexopencv链接opencv
所需环境:
vs 2017 社区版 + matlab2018a + opencv3.4.0 + cmake3.11.4(这种版本搭配经过好多尝试,因此不要换为其余版本,不然会报错)
cmake下载地址
https://cmake.org/download/
编译
下载以下的cmake(含有cmake-gui.exe)
以后对opencv进行编译,这里configure选择visual studio 15 2017 win64
bin\win64\mexopts
BUILD_DOCS
, BUILD_EXAMPLES
, BUILD_JAVA
, BUILD_PACKAGE
, BUILD_PERF_TESTS
, BUILD_TESTS
BUILD_opencv_apps
, BUILD_opencv_cuda*
, BUILD_opencv_cudev
, BUILD_opencv_java
, BUILD_opencv_js
, BUILD_opencv_python*
, BUILD_opencv_ts
, BUILD_opencv_viz
, BUILD_opencv_world
under "OPENCV" group,这里须要提早下载好opencv_contrib,下载地址参照
https://github.com/kyamagu/mexopencv/wiki/Installation-%28Windows%2C-MATLAB%2C-OpenCV-3%29
以后:
OPENCV_EXTRA_MODULES_PATH
to C:/opencv_contrib-3.4.0/modules
OPENCV_ENABLE_NONFREE
under "WITH" group, 取消选择:
WITH_CUDA
, WITH_CUFFT
, WITH_CUBLAS
, WITH_NVCUVID
, WITH_MATLAB
, WITH_VTK
press Configure again
under the newly added "BUILD" group (displayed in red), deselect the following modules if possible:这里若是没有显示红色就能够忽略
BUILD_opencv_cvv
, BUILD_opencv_freetype
, BUILD_opencv_hdf
, BUILD_opencv_matlab
, BUILD_opencv_ovis
, BUILD_opencv_sfm
press Configure yet another time
press Generate
close CMake
build opencv
在编译好的文件夹中用vs2017打开opencv.sln,
调整到 release 模式(此时是x64)
build->all build, 若是此步骤出错的话,说明 cmake 版本没哟用对
build->install, 运行完此时在编译后目录中会生成一个 install 文件夹
C:\opencv3.4.0_cmake3.11\install\x64\vc15\bin 路径加入到系统环境变量中
打开matlab(管理员权限),输入以下指令,具体名字根据本身所起的名字而定
>>mexopencv.make('clean',true) 这步若是显示没有函数,则说明之前没有配置过
>> cd('C:\mexopencv3.4.0') >> addpath('C:\mexopencv3.4.0') >> addpath('C:\opencv_contrib-3.4.0')
最后运行下面指令前关闭杀毒软件,不然会报以下错误,索性连防火墙也关闭.
general error c101008d: Failed to write the updated manifest to the resource of file
"C:\mexopencv3.4.0\+cv\HoughLines.mexw64".
错误解决能够参考以下网址
https://social.msdn.microsoft.com/Forums/vstudio/en-US/dbb6c5db-9c34-46e6-af95-b56bf95ed345/error-c101008d?forum=clr
运行
>> mexopencv.make('opencv_path','C:\opencv3.4.0_cmake3.11\install', 'opencv_contrib',true)
最后运行
>> cv.getBuildInformation()
You should see something like:
Congratulation, now you have OpenCV working in MATLAB!
配置终于完成,花了近一周的时间
matlab可使用的opencv库函数以下网址
https://kyamagu.github.io/mexopencv/matlab/index.html
------------------------------------------------------------------------
matlab 调用含有opencv的c++程序
网上说须要配置以下文件
打开文件mex_C++_win64.xml
弄了好久一直没弄好,后来发现按照以下方式进行编译就能够:
mex mex_test.cpp -Ic:\opencv3.4.0\build\include\opencv -Ic:\opencv3.4.0\build\include -Ic:\opencv3.4.0\build\include\opencv2 -Lc:\opencv3.4.0\build\x64\vc15\lib -lopencv_world340
若是是在matlab中配置的是opencv2编译引擎的的话,参照以下编译(别人的说明,我没有配置opencv2)
mex mex_test.cpp -IF:\opencv\build\include -LF:\opencv\build\x64\vc10\lib -lopencv_core249 -lopencv_imgproc249 -lopencv_highgui249
若是编译出现 error C2061: 语法错误: 标识符“mxArray” 的错误,在c程序中缺乏了"mex.h"
另外在matlab下配置了默认的opencv引擎的话,则其余版本的opencv是不能使用的,如上面写的mex mex_test.cpp -IF:\opencv\build\include -LF:\opencv\build\x64\vc10\lib -lopencv_core249 -lopencv_imgproc249 -lopencv_highgui249
是会报错的.
关于如何使用mexFunction的资料能够参考以下网址
http://blog.sina.com.cn/s/blog_7e71290d0101fkk7.html
------------------------------------------------------------------------------------
matlab与vs联合调试
在 mex c 文件的时候,使用mex -g XXX.cpp/XXX.c, 这样就是一个debug 文件了,而后打开 vs ,选择 工具--附加到进程,选择matlab.exe,这样vs 和matlab 之间就创建起了联系
而后经过 vs 在 cpp 文件里设置断点, 再运行相关matlab文件。
f9加载断点,f5下一步。
在vs中程序以下
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
//mlj
int n_mex = mxGetN(prhs[0]); //得到矩阵的列数
int m_mex = mxGetM(prhs[0]); //得到矩阵的行数
double *data_mex;
data_mex = mxGetPr(prhs[0]); //得到指向矩阵的指针
for (int i = 0; i < m_mex; i++)
for (int j = 0; j < n_mex; j++)
{
mexPrintf("%4.3f ", data_mex[j*m_mex + i]); //以行为主序输出
mexPrintf(" ");
}
plhs[0] = mxCreateDoubleMatrix(m_mex, n_mex, mxREAL); //返回到matlab数据
在matlab中书写程序
matrix = [1,2,3;4,5,6];
vs = example(matrix);
在数据框中能够看到
vs = [0,0,0;0,0,0]
事实上以上的mexPrintf也可使用cout显示.
在返回的时候要首先用 mxCreateDoubleMatrix 申请mxArray类型数据或其余类型数据,而后用 mxGetPr 得到其数据才能操做返回,且使用
这些函数的时候必须在mexFunction函数里使用
plhs[0] = mxCreateDoubleMatrix(1,6, mxREAL);
double *data_out_mex = mxGetPr(plhs[0]);
for (int i = 0; i < 2; i++)
for (int j = 0; j < 3; j++)
data_out_mex[i * 3 + j] = a[i][j];//总之,在C中,二维数组也是按照一维处理的
注意在使用matlab编译c程序时候,不要开启vs的连接进程,不然会出错,还有一点很是重要的是,若是c程序里有调用的文件在系统目录中没有,则matlab调用vs程序时候会崩溃,并且不报任何错误,或提示建议重启matlab.具体对的mexFunction的使用能够参考下面网址https://www.cnblogs.com/rong86/p/3703704.htmlhttps://www.cnblogs.com/arxive/p/4687766.html------------------------------------------------------------------------------------另外好像新的matlab调用opencv的方法参考网页https://blog.csdn.net/majinlei121/article/details/52343558https://github.com/kyamagu/mexopencvhttps://github.com/kyamagu/mexopencv/wiki/Installation-%28Windows%2C-MATLAB%2C-OpenCV-3%29http://www.cnblogs.com/youth0826/archive/2012/08/13/2635684.html好像比较简单的配置以下(这种方法不是很明白怎么回事)https://segmentfault.com/a/1190000009622411?utm_source=debugrun&utm_medium=referral软件下载地址:mexopencvhttps://github.com/kyamagu/mexopencv------------------------------------------------------------------------------------------报错:1.有时候会出现错误的使用cv.imread这样的错误,有多是由于matlab文件夹路径没有指向文件所在位置致使的