如何在C ++ S函数中使用OpenCV

时间:2017-04-27 09:01:47

标签: c++ opencv simulink s-function

我想使用OpenCV函数cvtColor来改变并使用Simulink中的S-Function从RGB到灰度图像,如下所示:

Simulink Image

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

这表明发生了以下情况之一:

  • 指针已被释放
  • 指针来自不兼容的分配器(例如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 */

知道什么是错的?

0 个答案:

没有答案