当我调整 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/