3

我正在学习使用 Emgu CV 并偶然发现了这个 Open CV 示例:http ://aishack.in/tutorials/tracking-colored-objects-in-opencv/

我想CvInRange通过创建以下代码在 Emgu 中重新创建函数:

// create upper & lower limit (HSV)
MCvScalar botLimit = new MCvScalar(20, 100, 100);
MCvScalar uprLimit = new MCvScalar(30, 255, 255);

// prepare the destination
Image<Hsv, byte> imageHSVDest = new Image<Hsv, byte>(imageWidth, imageHeight);

// 
CvInvoke.cvInRange(imageHSV, botLimit, uprLimit, imageHSVDest);

产生此CvInvoke.cvInRange()错误消息(在 vs2010 中):

错误 1 ​​'Emgu.CV.CvInvoke.cvInRange(System.IntPtr, System.IntPtr, System.IntPtr, System.IntPtr)' 的最佳重载方法匹配有一些无效参数
错误 2 参数 2:无法从 'Emgu.CV 转换.Structure.MCvScalar' 到 'System.IntPtr' 错误 3 参数 3:无法从 'Emgu.CV.Structure.MCvScalar' 转换为 'System.IntPtr'

似乎存在不匹配的数据类型。我已经搜索了如何将 Emgu 转换MCvScalarIntPtr无济于事。

MCvScalar通过翻译示例中的 OpenCVcvScalar(20, 100, 100)来使用。这是错的吗?

4

2 回答 2

6

我正在使用 Emgu CV 3.1.0。偶然发现了与您类似的问题,我以这种方式解决了它:

CvInvoke.InRange(imageHSV, new ScalarArray(new MCvScalar(20, 100, 100)), 
                           new ScalarArray(new MCvScalar(30, 255, 255)), imageHSVDest);

MCvScalar不能直接使用,CvInvoke.InRange因为后者需要IInputArray参数,因此您必须用数组包装标量。


参考: CvInvoke.InRange 方法文档

于 2017-05-18T06:56:29.447 回答
4

请改用内置的 Emgu CV 功能InRange。然后,它看起来像这样:

Hsv lowerLimit = new Hsv(20, 100, 100);
Hsv upperLimit = new Hsv(30, 255, 255);

Image<Gray, byte> imageHSVDest = imageHSV.InRange(lowerLimit, upperLimit);

请注意,这imageHSVDest是一个值为 0(黑色)和 255(白色)的二值图像。

于 2013-05-07T11:42:45.323 回答