使用 Emgu CV 3.1 进行内存管理的正确方法

Correct way of memory management using Emgu CV 3.1

我的背景是 C++,我一直在尝试将我使用 OpenCV 的应用程序之一转换为使用 EmguCV 的 C# 应用程序。我已经尽可能深入地阅读了 EmguCV 文档和 Wiki 以及 Whosebug Q/As,但没有运气解决一些基本问题。在这一点上,我想知道我对 EmguCV 的看法是否存在根本性缺陷。

我的印象是,当 EmguCV 为 C++ 库提供一个接口时,让我们说 FloodFill 使用 CvInvoke.FloodFill(IInputOutputArray, IInputOutputArray, ...),它在下面负责自己的内存管理,以至于返回 IInputOutputArrays(在我的例子中是 Mat)都已处理完毕。然而在实践中,对 CvInvoke.FloodFill 的调用失败,dll 中出现异常。

这是我的:

int i = ...
int j = ...
int intensity = ...
int height = img.Rows;
int width = img.Cols;
Mat outputMask = new Mat(height + 2, width + 2, DepthType.Cv8U, 1);
Rectangle dummy = new Rectangle();
CvInvoke.FloodFill(img, outputMask, new Point(i, j), new MCvScalar(255), out dummy, new MCvScalar(intensity), new MCvScalar(intensity), Connectivity.EightConnected, FloodFillType.MaskOnly);

但是调用失败,异常描述没有帮助。我已经使用 GCHandle 分配和固定其他方法来访问下面的原始数据,但我相信 CvInvoke.FloodFill 在某些本地 Mat 上调用时应该是安全的。

我的问题是,考虑到我的 C++ 和 OpenCV 背景,我是否完全偏离了应该使用 EmguCV 的方式。如果是这样,调用此类函数的正确方法是什么?

这适用于可能发现自己在使用 EmguCV 3.1 FloodFill 时遇到同样问题的任何人。在调试我的代码很长时间后,我确信 CvInvoke.FloodFill 的 EmguCV 3.1 实现存在错误。无法使用 FloodFillType.MaskOnly 标志从该方法中获取掩码。

相反,我最终将原始图像编辑为具有 0254 之间的值,然后使用 255 的填充值进行了正常的 FloodFill。然后使用 Image.InRange() 方法从原始图像中分离出所有 255 (填充)像素。我会将错误报告给 EmguCV 团队,看看会发生什么。