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

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

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

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

Мои знания о 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 */

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

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]