В настоящее время я пытаюсь реализовать отслеживание лица, используя оптический поток с opencv.
Для этого я обнаруживаю лица с помощью детектора лиц openCV, определяю функции для отслеживания в обнаруженных областях, вызывая goodFeaturesToTrack
, и управляю отслеживанием, вызывая calcOpticalFlowPyrLK
.
Это дает хорошие результаты.
Однако я хотел бы знать, когда лицо, которое я сейчас отслеживаю, больше не видно (человек выходит из комнаты, прячется за объектом или другим человеком, ...), но calcOpticalFlowPyrLK
ничего мне об этом не говорит.
Параметр состояния функции calcOpticalFlowPyrLK
редко сообщает об ошибках, связанных с отслеживаемой функцией (поэтому, если человек исчезнет, у меня все еще будет достаточное количество действительных функций для отслеживания).
Я попытался рассчитать векторы направления для каждой функции, чтобы определить перемещение между предыдущим и фактическим кадром для каждой функции лица (например, определить, что какая-то точка лица сместилась влево между двумя кадрами) и вычислить дисперсию этих векторов (если векторы в основном разные, то дисперсия высокая, иначе нет), но это не дало ожидаемых результатов (хорошо в какой-то ситуации, но плохо в других случаях).
Что может быть хорошим условием, чтобы определить, нужно ли останавливать отслеживание оптического потока?
Я подумал о некоторых возможных решениях, подобных этим:
- дисперсия расстояния для векторов каждого отслеживаемого объекта (если движение линейное, расстояния должны быть примерно одинаковыми, но если что-то случилось, расстояния будут другими).
- Сравнение формы и размера области, содержащей исходное положение отслеживаемых объектов, с областью, содержащей текущую. В начале у нас есть квадрат, содержащий черты лица. Но если человек выйдет из комнаты, это может привести к деформации формы.