我的背景是C ++,我一直在尝试将使用OpenCV的应用程序之一转换为使用EmguCV的C#应用程序。我已尽可能深入地阅读了EmguCV文档和Wiki,以及StackOverflow Q / A,没有运气解决一些基本问题。在这一点上,我想知道我对EmguCV的看法是否存在根本性的缺陷。
我给人的印象是,当EmguCV为C ++库提供了一个接口供我们说FloodFill
使用时CvInvoke.FloodFill(IInputOutputArray, IInputOutputArray, ...)
,在它的下面它会处理自己的内存管理,以至于返回的IInputOutputArray
s(在我的情况下是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
在某些本地Mat
s上调用时应该是安全的。
我的问题是,考虑到我的C ++和OpenCV背景,我是否完全偏离应该使用EmguCV的方式。如果是这样,调用该函数的正确方法是什么?
这适用于可能会发现自己在EmguCV 3.1 FloodFill中遇到相同问题的任何人。在调试我的代码很长时间之后,我确信EmguCV 3.1的实现CvInvoke.FloodFill
是错误的。无法使用FloodFillType.MaskOnly
flag从该方法中删除掩码。
相反,我结束了我的编辑原始图像具有之间的值0
和254
,然后做使用的填充值正常FloodFill 255
。然后使用Image.InRange()
方法将所有255
(填充的)像素与原始图像分开。我会将错误报告给EmguCV团队,看看会发生什么。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句