/// <summary> /// Отделяет изображение от фона /// </summary> /// <param name="source">Исходное изображение</param> /// <param name="destinatation">Результат разделения</param> private void separateBackground(IplImage source, IplImage destinatation) { // Преобразуем иходное изображение в HSV source.CvtColor(hsvImg, ColorConversion.RgbToHsv); // Разбиваем изображение на отельные каналы hsvImg.CvtPixToPlane(hImg, sImg, vImg, null); // Если диапазон Hue состоит из 2х частей if (BackgroundRange.HMin > BackgroundRange.HMax) { hImg.InRangeS(CvScalar.RealScalar(BackgroundRange.HMin), CvScalar.RealScalar(HsvRange.MAX_H), tmpImg); hImg.InRangeS(CvScalar.RealScalar(HsvRange.MIN_H), CvScalar.RealScalar(BackgroundRange.HMax), hImg); Cv.Or(tmpImg, hImg, hImg); } // Если диапазон Hue состоит из 1 части else { hImg.InRangeS(CvScalar.RealScalar(BackgroundRange.HMin), CvScalar.RealScalar(BackgroundRange.HMax), hImg); } // Ограничиваем значение остальных цветовых компонент sImg.InRangeS(CvScalar.RealScalar(BackgroundRange.SMin), CvScalar.RealScalar(BackgroundRange.SMax), sImg); vImg.InRangeS(CvScalar.RealScalar(BackgroundRange.VMin), CvScalar.RealScalar(BackgroundRange.VMax), vImg); // Формируем окончательный результат Cv.And(hImg, sImg, destinatation); Cv.And(destinatation, vImg, destinatation); Cv.Not(destinatation, destinatation); }