如何在Emgu CV中使用CvInRange

时间:2013-05-06 21:05:35

标签: c# emgucv

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

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

// 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 MCvScalar转换为IntPtr无效。

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

2 个答案:

答案 0 :(得分:2)

使用内置的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(白色)。

答案 1 :(得分:2)

我正在使用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 Method Documentation