1 利用 mexopencv 实现各种数据的转换

int i = MxArray(prhs[0]).toInt();
double d = MxArray(prhs[0]).toDouble();
bool b = MxArray(prhs[0]).toBool();
std::string s = MxArray(prhs[0]).toString();
cv::Mat mat = MxArray(prhs[0]).toMat(); // For pixels
cv::Mat ndmat = MxArray(prhs[0]).toMatND(); // For N-D array
cv::Point pt = MxArray(prhs[0]).toPoint();
cv::Size siz = MxArray(prhs[0]).toSize();
cv::Rect rct = MxArray(prhs[0]).toRect();
cv::Scalar sc = MxArray(prhs[0]).toScalar();
cv::SparseMat s = MxArray(prhs[0]).toSparseMat(); // Only double to float
plhs[0] = MxArray(i);
plhs[0] = MxArray(d);
plhs[0] = MxArray(b);
plhs[0] = MxArray(s);
plhs[0] = MxArray(mat);
plhs[0] = MxArray(ndmat);
plhs[0] = MxArray(pt);
plhs[0] = MxArray(siz);
plhs[0] = MxArray(rct);
plhs[0] = MxArray(sc);
plhs[0] = MxArray(sp); // Only 2D float to double

2 Matlab struct/cell to C++

例1 :for struct:
matlab.m 文件中:

options.name=’xlh’;
options.age=25;
options.arr=[10 20 30;5 6 7];

调用函数:

res=mex_function(options);

mex_function.cpp 文件中:

/*
* pm [index].fieldname,因此,options 是一个 1*1 的结构体,故下面的函数中第二个参数为 0
* 其中 pm 是 mxArray *类型。
*/
mxArray *mx_name=mxGetField(prhs[0],0,’name’);
//下面用两个方法获得 name 中的’xlh’:
//for mexopencv
string str_name=MxArray(mx_name).toString();
//for mx
char * str_name= mxArrayToString(mx_name);

例2:for cell:
matlab.m 文件中:

opt_param.table{1,1}=[1 2 3 4 5];
opt_param.table{1,2}=[6 7 8 9 10];
opt_param.table{2,1}=[11 12 13 14 15];
opt_param.table{2,2}=[16 17 18 19 20];

调用函数:

res=mex_function(options);

mex_function.cpp 文件中:

mxArray *table=mxGetField(prhs[0],0,’table’); //获取 table 元胞。
mxArray *elem=mxGetCell(table,1);//获取 table 元胞中的第二个元素,因为 matlab 是按列存储的,mxGetCell 函数中的 1,表示索引, 多维数组的索引计算参考 matlab 帮助文档中。
Mat mat=MxArray(elem).toMat();

因此:mat 的结果为:[11 12 13 14 15]。注意输出数据安装 mat.at输出,因为 matlab 中
的数字的存储默认为 double 类型。

3 C++ to Matlab struct/cell

matlab.m 文件中:

table=mex_function(img);//其中 img 是一个图像.
mex_cpp 文件中;
我们的目的是想实现 C++中的 plhs[0]( 即输出参数) 传到 matlab 有如下的形式(即元胞的
形式):
table{1,1}=feature_vector
table{1,2}= feature_vector

table{n,n}=feature_vector;
其中 feature_vector 是一个列矢量,也可以是一个图像矩阵。

mex_cpp 文件中:

mxArray * mx_cell=mxCreateCellMatrix(2,2);//创建2*2大小的cell
plhs[0]=mx_cell;//使输出指向这个cell
Mat feature1=(Mat_<double>(1,5)<<1,2,3,4,5);
Mat feature2=(Mat_<double>(1,5)<<6,7,8,9,10);
Mat feature3=(Mat_<double>(1,5)<<11,12,13,14,15);
Mat feature4=(Mat_<double>(1,5)<<16,17,18,19,20);
mxArray * mx_feat1=MxArray(feature1);//使用mexopencv实现,也可以使用mx函数实现。
mxArray * mx_feat2=MxArray(feature2);
mxArray * mx_feat3=MxArray(feature3);
mxArray * mx_feat4=MxArray(feature4);
mxSetCell(plhs[0],0,mx_feat1);
mxSetCell(plhs[0],1,mx_feat2);
mxSetCell(plhs[0],2,mx_feat3);
mxSetCell(plhs[0],3,mx_feat4);

注释:
Matlab和C++的接口信息都可以通过下面的方式查询:

matlab->Advanced Software Development->MATLAB API for Other Languages->C/C++ Matrix Libray API
API 描述
Data Types 数据类型
Create or Delete Array 创建/删除数组
Validate Data 检验数据的类型/有效性
Access Data 访问数据
Convert Data Types 转换数据类型

转载于:https://www.cnblogs.com/raby/p/5886702.html

Matlab和C++混合编程相关推荐

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

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

  2. 基础知识(一)matlab与c++混合编程之环境搭建

    Matlab 与c++混合编程方法 开发环境:win7 64位+vs2010+matlab 如果想要让matlab调用c++的函数类,则需要把c++编译成

  3. 基础知识(二)matlab与c++混合编程之经验笔记

    开发环境:win7 64位+vs2010+matlab 学习matlab与c++混合编程的路上有时候会遇到莫名其妙的错误,因此做一下记录: 2015年: 1.由于系统是64位,装的matlab的链接库 ...

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

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

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

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

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

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

  7. MATLAB 部署工具(Deployment Tool)的使用——MATLAB与C#混合编程

    MATLAB 部署工具(Deployment Tool)的使用 MATLAB与C#混合编程 对于许多开发者而言,借助MATLAB提供的丰富的矩阵运算,实现需求算法,相比于纯手工实现底层算法具有较高的效 ...

  8. Matlab和C#混合编程

    Matlab和C#混合编程 Matlab生成dll文件 C#使用dll 工作中有一些老算法在matlab中实现,新项目需要用C#来做,只能用matlab和C#混合编程,在matlab下把老算法编译成d ...

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

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

  10. C++调用MATLAB程序进行混合编程以及常见问题解决

    C++调用MATLAB程序进行混合编程以及常见问题解决 C++调用MATLAB程序方法 MATLAB打包生成DLL动态链接库 VS2017环境配置 程序调用 常见问题解决 参考 C++调用MATLAB ...

最新文章

  1. 程序提示确认关闭后退出
  2. MultiObjective using Evolutionary Algorithms (2) -- Multi-Objective Optimization
  3. 2010年基于Linux的10大技术趋势
  4. C#实现javascript的escape
  5. 从任务到可视化,如何理解LSTM网络中的神经元 By 机器之心2017年7月03日 14:29 对人类而言,转写是一件相对容易并且可解释的任务,所以它比较适合用来解释神经网络做了哪些事情,以及神经网
  6. SAP登录IP绑定校验
  7. 穿越时空,跟我一起探索云栖数字谷(2021云栖大会免费送票)
  8. [COGS 0065][NOIP 2002] 字串变换
  9. 保护公民信息安全 中国在行动
  10. android访问服务器405,android – HTTP状态405 – 不允许的方法(jax-rs服务)
  11. Java实现动态代理的两种方式
  12. TensorFlow基础:Session(会话)
  13. multisim 仿真
  14. MT7921:WIFI、AP、BT基础知识
  15. JS——判断变量类型方法汇总
  16. 靓号,java正则表达式的实现
  17. 微信小游戏 缓存目录
  18. 关于QQ群头像以及微信讨论组头像的工具类
  19. mysql 中字段存放表情符号,Incorrect string value: ‘\xF0\x9F\x8C\xBB‘ for column
  20. 云帆起航-助力“上云”筑梦服务

热门文章

  1. linux添加windows网络打印机,Linux Mint如何添加windows分享的网络打印机?
  2. python敏感字替换_python用类实现文章敏感词的过滤方法示例
  3. xmanager linux,教您用xmanager启动Linux上的图形界面程序-Go语言中文社区
  4. 8条嵌入式C语言编程小知识总结
  5. Python3解题:二叉树路径总和问题
  6. java9 coutdown_Java并发之CountDownLatch
  7. python中递归函数写法_python递归函数用法详解
  8. 在线画 有穷状态自动机 的软件_怎么画思维导图?不用下载软件,在线就能操作...
  9. 世界机器人冠军王宇航_★​身边的榜样,为你喝彩:我校学子摘冠第七届河南省VEX U机器人挑战赛...
  10. PoE交换机如何才能稳定连接和安全使用?