При использовании OpenCV для задач обнаружения я постоянно сталкиваюсь с проблемой слияния перекрывающих ограничивающих прямоугольников; то есть, по существу, обнаруживая ограничительную рамку вокруг объединения двух перекрывающихся ограничивающих прямоугольников. Это очень часто встречается при обнаружении объектов, когда по какой-либо причине объект интереса разломается на несколько ограничивающих прямоугольников, а не на одно всеобъемлющее.OpenCV: Слияние перекрывающихся прямоугольников
Есть несколько ответов на StackOverflow для алгоритмических решений и полезных внешних библиотек (например this, this, this), и есть также функция groupRectangles
обеспечивается OpenCV (и литания связанных вопросов/ошибок: this, this, и т.д).
Я, кажется, обнаружил, что вышеупомянутые решения немного сложны для задачи, которую я пытаюсь выполнить. Многие алгоритмические решения решают эту проблему с математической точки зрения (скорее, как мысленный эксперимент), в то время как операции, подобные rect1 | rect2
, могут стать очень медленными, когда число прямоугольников велико (это O (N^2) для обработки всего) и groupRectangles
имеет некоторые причуды, которые делают его лишь частично эффективным. Поэтому я придумал несколько хакерское решение, которое действительно работает довольно эффективно. Я думал, что буду делиться этим ниже для всех, кому нужно быстрое решение этой общей проблемы.
Не стесняйтесь, чтобы комментировать и критиковать его.
тест для пересечения: cv :: Rect intersect = rect1 && rect2; Комбинация: if (intersection.width) комбинация = rect1 || rect2; – Micka
@ Мика, но это требует, чтобы вы проходили N прямоугольников N раз каждый. Для маленького N это нормально. Но эмпирически я обнаружил, что квадратичное время работы заканчивается тем, что медленнее, чем мое решение ниже, когда вы получаете больше N – marcman
, что очевидно! вы можете разделить пространство (похожее на ваш ответ), но это будет медленным для меньших чисел и может использовать больше памяти. – Micka