Отслеживание цвета с помощью EMGUcv

Я пытаюсь создать средство отслеживания цветных объектов, которое использует двоичное изображение и детектор больших двоичных объектов для отслеживания цели примерно так: 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);
}

Когда я показываю двоичный образ, я даже не получаю капли. Я просто получаю черное изображение.


person e_phi    schedule 03.06.2014    source источник


Ответы (1)


Как правило, часть такого приложения, связанная с обнаружением цветных пятен, работает следующим образом:

  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();
    }
}
person TC.    schedule 03.06.2014
comment
Это именно то, что мне было нужно Спасибо. Оглядываясь назад, использование HSV также делает мою жизнь намного проще. - person e_phi; 04.06.2014
comment
Есть ли способ создать диапазон для насыщенности? - person e_phi; 04.06.2014
comment
Да, повторив описанный выше процесс для канала насыщения, а затем объединив оба канала с помощью двоичного И: каналы[0]._И(каналы[1]); - person TC.; 04.06.2014