【问题标题】:Color tracking using EMGUcv使用 EMGUcv 进行颜色跟踪
【发布时间】:2014-06-03 15:07:22
【问题描述】:

我正在尝试制作一个彩色对象跟踪器,它使用二进制图像和 blob 检测器来跟踪目标,如下所示: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。我只是得到一个黑色的图像。

【问题讨论】:

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


    【解决方案1】:

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

    1. 将图像转换为HSV(色调、饱和度、值)色彩空间。
    2. 为色调值接近目标值的所有像素过滤色调通道。阈值处理通常会为您提供值 高于低于 阈值的所有像素。您对某个目标值附近的像素感兴趣。
    3. 对获得的蒙版进行更多过滤,可能使用饱和度/值通道或移除小斑点。理想情况下,只保留目标 blob。

    一些旨在寻找绿色物体(色调约 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();
        }
    }
    

    【讨论】:

    • 这正是我所需要的谢谢。事后看来,使用 HSV 也确实让我的生活更轻松。
    • 有什么方法可以为饱和度创建一个范围吗?
    • 是的,通过对饱和通道重复上述过程,然后使用二进制 AND 组合两个通道:channels[0]._And(channels[1]);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2022-05-26
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    相关资源
    最近更新 更多