东莞搬家网,东莞搬家公司

C++调用Matlab生成的dll,向Matlab传递数组,编译时提示SetData左边必须有类

    发布时间:2018-07-11 12:43

    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混合编程我有大半年没弄了,也忘的差不多了。

    回复:

    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

    回复:

    通常在实现图像处理的算法时我们使用Matlab编程,因为它具有丰富的库函数以及操作方便,然而在工程项目中通常使用C/C++语言。如果我们将matlab代码完全重写成C++代码会很麻烦,最好的办法是借助matlab与C/C++接口将.m程序转成dll文件! 一、使用...

    回复:

    在C++工程的属性--链接器--输入中附加依赖项中填入你要用的库xxx.lib,保证xxx.h、xxx.lib和xxx.dll在一起,同时在C:\Users\Administrator\Desktop\hun_Mset\SS_demo\Debug\中也放入xxx.lib和xxx.dll

    回复:

    可以解决的 你可以找另一台的电脑上去复制下这个缺失的文件,看看能否解决问题 或者你可以尝试使用腾讯电脑管家来修复缺失DLL文件 具体方法是,打开腾讯电脑管家--电脑诊所--软件问题--丢失.Dll 文件--一键修复--完成 如果还是解决不了,去脚本...

    回复:

    一,设置操作系统的环境变量。 系统变量增加D:R2011abinwin32;D:R2011abin和E:Microsoft Visual Studio 10.0VCbin,这个分别是我的机器上matlab和VS安装目录下的路径。 系统变量设置完毕后需要重新启动计算机方能生效。 二,设置matlab的编译环...

    回复:

    通常,打开软件,第一次调用的时候,运行很慢,第二次之后还能接受。

    回复:

    我有同样的问题,解决了。你需要设置一个环境变量 具体做法是: 我的电脑->属性->高级系统设置->环境变量->用户变量->PATH,新增“E:\Programs\MATLAB\bin\win64” (这个路径取决于你的路径) 把这个新增的用户变量上移到最高。

    回复:

    通常在实现图像处理的算法时我们使用Matlab编程,因为它具有丰富的库函数以及操作方便,然而在工程项目中通常使用C/C++语言。如果我们将matlab代码完全重写成C++代码会很麻烦,最好的办法是借助matlab与C/C++接口将.m程序转成dll文件! 一、使用...

    回复:

    通常在实现图像处理的算法时我们使用Matlab编程,因为它具有丰富的库函数以及操作方便,然而在工程项目中通常使用C/C++语言。如果我们将matlab代码完全重写成C++代码会很麻烦,最好的办法是借助matlab与C/C++接口将.m程序转成dll文件! 一、使用...

    回复:

    memcpy(mxGetPr(aa), A, 3 * 3 * sizeof(double));换成 memcpy(mxGetPr(aa), &A, 3 * 3 * sizeof(double));试试0.0 我觉得是这个二维数组传递的问题,建议调试下这个A

    上一篇:是在后面啪啪的,会对身体有伤害吗 下一篇:每天睡多少小时孩子成绩最好?

    返回主页:东莞搬家

    本文网址:http://www.0769banjia.com/view-420828-1.html
    信息删除