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