【问题标题】:How to use CvInRange in Emgu CV如何在 Emgu CV 中使用 CvInRange
【发布时间】:2013-05-06 21:05:35
【问题描述】:

我正在学习使用 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 cvScalar(20, 100, 100) 来使用 MCvScalar。这是错的吗?

【问题讨论】:

  • 忘了说我已经成功完成了程序中的基本操作,例如:打开图像,在 imagebox 中查看图像并将其转换为 HSV 颜色空间。

标签: c# emgucv


【解决方案1】:

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

【讨论】:

    【解决方案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(白色)。

    【讨论】:

      猜你喜欢
      • 2021-08-30
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多