Я хочу использовать функцию OpenCV cvtColor для изменения и изображения из RGB в оттенки серого, используя S-функцию в 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 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 *
Это говорит о том, что произошло одно из следующих событий:
Я также обновил код:
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 */
Есть идеи, что не так?
Задача ещё не решена.
Других решений пока нет …