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

蜜蜂

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

我给人的印象是,当EmguCV为C ++库提供了一个接口供我们说FloodFill使用时CvInvoke.FloodFill(IInputOutputArray, IInputOutputArray, ...),在它的下面它会处理自己的内存管理,以至于返回的IInputOutputArrays(在我的情况下是a 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在某些本地Mats上调用时应该是安全的。

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

蜜蜂

这适用于可能会发现自己在EmguCV 3.1 FloodFill中遇到相同问题的任何人。在调试我的代码很长时间之后,我确信EmguCV 3.1的实现CvInvoke.FloodFill是错误的。无法使用FloodFillType.MaskOnlyflag从该方法中删除掩码

相反,我结束了我的编辑原始图像具有之间的值0254,然后做使用的填充值正常FloodFill 255然后使用Image.InRange()方法将所有255(填充的)像素与原始图像分开我会将错误报告给EmguCV团队,看看会发生什么。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章