我想使用 OpenCV 函数 cvtColor 使用 Simulink 中的 S-Function 将图像从 RGB 更改为灰度,如下所示:
为了使输入与 OpenCV 一起使用,需要将其转换为 cv::Mat。我发现这可以通过OpenCV Interface C++ API来完成,但我不知道该怎么做。
我对 S-Functions 的了解有限,但据我所知,转换需要在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-Function。现在我有一个不同的问题。每次我尝试运行 Simulink 时,程序都会崩溃,我会收到以下错误:
故障数:1
b:\matlab\foundation_libraries\src的 void __cdeclanonymous-namespace'::error(const struct
匿名命名空间'::header *const ,const unsigned __int64,const void const ,const unsigned __int64,const class boost::basic_format,class std::allocator > &) 中的断言\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 */
知道出了什么问题吗?