C++调用matlab时 数组转换成矩阵怎么处理
2个回答
2015-02-18
展开全部
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实现的功能做成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混合编程我有大半年没弄了,也忘的差不多了。
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实现的功能做成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混合编程我有大半年没弄了,也忘的差不多了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询