Я пишу алгоритм обнаружения лиц, и теперь у меня много окон, которые обнаруживают, что перекрываются.
Я считаю, что окна перекрываются, если center(windowA) in windowB or center(windowB) in windowA
.Обнаружение лица - перекрытие фильтров окон
Мой алгоритм был:
resultList <- empty list
for each windowA detected
handled <- False
for each windowB in resultList
if windowA and windowB are overlapping
keep the window with bigger value
handled <- True
brick inner loop
if not handled
append windowA to resultList
Но остаются некоторые перекрывающиеся окна. Итак, я распространил его на:
resultList <- empty list
for each windowA detected
handled <- False
for each windowB in resultList
if windowA and windowB are overlapping
keep the window with bigger value
handled <- True
break inner loop
if not handled
append windowA to resultList
for each windowB in resultList, starting from after windowA
if windowA and windowB are overlapping
if windowA has bigger value
remove windowB
else
remove windowA and break
Это намного лучше, но осталось несколько перекрывающихся окон.
Есть ли известный алгоритм, который делает это быстро и хорошо? (Тривиальное решение O (n^2) немного медленное)
Или есть другой способ, которым я могу улучшить свой алгоритм, чтобы работать отлично?
В вашем примере с моим вторым алгоритмом, большой прямоугольник будет заменить первый из маленьких прямоугольникам , и удалить остальные после этого. Я ошибаюсь? – Dubon
@Dubon Yup, непонятый мой пример. Подумайте о том, что эти три последовательности. Все они могут быть размещены, так как они не перекрываются. Теперь я буду четвертым (даже не нарисованным), и его центр находится в синей области, Он должен заменить все три. Однако ваш алгоритм не поддерживает удаление более одного прямоугольника за один раз. –
Это цель второго 'для каждого'. – Dubon