Я пытаюсь установить пороговые пиксели в видеопотоке с помощью OpenCV. У меня есть другие цвета, которые работают очень хорошо, но красный создает проблему, потому что он обтекает ось оттенков (то есть HSV (0, 255, 255) и HSV (179, 255, 255) оба красные). Техника, которую я сейчас использую, не идеальна. В основном:
cvInRangeS(src, cvScalar(0, 135, 135), cvScalar(20, 255, 255), dstA);
cvInRangeS(src, cvScalar(159, 135, 135), cvScalar(179, 255, 255), dstB);
cvOr(dstA, dstB, dst);
Это субоптимально, потому что для этого требуется ветвь в красном (потенциальные ошибки), выделение двух дополнительных изображений и две дополнительные операции по сравнению с простым синим цветом:
cvInRangeS(src, cvScalar(100, 135, 135), cvScalar(140, 255, 255), dst);
Более приятная альтернатива, которая пришла мне в голову, заключалась в том, чтобы "повернуть" цвета изображения, чтобы целевой оттенок находился под углом 90 градусов. Например.
int rotation = 90 - 179; // 179 = red
cvAddS(src, cvScalar(rotation, 0, 0), dst1);
cvInRangeS(dst1, cvScalar(70, 135, 135), cvScalar(110, 255, 255), dst);
Это позволяет мне одинаково обрабатывать все цвета.
Однако операция cvAddS
не переносит значения оттенков обратно на 180, когда они опускаются ниже 0, поэтому вы теряете данные. Я посмотрел на преобразование изображения в CvMat
, чтобы я мог вычесть его, а затем использовать модуль, чтобы обернуть отрицательные значения обратно в верхнюю часть диапазона, но CvMat
, похоже, не поддерживает модуль. Конечно, я мог перебирать каждый пиксель, но я обеспокоен тем, что это будет очень медленно.
Я прочитал много учебников и примеров кода, но все они, как представляется, просто смотрят на диапазоны, которые не обтекают спектр оттенков, или используют еще более уродливые решения (например, повторное внедрение cvInRangeS
на итерация по каждому пикселю и ручное сравнение с таблицей цветов).
Итак, какой обычный способ решить это? Какой лучший способ? Каковы компромиссы каждого из них? Является ли повторение по пикселям намного медленнее, чем использование встроенных функций CV?