C++调用matlab时 数组转换成矩阵怎么处理

Super_dfss 2011-05-12 02:46:26
c++的数据是先行再列 但是matlab是先列再行
本来认为在matlab里转置就可以了 但是好像结果不对
改怎么做呢
//从c++给matlab传数据
const mwSize dims[3]={IMAGE_HEIGHT,IMAGE_WIDTH,3};
mxArray *A=mxCreateNumericArray(3,dims,mxUINT8_CLASS,mxREAL);
unsigned char* pchar=(unsigned char*)mxGetData(A);
for(int i=0;i<dataLength;i++)
{
pchar[i]=lpdata[i];
}

//把结果从matlab传回c++
mxArray *C=mxCreateNumericArray(3,dims,mxUINT8_CLASS,mxREAL);
mlfFaceMatch(1,&C,A); //调用m文件函数
memcpy(lpdata,mxGetPr(C),3*IMAGE_WIDTH*IMAGE_HEIGHT*sizeof(unsigned char));

lpdata是内存中的视频帧数据 IMAGE_HEIGHT和IMAGE_WIDTH是图像高度和宽度
在matlab的代码里我用了转置 但是好像还是不对 视频能正常播放 但是处理的效果不对 麻烦大家给看看 谢谢
...全文
649 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
分号 2013-07-02
  • 打赏
  • 举报
回复
引用 8 楼 u011174896 的回复:
[quote=引用 3 楼 novaliang 的回复:] 我的第一个方法是把MATLAB实现的功能做成DLL,然后会形成类似 void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ); 的函数,然后在VC中就只管发送和接收数据,当然这个方法麻烦就麻烦在还是需要转换数据; 第二个方法就是把MATLAB直接编译成exe,让它可以独立处理数据,然后在vc中做一个调用,直接调用那个exe程序,当matlab的程序在运行时,我的vc就等待结果,一般是等待生成的文件,当文件生成好后,就读取进来,再处理文件; 我看了你的代码,发现你从c++传值到matlab有问题,根据我看到的理解,你应该是把一张24位位深的图片分为RGB的3维矩阵来存储,那么你在从c++赋值到matlab时,最好使用 for(int k = 0; k < 3; k++) for(int j = 0; j < nHeight; j++) for(int i = 0; i < nWidth; i++) { pchar[j * nWidth + i + (nHeight * nWidth) * k] = lpdata + j * nStep + i * 3 + k; } (假设lpdata是指向24位位图数据的指针,nStep是步长) 的形式赋值,这样可以保证赋值不会错,rgb值不会打绞。 其次,你在把数据从matlab中读回后,也应该按照上面的方法反过来赋值。你先试试吧,这个vc、matlab混合编程我有大半年没弄了,也忘的差不多了。
兄弟,看了你的帖子我恍然大悟,请问按照你的第二种方法。做出来的程序可以脱离matlab而直接运行吗[/quote] matlab软件不用安装了,只需要安装一个类似支持java运行的环境的东西,就是MCRInstaller.exe,这个就在matlab的安装目录下,不过不同版本的matlab位置不一样的,你可以查看帮助找一下。
Merida0520 2013-06-30
  • 打赏
  • 举报
回复
引用 3 楼 novaliang 的回复:
我的第一个方法是把MATLAB实现的功能做成DLL,然后会形成类似 void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ); 的函数,然后在VC中就只管发送和接收数据,当然这个方法麻烦就麻烦在还是需要转换数据; 第二个方法就是把MATLAB直接编译成exe,让它可以独立处理数据,然后在vc中做一个调用,直接调用那个exe程序,当matlab的程序在运行时,我的vc就等待结果,一般是等待生成的文件,当文件生成好后,就读取进来,再处理文件; 我看了你的代码,发现你从c++传值到matlab有问题,根据我看到的理解,你应该是把一张24位位深的图片分为RGB的3维矩阵来存储,那么你在从c++赋值到matlab时,最好使用 for(int k = 0; k < 3; k++) for(int j = 0; j < nHeight; j++) for(int i = 0; i < nWidth; i++) { pchar[j * nWidth + i + (nHeight * nWidth) * k] = lpdata + j * nStep + i * 3 + k; } (假设lpdata是指向24位位图数据的指针,nStep是步长) 的形式赋值,这样可以保证赋值不会错,rgb值不会打绞。 其次,你在把数据从matlab中读回后,也应该按照上面的方法反过来赋值。你先试试吧,这个vc、matlab混合编程我有大半年没弄了,也忘的差不多了。
兄弟,看了你的帖子我恍然大悟,请问按照你的第二种方法。做出来的程序可以脱离matlab而直接运行吗
daijyan 2012-03-24
  • 打赏
  • 举报
回复
你好,我也是第一次用c++调用matlab函数,上面你们说的我怎么没看懂啊?我是用c++调用matlab引擎的,请问可以给我发个读图像的小程序吗?
Super_dfss 2011-05-14
  • 打赏
  • 举报
回复
谢谢novaliang这位兄弟 问题我解决了 我把结果写出来吧 也帮助下后来人 原来c++的图像是R1 G1 B1 R2 G2 B2 R3 G3 B3...形式排列 而且数据是倒排的 这还不够 但是横向的却是正排的
R7 B7 G7 R8 B8 G8 R9 B9 G9
R4 B4 G4 R5 B5 G5 R6 B6 G6
R1 B1 G1 R2 B2 G2 R3 B3 G3

我尝试了好久终于得到这个结论了 也给后来人借鉴下
Super_dfss 2011-05-13
  • 打赏
  • 举报
回复
谢谢 请问这位兄弟 nStep应该取多少 我取1好像结果不对
我还想问下 c++中图像数据是以怎样的形式存储的 是以R1 G1 B1 R2 G2 B2 R3 G3 B3...这种形式存储 还是像matlab那样 R是一个二维矩阵 G和B也是二维矩阵 然后合并成一个三维矩阵呢(R1 R2 R3...G1 G2 G3...B1 B2 B3) 谢谢
分号 2011-05-12
  • 打赏
  • 举报
回复
我的第一个方法是把MATLAB实现的功能做成DLL,然后会形成类似
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] );
的函数,然后在VC中就只管发送和接收数据,当然这个方法麻烦就麻烦在还是需要转换数据;
第二个方法就是把MATLAB直接编译成exe,让它可以独立处理数据,然后在vc中做一个调用,直接调用那个exe程序,当matlab的程序在运行时,我的vc就等待结果,一般是等待生成的文件,当文件生成好后,就读取进来,再处理文件;
我看了你的代码,发现你从c++传值到matlab有问题,根据我看到的理解,你应该是把一张24位位深的图片分为RGB的3维矩阵来存储,那么你在从c++赋值到matlab时,最好使用
for(int k = 0; k < 3; k++)
for(int j = 0; j < nHeight; j++)
for(int i = 0; i < nWidth; i++)
{
pchar[j * nWidth + i + (nHeight * nWidth) * k] = lpdata + j * nStep + i * 3 + k;
}
(假设lpdata是指向24位位图数据的指针,nStep是步长)
的形式赋值,这样可以保证赋值不会错,rgb值不会打绞。
其次,你在把数据从matlab中读回后,也应该按照上面的方法反过来赋值。你先试试吧,这个vc、matlab混合编程我有大半年没弄了,也忘的差不多了。
Super_dfss 2011-05-12
  • 打赏
  • 举报
回复
楼上的兄弟 你是怎么做的啊 能告诉小弟吗 谢谢了啊
分号 2011-05-12
  • 打赏
  • 举报
回复
居然遇到用VC处理MATLAB的朋友了,我去年弄了大半年,最后发现不如直接用MATLAB做全部的事情,然后在VC中处理最后的结果。这样的话就避免了转换,那个转换,我想起来就恶心,忒麻烦了。
目录 第1章 matlab概述. 1.1 matlab的发展历程 1.2 matlab产品组成及语言特点 1.2.1 matlab的主要产品构成 1.2.2 matlab语言的特点 1.3 matlab 7.0的新功能和新产品 1.3.1 matlab 7.0的新功能 1.3.2 matlab升级及新增的模块 1.4 小结 第2章 matlab程序设计及代码优化 2.1 matlab的表达式和变量 2.1.1 表达式 2.1.2 变量 2.2 细胞数组与结构数组 2.2.1 细胞数组 2.2.2 结构数组 2.3 类与对象 2.4 流程控制 2.4.1 for循环结构 2.4.2 while循环结构 .2.4.3 if-else-end分支结构 2.4.4 switch-case结构 2.4.5 try-catch结构 2.5 m文件编程 2.6 m文件编程规范 2.7 m文件评述器 2.8 提高m文件执行效率的技巧 2.8.1 矢量化操作 2.8.2 给数组预定义维 2.8.3 下标或者索引操作 2.8.4 尽量多使用函数文件而少使用非脚本文件 2.8.5 将循环体中的内容转换为c-mex 2.8.6 内存优化 2.9 小结 第3章 matlab混合编程简介 3.1 进行混合编程的出发点 3.2 matlab应用程序接口简介 3.3 几种常见的混合编程方法简介 3.3.1 使用matlab自带的matlab compiler 3.3.2 利用matlab引擎 3.3.3 利用activex控件 3.3.4 利用mat文件 3.3.5 c-mex 3.3.6 利用mideva/matcom 3.3.7 利用matrix[lib]实现混合编程 3.3.8 利用matlab add-in 3.3.9 matlab com builder 3.3.10 matlab和excel混合编程 3.4 小结 第4章 c-mex编程 4.1 c-mex简介 4.2 mex文件系统的配置 4.3 mex文件的结构和运行 4.3.1 mex文件结构 4.3.2 mex函数的执行流程 4.3.3 mex文件的结构和使用 4.3.4 mex文件与独立应用程序的区别 4.4 c语言mex函数 4.5 c-mex混合编程 4.6 visual c++中mex文件的建立和调试 4.6.1 visual c++中mex程序的建立和环境设置 4.6.2 mex程序的调试 4.6.3 mex独立应用程序的发布 4.7 mex编程实例 4.8 小结 第5章 通过matlab引擎实现混合编程 5.1 matlab引擎简介 5.2 matlab引擎库函数 5.3 visual c++调用matlab引擎的环境设置 5.4 matlab引擎类的封装 5.4.1 cmatlabeng类的定义和实现代码 5.4.2 cmatlabeng说明 5.4.3 cmatlabeng说明和使用方法 5.5 应用实例 5.6 小结 第6章 mat文件实现数据共享 6.1 mat文件简介 6.2 操作mat文件 6.2.1 mat文件格式 6.2.2 操作mat文件的matlab api 6.3 visual c++调用mat的环境设置 6.4 实例 6.5 小结 第7章 利用mideva实现混合编程 7.1 mideva简介 7.2 mideva的安装 7.3 mideva环境下m文件到dll/exe文件的转换 7.4 visual c++环境下使用mideva混合编程 7.4.1 混合编程环境的设置 7.4.2 通过外壳函数调用 7.5 matrix[lib] 7.6 混合编程实例 7.7 小结 第8章 利用matrix[lib]实现混合编程 8.1 matrix[lib]简介 8.2 matrix[lib]与visual c++混合编程 8.2.1 matrix[lib]的安装 8.2.2 visual c++环境配置 8.2.3 初始化库 8.3 matrix[lib]函数使用参考 8.3.1 矩阵操作 8.3.2 库常量 8.3.3 访问库函数 8.3.4 矩阵i/o 8.3.5 图形函数 8.4 混合编程实例 8.5 matlab数学库 8.5.1 简介 8.5.2 visual c++工程中调用matlab数学函数库的环境设置 8.6 小结.. 第9章 通过matlab add-in实现混合编程 9.1 matlab add-in简介 9.2 matlab add-in安装和在visual c++中的环境设置 9.3 通过matlab add-in生成独立应用程序 9.4 matlab add-in实例 9.5 小结 第10章 matlab和delphi混合编程 10.

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧