Сбой функции 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,

Другие вопросы по тегам