c# - 从指针创建 Mat,调整它的大小并将指针返回到新的 mat

标签 c# opencv

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

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

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

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

 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;

}

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

最佳答案

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

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

关于c# - 从指针创建 Mat,调整它的大小并将指针返回到新的 mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22693923/

相关文章:

javascript - 通过 getJSON 从 .cshtml 调用 Controller

c++ - OpenCV中不同 channel 数的矩阵逻辑运算

python - 无法在 matplotlib 中显示正常图像,它一直使用 jet colormap 显示

c - 使用 OpenCV 查找物体的高度

c - C 的 Opencv 2.4.2 安装

c# - 添加三个静态字段

c# - LibUsbDotNet 调用 UsbDevice.AllDevices 时找不到设备

c# - 覆盖Unity中的标准关闭按钮

c# - 首先为 Entity Framework 代码中的所有字符串设置 MaxLength

python - 使用pip安装Dlib时出现错误