需要在Matlab2017a中使用包含有OpenCV2.4.9的C++文件。网上看了很多教程,但没有完整的清楚的教程,本篇教程,希望能弥补。

总的来说可以分为三步:

第一步:Matlab中配置Visual Studio C++的编译器

第二步:include OpenCV相关的库

第三步:写出相应的.CPP文件。

第一步:Matlab中配置Visual Studio C++的编译器

打开Matlab在命令行输入以下命令:

mex -setup -v会出来如下信息:
详细模式已开。
... 正在查找编译器 'Intel C++ Composer XE 2013 with Microsoft SDK 7.1 (C)'...
... 正在查找环境变量 'ICPP_COMPILER14'...否。
... 正在查找环境变量 'ICPP_COMPILER13'...否。
找不到已安装的编译器 'Intel C++ Composer XE 2013 with Microsoft SDK 7.1 (C)'。
... 正在查找编译器 'Intel C++ Composer XE 2013 with Microsoft Visual Studio 2012 (C)'...
... 正在查找环境变量 'ICPP_COMPILER14'...否。
... 正在查找环境变量 'ICPP_COMPILER13'...否。
找不到已安装的编译器 'Intel C++ Composer XE 2013 with Microsoft Visual Studio 2012 (C)'。
... 正在查找编译器 'Intel C++ Composer XE 2013 with Microsoft Visual Studio 2013 (C)'...
... 正在查找环境变量 'ICPP_COMPILER14'...否。
... 正在查找环境变量 'ICPP_COMPILER13'...否。
找不到已安装的编译器 'Intel C++ Composer XE 2013 with Microsoft Visual Studio 2013 (C)'。
... 正在查找编译器 'Intel Parallel Studio XE 2015 with Microsoft SDK 7.1 (C)'...
... 正在查找环境变量 'ICPP_COMPILER15'...否。
找不到已安装的编译器 'Intel Parallel Studio XE 2015 with Microsoft SDK 7.1 (C)'。
... 正在查找编译器 'Intel Parallel Studio XE 2015 with Microsoft Visual Studio 2012 (C)'...
... 正在查找环境变量 'ICPP_COMPILER15'...否。
找不到已安装的编译器 'Intel Parallel Studio XE 2015 with Microsoft Visual Studio 2012 (C)'。
... 正在查找编译器 'Intel Parallel Studio XE 2015 with Microsoft Visual Studio 2013 (C)'...
... 正在查找环境变量 'ICPP_COMPILER15'...否。
找不到已安装的编译器 'Intel Parallel Studio XE 2015 with Microsoft Visual Studio 2013 (C)'。
... 正在查找编译器 'Intel Parallel Studio XE 2015 with Microsoft Visual Studio 2015 (C)'...
... 正在查找环境变量 'ICPP_COMPILER15'...否。
找不到已安装的编译器 'Intel Parallel Studio XE 2015 with Microsoft Visual Studio 2015 (C)'。
... 正在查找编译器 'Intel Parallel Studio XE 2016 with Microsoft SDK 7.1 (C)'...
... 正在查找环境变量 'ICPP_COMPILER16'...否。
找不到已安装的编译器 'Intel Parallel Studio XE 2016 with Microsoft SDK 7.1 (C)'。
... 正在查找编译器 'Intel Parallel Studio XE 2016 with Microsoft Visual Studio 2012 (C)'...
... 正在查找环境变量 'ICPP_COMPILER16'...否。
找不到已安装的编译器 'Intel Parallel Studio XE 2016 with Microsoft Visual Studio 2012 (C)'。
... 正在查找编译器 'Intel Parallel Studio XE 2016 with Microsoft Visual Studio 2013 (C)'...
... 正在查找环境变量 'ICPP_COMPILER16'...否。
找不到已安装的编译器 'Intel Parallel Studio XE 2016 with Microsoft Visual Studio 2013 (C)'。
... 正在查找编译器 'Intel Parallel Studio XE 2016 with Microsoft Visual Studio 2015 (C)'...
... 正在查找环境变量 'ICPP_COMPILER16'...否。
找不到已安装的编译器 'Intel Parallel Studio XE 2016 with Microsoft Visual Studio 2015 (C)'。
... 正在查找编译器 'Intel Parallel Studio XE 2017 with Microsoft SDK 7.1 (C)'...
... 正在查找环境变量 'ICPP_COMPILER17'...否。
找不到已安装的编译器 'Intel Parallel Studio XE 2017 with Microsoft SDK 7.1 (C)'。
... 正在查找编译器 'Intel Parallel Studio XE 2017 with Microsoft Visual Studio 2012 (C)'...
... 正在查找环境变量 'ICPP_COMPILER17'...否。
找不到已安装的编译器 'Intel Parallel Studio XE 2017 with Microsoft Visual Studio 2012 (C)'。
... 正在查找编译器 'Intel Parallel Studio XE 2017 with Microsoft Visual Studio 2013 (C)'...
... 正在查找环境变量 'ICPP_COMPILER17'...否。
找不到已安装的编译器 'Intel Parallel Studio XE 2017 with Microsoft Visual Studio 2013 (C)'。
... 正在查找编译器 'Intel Parallel Studio XE 2017 with Microsoft Visual Studio 2015 (C)'...
... 正在查找环境变量 'ICPP_COMPILER17'...否。
找不到已安装的编译器 'Intel Parallel Studio XE 2017 with Microsoft Visual Studio 2015 (C)'。
... 正在查找编译器 'MinGW64 Compiler (C)'...
... 正在查找环境变量 'MW_MINGW64_LOC'...否。
找不到已安装的编译器 'MinGW64 Compiler (C)'。
... 正在查找编译器 'Microsoft Visual C++ 2012 (C)'...
... 正在查找注册表设置 'HKLM\SOFTWARE\Microsoft\VisualStudio\SxS\VS7' 11.0...否。
... 正在查找注册表设置 'HKCU\SOFTWARE\Microsoft\VisualStudio\SxS\VS7' 11.0...否。
... 正在查找注册表设置 'HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7' 11.0...否。
... 正在查找注册表设置 'HKCU\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7' 11.0...否。
找不到已安装的编译器 'Microsoft Visual C++ 2012 (C)'。
... 正在查找编译器 'Microsoft Visual C++ 2013 Professional (C)'...
... 正在查找注册表设置 'HKLM\SOFTWARE\Microsoft\VisualStudio\SxS\VS7' 12.0...否。
... 正在查找注册表设置 'HKCU\SOFTWARE\Microsoft\VisualStudio\SxS\VS7' 12.0...否。
... 正在查找注册表设置 'HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7' 12.0...否。
... 正在查找注册表设置 'HKCU\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7' 12.0...否。
找不到已安装的编译器 'Microsoft Visual C++ 2013 Professional (C)'。
... 正在查找编译器 'Microsoft Visual C++ 2015 Professional (C)'...
... 正在查找注册表设置 'HKLM\SOFTWARE\Microsoft\VisualStudio\SxS\VS7' 14.0...否。
... 正在查找注册表设置 'HKCU\SOFTWARE\Microsoft\VisualStudio\SxS\VS7' 14.0...否。
... 正在查找注册表设置 'HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7' 14.0...否。
... 正在查找注册表设置 'HKCU\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7' 14.0...否。
找不到已安装的编译器 'Microsoft Visual C++ 2015 Professional (C)'。
... 正在查找编译器 'Microsoft Windows SDK 7.1 (C)'...
... 正在查找注册表设置 'HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1' InstallationFolder...否。
... 正在查找注册表设置 'HKLM\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v7.1' InstallationFolder...否。
找不到已安装的编译器 'Microsoft Windows SDK 7.1 (C)'。

注:这是Matlab在寻找相关的编译器,但是一般由于VS安装路径不是默认路径,所以会出现找不到编译器。

这个时候网上有的教程会让你安装Min_gCC之类的C++编译器,但是实际上如果我们安装了VS之后,我们肯定有C++的编译器的。

我们只需要告诉Matlab,VS的C++编译器在哪里就可以了

找到Matlab的安装目录,并打开mexopts文件夹。我的路径如下:

D:\Program Files\MATLAB\R2017a\bin\win64\mexopts

可以看到里面有很多XML文件,比如:

msvc2012.xml
msvc2013.xml
msvc2015.xml
msvcpp2012.xml
msvcpp2013.xml
msvcpp2015.xml

这几个XML文件的作用就是记录对应版本的相关VS文件的位置。如果恰好没有你的版本,比如VS2017,你可以去Mathworks官方网站下载,但是如果你没有账号,那就可以用一下我下载过的吧:http://chenandongtime.github.io/tools/attachment_1487958_17a_win64_2017-05-10.zip

下载之后把2017的两个xml文件解压到上面的文件夹,并用记事本或其他工具打开一个MSVCPP2017.xml找到VCROOT目录

<VCROOT><and><or><hklmExists path="SOFTWARE\Microsoft\VisualStudio\SxS\VS7" name="15.0" /><hkcuExists path="SOFTWARE\Microsoft\VisualStudio\SxS\VS7" name="15.0" /><hklmExists path="SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7" name="15.0" /><hkcuExists path="SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7" name="15.0" /></or><fileExists name="$$\VC\bin\amd64\cl.exe" /><dirExists name="$$\..\.." /></and>
</VCROOT>对Path路径修改,修改到你自己的VS安装路径,我的修改后如下:
<VCROOT><and><or><hklmExists path="D:\Program Files (x86)\Microsoft Visual Studio\2017\Community" name="14.0" /><hkcuExists path="D:\Program Files (x86)\Microsoft Visual Studio\2017\Community" name="14.0" /><hklmExists path="SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7" name="14.0" /><hkcuExists path="SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7" name="14.0" /></or><fileExists name="$$\VC\bin\amd64\cl.exe" /><dirExists name="$$\..\.." /></and>
</VCROOT>

可以根据xml文件最后的env中的path路径反推出上文中应该添加的路径。MSVC和MSVCPP都做同样修改。

再次运行:mex -setup -v
结果中有很多是,表示配置好了C++的编译器

正在查找注册表设置 'HKLM\SOFTWARE\Microsoft\VisualStudio\SxS\VS7' 15.0...否。
... 正在查找注册表设置 'HKCU\SOFTWARE\Microsoft\VisualStudio\SxS\VS7' 15.0...否。
... 正在查找注册表设置 'HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7' 15.0...是('D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\')。
... 正在查找文件 'D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat'...是。
... 正在查找文件夹 'D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build'...是。
... 正在查找注册表设置 'HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows Kits\Installed Roots' KitsRoot10...是('D:\Windows Kits\10\')。
... 正在查找注册表设置 'HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows Kits\Installed Roots' KitsRoot10...是('D:\Windows Kits\10\')。
... 正在执行命令 'echo off&set "sdkversion="&(for /f %a IN ('dir "D:\Windows Kits\10\include\" /b /ad-h /on') do ( @if exist "D:\Windows Kits\10\include\%a\ucrt\" set "sdkversion=%a" ))&call echo %sdkversion%'...是('10.0.18362.0')。
找到已安装的编译器 'Microsoft Visual C++ 2017 (C)'。
MEX 配置为使用 'Microsoft Visual C++ 2017 (C)' 以进行 C 语言编译。
警告: MATLAB C 和 Fortran API 已更改,现可支持包含 2^32-1 个以上元素的 MATLAB 变量。您需要更新代码以利用新的 API。您可以在以下网址找到更多的相关信息:http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html。要选择不同的语言,请从以下选项中选择一种命令:mex -setup C++ mex -setup FORTRAN

检验,打开文件

D:\Program Files\MATLAB\R2017a\extern\examples\mex\mexcpp.cpp

也可以自己写.cpp文件,遵照一些规则,参考:https://blog.csdn.net/zouxy09/article/details/20553007

运行:

>> mex mexcpp.cpp
使用 'Microsoft Visual C++ 2017' 编译。
MEX 已成功完成。>> mexcpp(1,2)The initialized data in object:
Value1 = 0
Value2 = 0After setting the object's data to your input:
Value1 = 1
Value2 = 2

ok!第一步结束。

第二步配置OpenCV

继续在Matlab命令行中输入以下命令:

 mex -v mexcpp.cpp

在输出中找到文件:mex_C++_win64.xml

可以在上面的命令行输出结果中找到以下行代码:

Options file: C:\Users\Antime\AppData\Roaming\MathWorks\MATLAB\R2017a\mex_C++_win64.xml

用编辑器打开文件mex_C++_win64.xml,在末尾的环境变量做如下配置,

<env PATH="原属性值;E:\download\opencv\build\x64\vc12\bin"INCLUDE="原属性值;E:\download\opencv\build\include;E:\download\opencv\build\include\opencv2;E:\download\opencv\build\include\opencv"LIB="原属性值;E:\download\opencv\build\x64\vc12\lib\"LIBPATH="原属性值;E:\download\opencv\build\x64\vc12\lib\"
/>

注意配置中做好各种细节,比如分号,\等的符号。

第三步写一个测试文件:

#pragma comment( lib, "opencv_core249.lib")
#pragma comment( lib, "opencv_calib3d249.lib")
#pragma comment( lib, "opencv_contrib249.lib")
#pragma comment( lib, "opencv_features2d249.lib")
#pragma comment( lib, "opencv_flann249.lib")
#pragma comment( lib, "opencv_gpu249.lib")
#pragma comment( lib, "opencv_highgui249.lib")#pragma comment( lib, "opencv_imgproc249.lib")
#pragma comment( lib, "opencv_legacy249.lib")
#pragma comment( lib, "opencv_ml249.lib")
#pragma comment( lib, "opencv_nonfree249.lib")
#pragma comment( lib, "opencv_objdetect249.lib")
#pragma comment( lib, "opencv_ocl249.lib")
#pragma comment( lib, "opencv_photo249.lib")#pragma comment( lib, "opencv_stitching249.lib")
#pragma comment( lib, "opencv_superres249.lib")
#pragma comment( lib, "opencv_ts249.lib")
#pragma comment( lib, "opencv_video249.lib")
#pragma comment( lib, "opencv_videostab249.lib")#include"mex.h"#include <opencv/cv.h>
#include <opencv2/highgui/highgui.hpp>void mexFunction (int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{char name[256];int buflens =mxGetNumberOfElements(prhs[0]);mxGetString(prhs[0], name, buflens+1);if(!mxIsChar(prhs[0])){mexErrMsgTxt("First parameter must be string/n");return ;}mexPrintf(name);IplImage * img = cvLoadImage(name);if(img->imageData == NULL){mexErrMsgTxt("Error in image/n");return;}cvNamedWindow("test");cvShowImage("test",img);cvWaitKey(0);return;}

继续max 生成文件,即可以了

测试文件头应该要包含库,但这样做太难受了,应该有简单方法。

参考资料:

https://blog.csdn.net/cfqcfqcfqcfqcfq/article/details/63295746?utm_source=blogxgwz1

https://blog.csdn.net/zjsmdchen/article/details/78317366

Matlab-OpenCV-VC-混合编程配置相关推荐

  1. 螺杆泵matlab,基于Matlab与VC++混合编程的螺杆泵转子型线设计

    2011年第 3期 (总 227期 ) · 1 · 收稿日期: 2010 - 12 - 23 基金项目:国家高技术研究发展计划资助项目 (2007AA05Z208) 设计研究 文章编号: 100622 ...

  2. 基于MATLAB与VC混合编程的数字均衡器设计

    1.概述 随着数字化技术的快速.深入发展,人们对数字化电子产品所产生的图像.图形以及声音等质量的要求越来越高.在实时数字处理过程中,与D/A和A/D转换相关的模拟信号重构过程是决定数字系统输出质量的关 ...

  3. matlab与vc混合编程指导书.doc,vc与matlab混合编程—基于com.doc

    vc与matlab混合编程-基于com.doc VC与MATLAB混合编程基于COM2010年03月21日星期日1118注意旨在提供一份VC调用MATLAB的快速试验参考和一些实际经验,不保证所有内容 ...

  4. MATLAB与VC混合编程(1)

    在本节中先介绍matcom,使得VC能调用Matlab 的M文件,从而实现混合编程. Matcom是mathTools公司推出的一个能将M文件转化成相同功能C++代码的工具.相比Matlab自带的编译 ...

  5. matlab mex使用vc,matlab和VC++混合编程(mex方法)【转帖】

    第一节.用c编写mex程序[开篇] 用C编写mex程序 大家都知道,matlab是一种解释型的编程环境,也就是说,跟以前的basic一样,是读 一句执行一句的.这样做可以很方便的实现编程过程中的交互, ...

  6. 阅读《基于MATLAB与VC混合编程的数字均衡器设计》的要点

     1. 巴特沃斯滤波器的特点是 通频带内的频率响应曲线最大限度平坦,没有起伏,而在阻频带则逐渐下降为零. 在 振幅的对数对角频率的 波特图上,从某一边界角频率开始,振幅随着角频率的增加而逐步减少,趋向 ...

  7. Matlab与C++混合编程(依赖OpenCV)

    opencv 2.4.6 和VS2008和matlab混合编程配置_YanhaoZhang_新浪博客 http://blog.sina.com.cn/s/blog_4a1853330102vg2r.h ...

  8. matlab与vs混合编程,matlab与vs混合编程/matlab移植

    前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部 ...

  9. matlab 与VS混合编程的几个问题

    matlab 与VS混合编程的几个问题 根据前一段的时间matlab与VS程序数据互传的程序调试,总结一下编译调试过程中可通遇到的几个问题及处理方法. 1.环境与资源配置 本人用的是matlab201 ...

  10. 在matlab中 编程n,Matlab与C++混合编程 1--在C++中调用自己写的matlab函数

    在Visual Studio中使用C++中调用MATLAB程序 在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目 ...

最新文章

  1. python 爬虫输出为空,python爬取文件时,内容为空
  2. 今天才知道,MySQL 的 binlog 编号可以这么大!
  3. c 字符串数组_在C++中将字符串转换为char数组
  4. 创新数字音频处理技术带来消费电子产品差异化用户体验(转)
  5. 七、制作主题(二) Anatomy of a theme
  6. java kill 进程 时间_kill及kill-9的用法及如何实现进程的优雅退出
  7. 用卷积神经网络识别实际田间条件下茶叶病虫害(自然环境下拍摄的数据集不用太多预处理)
  8. CG-光栅图形学区域填充算法-学习笔记
  9. 网站排障的一些小命令
  10. TABLE与DIV的取舍
  11. Decide what you want,and go after it with everything you got!
  12. teamview外网连接服务器虚拟主机,利用路由器端口映射+桥接虚拟机搭建个人服务器...
  13. 一个简单的makefile编写(gcc)
  14. 【UCOSIII操作系统】硬件初始化篇(1)硬件初始化以及开始运行系统
  15. Hbase HBCK2
  16. SwiftUI实战教程 第二章 BMI计算器
  17. 第6章 歌手详情页开发
  18. Bean、BeanDefinition、BeanFactory、FactoryBean
  19. maven添加阿里镜像急速提升jar下载速度
  20. MySQL数据库中插入图片

热门文章

  1. 海量数据中,寻找最小的k个数。
  2. 关于蚁剑/菜刀无法连接shell的一种可尝试解决方案
  3. springboot微信支付pc页面生成二维码
  4. 1×pbs缓冲液配方_PBS缓冲液的配制
  5. 系统ghost后变成一个盘了别的分区的文件怎么找回
  6. 基于Java的Selenium学习笔记——Assert
  7. 深入学习 History 对象管理浏览器会话历史
  8. BZOJ 2436 NOI嘉年华(单调优化)
  9. IP地址,子网掩码,默认网关,路由,形象生动阐述
  10. 3.集--LinkedTransferQueue得知