我想使用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函数。现在我有一个不同的问题。每次我尝试运行Simulink时,程序崩溃我都会收到以下错误:
故障计数:1
void __cdecl anonymous-namespace'::error(const struct
中的断言anonymous-namespace':: header * const,const unsigned __int64,const void const,const unsigned __int64,const class boost :: basic_format,class std :: allocator&gt ; &)at 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 */
知道什么是错的?