Сбой функции Mex Callback, вызывающей функцию Matlab
У меня есть мекс-функция, которая пытается передать данные изображения ПЗС в Matlab в режиме реального времени. Чтобы добиться этого, мне нужно вызвать функцию Matlab в функции обратного вызова данных изображения, чтобы передать данные изображения в Matlab.
Это моя входная мекс-функция, которая регистрирует функцию обратного вызова, которая 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 не рухнет, и я уверен, что нет ничего плохого в том, как я обращаюсь с DLL CCD. Потому что я уже могу снимать однокадровое изображение и отображать его в Matlab.
Существует небольшая ссылка, которую я могу взять в качестве примера, так как это включает в себя mex-файл и функцию обратного вызова. Я буду очень признателен, если кто-то может решить мою проблему.
Наконец, я решил проблему, отправив сообщение в моей функции обратного вызова и передал данные изображения в соответствующую функцию сообщения. Кажется, проблема в том, что структура памяти в функции обратного вызова отличается от структуры памяти в обычной функции C. Однако я не знаю, насколько они отличаются.
2 ответа
Ваша индексация 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
,
Вы не должны проходить NULL
за plhs
при звонке mexCallMatlab
потому что даже если вы вызываете функцию Matlab с нулевыми явными выходными переменными, она все равно может вернуть неявную. (Это тот, который хранится в ans
или вывод на рабочий стол, если вы работаете в интерактивном режиме в среде IDE.) Выделите один длинный mxArray и передайте его plhs
,