首页 文章

Mex回调函数调用matlab函数崩溃

提问于
浏览
1

我有一个mex功能,它试图将CCD的图像数据实时传输到matlab . 为了实现这一点,我必须在图像数据回调函数中调用matlab函数将图像数据传输到matlab .

这是我的入门mex函数,它注册一个回调函数 snapThreadCallback() 来获取图像数据 .

void continousSnapOnChoosed(int nlhs, mxArray *plhs[],
                        int nrhs, const mxArray *prhs[] ) {
    x = mxCreateDoubleMatrix(1,1, mxREAL); 
    double *A = mxGetPr(x);
    A[0] = 50;

    setMaxResolution();//设置为最大分辨率
    HVSTATUS status = STATUS_OK;

    status = HVOpenSnap(hhv, snapThreadCallback, hWnd); 
    mexPrintf("1:%d\n",status);

    m_pRawBuffer = new BYTE[WIDTH * HEIGHT];
    m_pImageBuffer = new BYTE[WIDTH * HEIGHT * 3];
    BYTE *ppBuf[1];
    ppBuf[0] = m_pRawBuffer;
    status = HVStartSnap(hhv, ppBuf,1);
    mexPrintf("2:%d\n",status);
}

int CALLBACK snapThreadCallback(HV_SNAP_INFO *pInfo)
{
    int i,j,z;
    ConvertBayer2Rgb(m_pImageBuffer,m_pRawBuffer,WIDTH,HEIGHT,ConvertType,pLutR,pLutG,pLutB,true,layout);

    mwSize ndim = 3;
    mwSize dims[3] = {HEIGHT,WIDTH,3};

    mxArray *OUTArray;
    OUTArray = mxCreateNumericArray(ndim,dims,mxUINT8_CLASS, mxREAL);

    unsigned char *A;
    A = (unsigned char *)mxGetData(OUTArray);

    for (i = 0;i < WIDTH;i++) {
        for (j = 0;j < HEIGHT;j++) {
            for (z = 0; z < 3; z++)
                A[(2 - z) * WIDTH * HEIGHT + i * HEIGHT + HEIGHT - j] = m_pImageBuffer[j * WIDTH * 3 + i * 3 + z];
        }
    }
    mexCallMATLAB(0,NULL,1, &OUTArray, "matlab_function");

    return 1;
}

在我的matlab方面,我只是通过给定的数据显示图像 .

function matlab_function(data)
    disp(data);
end

但是,当我开始打开快照时,matlab立即崩溃 . 我后来发现如果我评论 mexCallMATLAB . matlab赢了't crash, and I'确定我如何处理CCD的DLL没有任何问题 . 因为我已经能够拍摄单帧图像并在matlab中显示它 .

我可以作为示例参考,因为这涉及mex文件和回调函数 . 如果有人能解决我的问题,我将非常感激 .

最后,我通过在回调函数中发送消息并在相应的消息函数中传递图像数据来解决问题 . 似乎问题是回调函数中的内存结构与正常C函数中的内存结构不同 . 但是我不知道他们有多么不同 .

2 回答

  • 0

    您对 A 的索引似乎是错误的 . 代替

    A[(2 - z) * WIDTH * HEIGHT + i * HEIGHT + HEIGHT - j] = ...
    

    索引应该是

    A[(2 - z) * WIDTH * HEIGHT + i * HEIGHT + HEIGHT - 1 - j] = ...

    想想 z=2i=0j=0 ,结果可能是 A[HEIGHT] ,但你想要 A[HEIGHT-1] . 但缓冲区溢出时会出现 z=0i=WIDTH-1j=HEIGHT-1 .

  • 1

    调用 mexCallMatlab 时,不应该为 plhs 传递 NULL ,因为即使您使用零显式输出变量调用Matlab函数,它仍可能返回隐式输出变量 . (如果您在IDE中以交互方式工作,则这个存储在_256509中或输出到桌面 . ) . 分配一个长mxArray并将其传递给 plhs .

相关问题