安装MinGW-w64 C/C++ 编译器

方法一:
下载地址:https://jmeubank.github.io/tdm-gcc/download/
http://tdm-gcc.tdragon.net/download地址已失效;
方法二:
MATLAB Support for MinGW-w64 C/C++ Compiler:
https://www.mathworks.com/support/requirements/previous-releases.html
https://www.mathworks.com/matlabcentral/fileexchange/52848-matlab-support-for-mingw-w64-c-c-compiler

下载 好后,在matlab进入文件路径

在命令行窗口中输入"mbuild -setup"(横线前有一个空格),如果出现如下图所示的提示信息即为成功。

成功后在命令行窗口中输入"mex -setup C++ "(横线前有一个空格),如果出现如下图所示的提示信息即为成功。

方法分类

方法一:Matlab脚本节点

方法二:Coder/deploytool+VS编译,生成dll

方法三:调用COM对象

方法四:.Net方法

dll的调用方式
方法一:使用CLF对dll文件进行直接调用

方法二:使用共享库向导封装dll文件

脚本节点

https://zone.ni.com/reference/en-XX/help/371361R-01/lvhowto/creating_a_matlab_script/

Coder+VS编译生成dll

网上说:DLL是利用编译器将MatLab程序封装成函数库,但MatLab编译器直接封装出来的DLL在LabVIEW中基本不可用,因为MatLab封装出来的DLL是基于mxArray数据类型的,LabVIEW没有或找不到与之对应的数据类型(用DLL一个可行的办法是实用VC/VC++进行二次封装,但费时费力)

Coder生成c文件

打开.m文件

function []=test(path)%#codegencoder.extrinsic('imread');coder.extrinsic('image');coder.extrinsic('colorbar');coder.extrinsic('saveas'); coder.extrinsic('figure');In=zeros(960,1280);Offset=zeros(960,1280);In=imread(path);In=double(In);for i=1:960for j=1:1280Offset(i,j)= -0.0028*In(i,j)^3 + 0.1973*In(i,j)^2 + 0.4628*In(i,j) + 44.225;endendfigure(1);h=image(Offset);colorbar;figure('visible','off');saveas(h,'test1.jpeg');
end

注意添加:coder.extrinsic(’***’);
matlab的官方教程中有如下限制,所以只能用于8位JPEG图像;

传统方式:命令行中输入"deploytool"的方式只能生成64位dll文件(和Matlab版本相关),网上的说法是先用64位LabVIEW调用,再用32位LabVIEW与64位LabVIEW相互,过于繁琐。

命令行中输入"coder",选择function函数

设置输入输出参数,这里path要选择char1*n类型

选择测试脚本进行测试,也可用本身的function函数进行,不过会报错;


VS生成dll文件

打开vs2013,创建一个新的项目,操作如图



导入matlab生成的c代码

创建一个新的模块定义文件

第一行双引号内的内容可以随意
第二行EXPORTS
第三行为输出的函数名

LIBRARY "testvs"EXPORTStest

点击生成解决方案,则DLL已生成;

发现在64平台可以成功,win32不行,怀疑libmwjpegreader的头文件和库只有64位,尝试用Matlab2015(32位)重新生成;

问题故障解决

  • Undefined function or variable ‘In’. The first assignment to a local
    variable determines its class.

    网上的解决方法不固定,应该是参数没有预设或者类型不匹配;
    For example, suppose that the function foo returns a 3-by-4 array of real doubles. Then you would use code like:
    coder.extrinsic(‘foo’);
    x = zeros(3,4);
    x = foo(y);

    function []=test(path)In=zeros(1280,960);In=imread(path);
    

    我这里是:输入参数path不能设置为string,而是char;

  • Function ‘image’ not supported for code generation.
    添加:coder.extrinsic(’***’); 提示缺少什么添加什么。
    添加coder.extrinsic(‘imread’);无作用,imread不支持coder,待解决(这是这种方法的硬伤);

    https://stackoverflow.com/questions/29759851/alternatives-to-extrinsic-functions-such-as-imread-and-other-functions-during-co
    https://www.researchgate.net/post/MATLAB_does_not_support_imread_function_for_standalone_code_generation_Are_their_any_alternatives_to_the_imread_function_in_MATLAB

    总的来说Matlab用Coder编译出的c文件,对于功能的支持还不是很完善;

  • 无法打开 源 文件 "libmwjpegreader.h"
    项目属性->配置属性->C/C+±>常规->附加包含目录->$(ProjectDir)
    添加:D:\Program Files\Polyspace\R2019a\extern\include

  • error LNK2019: 无法解析的外部符号 _jpegreader_getimagesize,该符号在函数 _test 中被引用
    参考:https://blog.csdn.net/woshigaowei5146/article/details/115656266
    32位失败,64位成功;

    具体方法:

  1. .h里面声明了某个方法,没有在cpp里面实现,添加Matlab生成的所有.c文件;
  2. 平台换位64位;(生成的dll还是64位,矛盾)
  3. 包含目录中添加:D:\Program Files\Polyspace\R2019a\extern\include和D:\Program Files\Polyspace\R2019a\extern\include\win64;
  4. 库目录中添加D:\Program Files\Polyspace\R2019a\extern\lib\win64\microsoft链接器-输入-附加依赖项:libmwjpegreader.lib
    5)将D:\Program Files\Polyspace\R2019a\bin\win64下添加进path

参考

https://blog.csdn.net/rmrgjxeivt/article/details/104521287
https://blog.csdn.net/top_along/article/details/40791909
https://blog.csdn.net/winser_loner/article/details/108689044

COM组件

注意LabVIEW和Matlab的版本要统一,我这里用的是LabVIEW2018 32位和Matlab2015b 32位;

故障问题解决

Java Package

https://blog.csdn.net/decat2008/article/details/51254154 换用JDK1.7(官网下载可直接拖到迅雷),使用cmd,java -version查看版本;

matlab2015b 32位,卸载JDK1.8_64,并安装JDK1.7_32(网站https://www.oracle.com/java/technologies/javase/javase7-archive-downloads.html,需注册)并设置环境变量:

新建系统变量JAVA_HOME 和CLASSPATH
变量名:JAVA_HOME
变量值:C:\Program Files (x86)\Java\jdk1.6.0_10
变量名:CLASSPATH
变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
变量名:Path
变量值的最前面添加:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 【注:若是放到中间记得这个的前面要加;】

重启电脑(必须);验证java -version查看版本;

或者因破解不完全,重新导入破解文件激活matlab(按网上的说法应该经常出现在matlab2014a版本中);

未找到编译器

1、MATLAB与编译器的安装顺序有很大的关系,若后安装编译器,虽然能调用,会导致MATLAB生成COM时找不到编译器的注册表文件。也可修改系统安装里的头文件解决,详情自找,思路为更新MATLLAB bin\win64下mexopts文件。

2、此处直接建议装Visual Studio,MATLAB调用方便,按官方提示装GCC容易出问题。本人用的MATLAB2018和VS2017。

参考

https://jingyan.baidu.com/article/5970355287bd448fc0074086.html
https://blog.csdn.net/arashif/article/details/21559735
https://blog.csdn.net/weixin_44646978/article/details/104020865

.NET方法


选择函数时,若有输出则选择makesquare(Int32 numArgsOut, Object x) ,若无输出则选择makesquare(Object x) ,否则出现错误1172;

注意:输出参数的数据类型选择为二维数组;
注意:Labview和Matlab的位数要一致,否则出现错误1172;

参考

https://knowledge.ni.com/KnowledgeArticleDetails?id=kA03q000000YGE2CAO&l=zh-CN
https://www.mathworks.com/help/compiler_sdk/gs/create-a-dotnet-application-with-matlab-code.html

总结

Matlab脚本节点可输入输出路径或图像矩阵,但我要获取matlab生成的colorbar,而且需要Matlab环境,无奈放弃,但这不失为一种简便的好方法;

Coder/deploytool+VS编译,出现的问题较多,刚开始用这个方法,奈何解决不了LabVIEW与Matlab的位数不同的问题,无奈放弃(可尝试将输入参数由路径改为矩阵,不用imread,再用coder vs,由于忙别的事去了,没有试验过);

调用COM对象:网上用的最多的办法,但是经常出现错误:0x0000007e Message: 找不到指定的模块 和 LNK1123: 转换到 COFF 期间失败: 文件无效或损坏;

.NET方法:简单快捷,实测有效;

LabVIEW与Matlab混合编程进行图像处理(附带颜色栏Colorbar)相关推荐

  1. LabVIEW与MATLAB混合编程——调用Matlab中.m的函数

    LabVIEW与MATLAB混合编程--调用Matlab中.m的函数 1.调用labview中的matlab script 通过Labview中的Matlab script可以调用Matlab的.m程 ...

  2. labview中java联合编程_LabVIEW与MATLAB混合编程的实现

    本栏目责任编辑:谢媛媛系统软件与软件工程 ComputerKnowledgeand Technology 电脑知识与技术 第 6 卷第 15 期 (2010 年 5 月) LabVIEW 与 MATL ...

  3. LabVIEW与MATLAB联合编程之使用dll库文件连接

    LabVIEW与MATLAB联合编程之使用dll库文件连接 最近做东西的时候用到了在LabVIEW里面调用MATLAB的分类模型,辗转多篇文章终于搞定,特此记录,以供参考. 编程环境:Windows1 ...

  4. matlab两个多项式相除,C++和MATLAB混合编程求解多项式系数(矩阵相除)

    摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...

  5. 怎样用matlab打开mw文,C# matlab混合编程 MWArray使用笔记

    C# matlab混合编程 徐凯Email:xukai19871105@http://www.doczj.com/doc/1a6e191fff00bed5b9f31dbf.html 这几天突然想搞一搞 ...

  6. c 使用matlab引擎,[转载]C与MATLAB混合编程之调用MATLAB引擎

    Visual Studio调用MATLAB需要的配置已经在<Visual Studio调用MATLAB的配置>一文中给出了详细的步骤,本文将介绍混合编程的示例. 在C中调用MATLAB,据 ...

  7. WPF(C#)与MATLAB混合编程

    WPF(C#)与MATLAB混合编程 WPF可以为开发者提供便捷地构建用户交互界面的解决方法,而matlab则在科学计算方面有着无与伦比的优势,因此在一些需要将科学算法转换为应用软件的项目中,需要应用 ...

  8. VS和matlab混合编程的推荐书籍!

    1. 精通MATLAB混合编程 丁毓峰

  9. C++和MATLAB混合编程-DLL篇

    先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件 ...

  10. matlab求解多项式系数,C++和MATLAB混合编程求解多项式系数(矩阵相除)

    摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...

最新文章

  1. 更新系统时跳过某个软件包
  2. linux ospf 命令,OSPF单区域配置 - linuxprobe2020的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. 如何用计算机装手机系统,如何用手机usb重装电脑系统
  4. cnblog div+CSS 布局常识 8问
  5. cuda Synchronization
  6. 人群与网络:网络与图论
  7. java mongodb 使用场景_MongoDB 数据库引用
  8. centos7.0配置php环境,如何在centos7中配置一个php开发环境
  9. 圈圈教你学USB学习资料大全(包含完整光盘和教程)
  10. 神策分析:三大价值搭建精细化渠道管理体系
  11. ccd后视摄像头_20192020年车载摄像头产业报告
  12. c 语言读取硬盘序列号,C++读取硬盘序列号
  13. 让微积分穿梭于工作与学习之间(7):我自认为牛逼的成果之三:直接用定义求正切函数的导数
  14. 记忆力训练软件测试自学,记忆力训练题,每天10分钟,一周提高5倍记忆力
  15. Euclid‘s Game(博弈)
  16. 杂谈(1)--人生必知的78种经典效应
  17. 量化金融kaggle竞赛汇总
  18. 小学老师如何与不同性格的家长沟通?
  19. 谁能够最终实现超越普通计算机的“量子霸权”
  20. EMI滤波器的matlab仿真,开关电源EMI滤波器的仿真设计

热门文章

  1. minecraft_如何轻松地在Minecraft版本之间切换
  2. 《程序人生》2020无畏年少青春,迎风潇洒前行,杭漂程序员2019的心路历程,披荆斩棘终雨过天晴
  3. ScreenToGif
  4. TOOLTIPS 的相关用法
  5. 优锘科技:CMDB的本质以及它能解决什么问题?
  6. 5 行 Python 代码就能让你的电脑永不息屏!
  7. OpenCV笔记之六(4)——图像处理之颜色通道拆分、合并及颜色空间
  8. yyds,Python爬虫从小白到Bigboss全套学习路线+视频+资料
  9. 酒店订房系统 java_javaweb酒店客房预订系统
  10. 旁路电容和去偶电容Bypass and Decouple