1

我想使用 OpenCV 函数 cvtColor 使用 Simulink 中的 S-Function 将图像从 RGB 更改为灰度,如下所示:

Simulink 图像

为了使输入与 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 */

知道出了什么问题吗?

4

0 回答 0