Как использовать OpenCV в S ++ S-функции
Я хочу использовать функцию OpenCV cvtColor для изменения и изображения из RGB в оттенки серого, используя S-функцию в 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 struct
anonymous-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 */
Есть идеи, что не так?