从指针创建Mat,调整它的大小并返回指向新mat的指针

时间:2014-03-27 16:41:40

标签: opencv opencvsharp

当我调整Mat的大小时,使用opencv的Mat发生了一些奇怪的事情。

这是opencv中的标头: 首先,我在visual c#中收到了来自托管代码的指针:

 unsigned char *  PointerImage( unsigned char*  matData, int widht)

我在opencv中用指针创建一个Mat:

 cv::Mat OriginalImg(Size(widht,widht),CV_8UC3,matData);

如果我不应用调整大小并且我将指针发送到我在Visual c#中创建的程序,它可以正常工作,我可以在我的visual c#中显示图像。

 unsigned char *data = OriginalImg.data;

当我应用调整大小以放大图像时,问题就开始了:

cv::resize( OriginalImg, OriginalImg, size(270,270));

现在我看不到图像了。

这是整个代码:

  unsigned char *  PointerImage( unsigned char*  matData, int widht){

    cv::Mat OriginalImg(Size(widht,widht),CV_8UC3,matData);
    cv::resize( OriginalImg, OriginalImg, size);
    unsigned char *data = OriginalImg.data;

    return data;

}
当我应用调整大小时,我怀疑指针。 感谢。

1 个答案:

答案 0 :(得分:1)

用户@berak是对的。您的代码中存在内存泄漏。您无法返回指向函数中创建的 local 变量数据的指针。当程序离开PointerIMage函数范围时,会触发OriginalImg对象的析构函数。内存被释放,OriginalImg.data也被释放,使得这个指针不可用。

请在c ++代码中使用全局变量(实际上不是很好的解决方案),或者将c ++代码封装在以后可以在c#中使用的类中(取决于你如何调用.NET的本机代码)。