使用EMGUcv进行颜色跟踪

本文关键字:颜色 跟踪 EMGUcv 使用 | 更新日期: 2023-09-27 18:06:43

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

下面是相关的代码:

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时,我甚至没有得到blobs。我只得到一个黑色的图像。

使用EMGUcv进行颜色跟踪

通常情况下,这种应用程序的彩色斑点检测部分是这样工作的:

  1. 将图像转换为HSV(色调,饱和度,值)色彩空间
  2. 为色相值接近目标值的所有像素过滤色相通道。阈值处理通常会给出值高于低于阈值的所有像素。您对附近的像素感兴趣。
  3. 过滤得到的蒙版一些更多,可能使用饱和/值通道或通过删除小斑点。理想情况下,只留下目标斑点。

一些示例代码,旨在找到一个绿色的对象(色调~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();
    }
}