我有一个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不会崩溃,我确信我如何处理CCD的DLL没有任何问题。因为我已经能够拍摄单帧图像并将其显示在matlab中。
我可以作为示例参考,因为这涉及mex文件和回调函数。如果有人能解决我的问题,我将非常感激。
最后,我通过在回调函数中发送消息并在相应的消息函数中传递图像数据来解决问题。似乎问题是回调函数中的内存结构与正常C函数中的内存结构不同。但是我不知道它们有多么不同。
答案 0 :(得分:1)
您对A
的索引似乎有误。而不是
A[(2 - z) * WIDTH * HEIGHT + i * HEIGHT + HEIGHT - j] = ...
索引应为
A[(2 - z) * WIDTH * HEIGHT + i * HEIGHT + HEIGHT - 1 - j] = ...
考虑何时z=2
,i=0
和j=0
,结果可能是A[HEIGHT]
,但您需要A[HEIGHT-1]
。但是z=0
,i=WIDTH-1
和j=HEIGHT-1
时会出现缓冲区溢出。
答案 1 :(得分:0)
在调用NULL
时,您不应该为plhs
传递mexCallMatlab
,因为即使您使用零显式输出变量调用Matlab函数,它仍可能返回隐式输出变量。 (如果您在IDE中以交互方式工作,则会将此存储在ans
中或输出到桌面。)。分配一个长mxArray并将其传递给plhs
。