Обнаружение перекрывающихся лиц в OpenCV
Сначала позвольте мне дать некоторую информацию о том, что я пытаюсь сделать.
Я работаю над проблемой проверки лица с использованием профиля лица, и мой первый шаг - это обнаружение лица. Я использую детектор лица OpenCV с haarcascade_profileface.xml. Проблема в том, что детектор не находит лица постоянно. Под непоследовательностью я подразумеваю, что в каком-то регионе оно находит лицо, но иногда оно находит лицо больше, иногда меньше, а иногда и то и другое. Я хочу, чтобы он всегда находил один и тот же регион как лицо.
Я добавляю несколько изображений, чтобы лучше рассказать о своей проблеме. Вы можете найти их здесь.
Что я должен сделать, чтобы преодолеть это многократное обнаружение лица в одной и той же области (перекрывающееся обнаружение лица)?
Первое, что пришло мне в голову, это увеличение параметра minNeighbors, но это приводит к падению частоты обнаружения, поэтому я не хочу этого делать. Затем я думаю о применении некоторого алгоритма стабилизации изображения для изображений лица, но я думаю, что это будет слишком дорого. Если кто-нибудь может дать мне несколько советов по преодолению этой проблемы, я буду рад.
Я должен отметить, что я использую OpenCV 2.4.5, и я установил параметр minNeighbor равным 4, scaleFactor был равен 1,75 и не устанавливал никаких ограничений по размеру.
Заранее спасибо,
С Уважением,
Гюней
2 ответа
Если вы обнаруживаете лица из видео, вы можете применить фильтр к ограничивающей рамке, чтобы плавно изменить рамку. Это уменьшит эти "несоответствия" в граничной рамке лица.
CurrentFrameBoundingBox = a * PrevFrameBoundingBox + (1-a) * DetectedBoundingBox
чем больше, тем больше веса будет уделено предыдущему ограничивающему кадру и уменьшится несоответствие.
Вы делаете это для каждой координаты в ограничительной рамке.
Может быть, вы можете сделать настраиваемую кластеризацию смещения средств, которая соответствует вашим потребностям, на необработанных ограничивающих блоках обнаружения. Если я правильно помню, OpenCV фильтрует или группирует эти необработанные результаты, потому что классификатор запускается несколько раз для одного и того же объекта. Если вы не удовлетворены процедурой в OpenCV, вы можете попробовать другие методы кластеризации на основе плотности. Или вы можете просто взять медиану этих необработанных результатов.