2

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

这是opencv中的标题:首先我从Visual C#中的托管代码接收到一个指针:

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

我从opencv中的指针创建一个垫子:

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

如果我不应用调整大小并将指针发送到我在 Visual c# 中创建到我的程序的 Mat,它工作正常,我可以在我的 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;

}

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

4

1 回答 1

1

用户@berak 非常正确。您的代码中有内存泄漏。您不能返回指向函数中创建的局部变量数据的指针。当程序超出 PointerIMage 函数范围时,会触发 OriginalImg 对象的析构函数。内存被释放,OriginalImg.data 也被释放,使得这个指针不可用。

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

于 2014-03-27T20:14:43.710 回答