Как использовать OpenCV в S ++ S-функции

Я хочу использовать функцию OpenCV cvtColor для изменения и изображения из RGB в оттенки серого, используя S-функцию в Simulink, например так:

Изображение Simulink

Чтобы входные данные использовались с OpenCV, их необходимо преобразовать в cv::Mat. Я обнаружил, что это можно сделать с помощью API OpenCV Interface C++, но я не знаю точно, как это сделать.

Мои знания о S-функциях ограничены, но, насколько я знаю, преобразование должно выполняться внутри метода mdlOutputs. Что-то похожее на это:

static void mdlOutputs(SimStruct *S, int_T tid)
{
    const uint8_T *u0 = (const uint8_T*) ssGetInputPortSignal(S,0); 
    uint8_T *y0 = (uint8_T*) ssGetOutputPortRealSignal(S,0);
    void ocvMxArrayToImage_uint8(const mxArray *u0, cv::Mat &colourImage);
    cv::cvtColor(colourImage,grayImage,CV_RGB2GRAY);
    y0 *ocvMxArrayFromImage_uint8(const cv::Mat &grayImage);
}

Я на правильном пути? Вы знаете, где я могу найти несколько примеров этого?

Спасибо

Редактировать:

Большое спасибо за ваш комментарий @Phil Goddard. Под вашим руководством я теперь могу скомпилировать S-функцию. Теперь у меня другая проблема. Каждый раз, когда я пытаюсь запустить Simulink, происходит сбой программы, я получаю следующую ошибку:


Количество ошибок: 1

Утверждение в void __cdecl anonymous-namespace'::error(const structanonymous-namespace ':: header * const, const без знака __int64,const void const, const без знака __int64,const класс boost::basic_format, класс std::allocator > &) в b:\matlab\foundation_libraries\src\fl\mem\alignment.cpp строка 323: указатель, переданный в 'vector_check', недопустим и, по-видимому, не поступил ни от одной из следующих подпрограмм: vector_malloc, vector_calloc, vector_realloc mxMalloc, mxCalloc *, mxRealloc *

Это говорит о том, что произошло одно из следующих событий:

  • указатель уже освобожден
  • указатель получен из несовместимого распределителя (например, new, malloc, utMalloc)
  • указатель не пришел из какого-либо распределителя (например, стек, неинициализированная память)
  • повреждение памяти уничтожило указатель или его заголовок

Я также обновил код:

static void mdlOutputs(SimStruct *S, int_T tid)
{
  uint8_T *u0 = (uint8_T*) ssGetInputPortSignal(  S,0);
  uint8_T *y0 = (uint8_T*) ssGetOutputPortSignal( S,0);

  // channels = Number of dimensions; size = Dimensions 
  mxArray *A = mxCreateNumericArray(channels,size,mxUINT8_CLASS,mxREAL);
  mxSetData(A,u0);   

  cv::Ptr<cv::Mat> imgOriginal = ocvMxArrayToImage_uint8(A, true);
  // Width & height = Dimensions input image
  cv::Mat imgGray(width,height,CV_8UC2);                             
  cv::cvtColor(*imgOriginal,imgGray,CV_BGR2GRAY); 

  mxArray *B = mxCreateNumericArray(channels,size,mxUINT8_CLASS,mxREAL);
  B = ocvMxArrayFromImage_uint8(imgGray);

  y0 = (uint8_T *)mxGetData(B);             
} /* end mdlOutputs */

Есть идеи, что не так?

0 ответов

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