如何在Emgu CV中使用CvInRange

本文关键字:CvInRange CV Emgu | 更新日期: 2023-09-27 18:12:26

我正在学习使用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 .最佳重载方法匹配emu .cv . cvinvoke . cvinrange (System. range)。IntPtr、系统。IntPtr、系统。IntPtr, System.IntPtr)'有一些无效的参数
参数2:无法从Emgu.CV.Structure转换。MCvScalar' to 'System。IntPtr"参数3:无法从Emgu.CV.Structure转换。MCvScalar' to 'System。IntPtr '

数据类型似乎不匹配。我已经搜索了如何将Emgu MCvScalar转换为IntPtr,但无济于事。

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

如何在Emgu CV中使用CvInRange

我使用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方法文档

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