使用EMGUcv进行颜色跟踪

时间:2014-06-03 15:07:22

标签: c# video-processing emgucv video-tracking

我正在尝试制作一个彩色对象跟踪器,它使用二进制图像和斑点检测器来跟踪目标类型:https://www.youtube.com/watch?v=9qky6g8NRmI。但是我无法弄清楚ThresholdBinary()方法是如何工作的,以及它是否是正确的。

以下是代码的相关部分:

cam._SmoothGaussian(3);

blobDetector.Update(cam);
Image<Bgr,byte> binaryImage = cam.ThresholdBinary(new Bgr(145,0,145),new Bgr(0,0,0));
Image<Gray,byte> binaryImageGray = binaryImage.Conver<Gray,byte>();

blobTracker.Process(cam, binaryImageGray);

foreach (MCvBlob blob in blobTracker)
{
   cam.Draw((Rectangle)blob, new Bgr(0,0,255),2);
}

当我显示binaryImage时,我甚至没有得到blob。我只是得到一个黑色的图像。

1 个答案:

答案 0 :(得分:2)

通常,此类应用程序的彩色斑点检测部分按照以下方式工作:

  1. 将图像转换为HSV(色调,饱和度,值)色彩空间。
  2. 过滤所有像素的色调通道,其色调值接近目标值。阈值处理通常会为您提供值高于低于阈值的所有像素。您对 near 某些目标值感兴趣。
  3. 可能使用饱和度/值通道或删除小斑点,对获得的蒙版进行更多过滤。理想情况下,只有目标blob仍然存在。
  4. 一些旨在找到绿色物体(色调~50)的示例代码,例如视频中显示的绿球:

    // 1. Convert the image to HSV
    using (Image<Hsv, byte> hsv = original.Convert<Hsv, byte>())
    {
        // 2. Obtain the 3 channels (hue, saturation and value) that compose the HSV image
        Image<Gray, byte>[] channels = hsv.Split(); 
    
        try
        {
            // 3. Remove all pixels from the hue channel that are not in the range [40, 60]
            CvInvoke.cvInRangeS(channels[0], new Gray(40).MCvScalar, new Gray(60).MCvScalar, channels[0]);
    
            // 4. Display the result
            imageBox1.Image = channels[0];
        }
        finally
        {
            channels[1].Dispose();
            channels[2].Dispose();
        }
    }