matlab + c/c++ opencv 混合编程
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
辛苦原创所得,转载请注明出处
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
在配置前可以在matlab里输入 mex -setup 来看下环境,检测vs结果有网友说跟是否正版有关,本人也不是很清楚。
这里要说明的是安装很新版本matlab的时候,当破解文件拷贝完后仍然出现出现error -8错误无法启动,那是因为windows系统的问题,可以用windows 易升来对系统进行升级,然后就可以运行了,这块自己耗掉了好长时间。
有些matlab里会显示如下(matlab 2017a盗版),我电脑里有vs 2010和vs 2015,但是都没有检测出来,我自己按照后面的方式安装了mingw64了

我的另一个matlab 2014盗版的显示如下,说明检测出来vs 2010了(这个是选择vs2010编译器之后的图)

学校提供的matlab 2017b正版可以检测出来如下,两个编译器都检测出来了.不过正版必须时刻联网都能用,不是很方便

其实这时候选择vs的编译器就可以对c程序进行编译了,主要要使用mexFunction()进入接口函数.具体可以查看网上相关。
测试
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.先安装一些软件和进行一些配置
说明缺少MinGW-w64 C/C++ 编译器。安装方法如下
2、安装MinGW-w64 C/C++ 编译器。注意:按照默认路径安装。
安装在其他盘的话,再添加路径的时候会出现 'D:\TDM-GCC-64' 不是内部或外部命令,也不是可运行的程序
b、打开计算机的"控制面板",打开”控制面板“中的”系统与安全“中的”系统“。也就是系统属性。
c、从上图菜单中选择系统属性。点击高级系统设置>高级选项卡。点击环境变量。
d、在系统变量下,选择新建。在“新建系统变量”对话框的“变量名称”字段中输入MW_MINGW64_LOC。
在变量值字段中,键入MinGW-w64编译器安装的位置,例如“C:\ TDM-GCC-64”。
e、点击“确定”关闭对话框,然后关闭控制面板对话框。
(2)使用MATLAB将MW_MINGW64设置为临时环境变量:
其中“C:\TDM-GCC-64”是MinGW的安装目录。这种方法每次启动MATLAB for
MATLAB来正确使用MinGW时,都需要运行这个命令。命令到你的“startup.m”文件。每次MATLAB启动时都会执行该命令。
==错就错在没有,,每个要被编译成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
解压并将bin\win64\mexopts下的两个文件复制到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
取消选择:
BUILD_DOCS,BUILD_EXAMPLES,BUILD_JAVA,BUILD_PACKAGE,BUILD_PERF_TESTS,BUILD_TESTSBUILD_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
之后:
- set
OPENCV_EXTRA_MODULES_PATHtoC:/opencv_contrib-3.4.0/modules - enable
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.html
https://www.cnblogs.com/arxive/p/4687766.html ------------------------------------------------------------------------------------
另外好像新的matlab调用opencv的方法参考网页
https://blog.csdn.net/majinlei121/article/details/52343558
https://github.com/kyamagu/mexopencv
https://github.com/kyamagu/mexopencv/wiki/Installation-%28Windows%2C-MATLAB%2C-OpenCV-3%29
http://www.cnblogs.com/youth0826/archive/2012/08/13/2635684.html 好像比较简单的配置如下(这种方法不是很明白怎么回事)
https://segmentfault.com/a/1190000009622411?utm_source=debugrun&utm_medium=referral 软件下载地址:
mexopencv
https://github.com/kyamagu/mexopencv ------------------------------------------------------------------------------------------
报错:
1.有时候会出现错误的使用cv.imread这样的错误,有可能是因为matlab文件夹路径没有指向文件所在位置导致的
matlab + c/c++ opencv 混合编程的更多相关文章
- 【5.1送礼】国内第一部Matlab和C#.Net混合编程视频教程【免费】
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 上一次写博客很久了 ...
- matlab和C/C++混合编程--Mex
最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加.首先讲讲写Mex的一些常规规定,然后我 ...
- matlab和C/C++混合编程--Mex (六)参数传递
最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加.首先讲讲写Mex的一些常规规定,然后我 ...
- matlab和C/C++混合编程--Mex (转载)
matlab和C/C++混合编程--Mex 最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续 ...
- matlab和C/C++混合编程--调用opencv
最近的我们已经将整个项目搭起来了,项目比较复杂.由于我们做的是检索系统,所以我们用asp.net(c#)做了网页,但是算法的实现是在matlab下,所以我们不得不用matlab生成动态链接库dll,然 ...
- MATLAB与C/C++混合编程的一些总结
[转载请注明出处]http://www.cnblogs.com/mashiqi 先上总结: 由于C/C++语言的函数输入输出参数的特点,可以将多个参数方便地传入一个函数中,但却不能方便地返回多个参数. ...
- Matlab和C语言混合编程,包含目录的设定
如果.c文件不依赖于任何第三方库,那么mex编译很简单,只需要在matlab的命令行输入 mex test.c 即可. 但是如果这个c文件使用了第三方库文件,如opencv.gsl等等,那么就需要更改 ...
- matlab与VC6.0混合编程设置
版本matlab 2009 和vc++6.0 SP6 步骤 1) 配置环境,新建一个VC工程,然后在VC界面的“工具->选项”的目录选项卡中的“include”中加入如下路径: 2) D:\ ...
- MATLAB和C语言混合编程-----Matlab7.0 编译器设置
(1) mex 命令设置 (a) 运行 Matlab ,在 Matlab 的命令窗口 (Command Window) 键入“ mex -setup ”命令后,按回车键,安装 Matlab 编译器: ...
随机推荐
- 打造你的前端神器-webstorm11
说起前端编辑器,用过dw,sublime,hbuilder,webstorm也不陌生,之前的版本8有用过一下,但是觉得比sublime重量太多,但是随着后来用node的开始,发现需要打造个web前端神 ...
- SharedPreferences具体解释(一)——基础知识
我们在开发软件的时候,常须要向用户提供软件參数设置功能,比如我们经常使用的微信,用户能够设置是否同意陌生人加入自己为好友.对于软件配置參数的保存,假设是在window下通常我们会採用ini文件进行保存 ...
- Django——快速实现注册
前言 对于web开来说,用户登陆.注册.文件上传等是最基础的功能,针对不同的web框架,相关的文章非常多,但搜索之后发现大多都不具有完整性,对于想学习web开发的新手来说不具有很强的操作性:对于web ...
- LoadRunner读取关联数组的个数和内容
web_reg_save_param_ex( "ParamName=response_header1", "LB=Set-Cookie: ", "RB ...
- 安卓---JNI使用
交叉编译 系统平台:Windows.Mac OS.Linux CPU平台:ARM.X86.MIPS 概念:在一个平台下打包编译出还有一个平台能够运行的程序#交叉编译原理 源代码->预编译-> ...
- src-resolve: 无法将名称 'extension' 解析为 'element declaration' 组件。
activiti流程部署时,出现“src-resolve: 无法将名称 'extension' 解析为 'element declaration' 组件.”错误. 出错原因:项目所在路径中有中文.
- openstack-计算节点安装(Node)
感谢朋友支持本博客,欢迎共同探讨交流.因为能力和时间有限.错误之处在所难免,欢迎指正. 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...
- 【SpringMVC学习10】SpringMVC对RESTfull的支持
RESTful架构,就是目前流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以正得到越来越多网站的采用.RESTful架构对url进行规范,写RESTful格式的url是什么样子 ...
- 关于Android项目中的分层,参考eoecn开源项目(8.29)
以下为eoecn开源项目的分层情况: ├ cn.eoe.app --存放程序全局性类的包├ cn.eoe.app.adapter --存放适配器的实现类的包 ├ cn.eoe.app.adapter. ...
- Expression构建DataTable to Entity 映射委托 sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。 sql server 多行数据合并成一列 C# 字符串大写转小写,小写转大写,数字保留,其他除外 从0开始用U盘制作启动盘装Windows10系统(联想R720笔记本)并永久激活方法 纯CSS打造淘宝导航菜单栏 C# Winform
Expression构建DataTable to Entity 映射委托 1 namespace Echofool.Utility.Common { 2 using System; 3 using ...
之后对opencv进行编译,这里configure选择visual studio 15 2017 win64