2015-08-26 8 views
0

В настоящее время я пытаюсь реализовать отслеживание лица с помощью оптического потока с opencv.Opencv Оптическое отслеживание потока: состояние останова

Для этого я обнаруживаю лица с детектором лица openCV, я определяю функции для отслеживания обнаруженных областей, вызывая goodFeaturesToTrack, и я управляю отслеживанием, вызывая calcOpticalFlowPyrLK.

Это дает хорошие результаты.

Однако я хотел бы знать, когда лицо, которое я сейчас отслеживаю, больше не видно (человек покидает комнату, скрывается за объектом или другим человеком, ...), но calcOpticalFlowPyrLK ничего мне не говорит Это.

Параметр статуса функции calcOpticalFlowPyrLK редко сообщает об ошибках в отношении отслеживаемой функции (поэтому, если человек исчезнет, ​​у меня все еще будет много действительных функций для отслеживания).

Я попытался вычислить векторы направления для каждой функции, чтобы определить перемещение между предыдущим и фактическим кадром для каждой функции лица (например, определяя, что какая-то точка лица перемещается влево между два кадра) и вычислить дисперсию этих векторов (если векторы в основном различны, дисперсия высока, в противном случае это не так), но она не давала ожидаемых результатов (хороших в некоторой ситуации, но плохих в других случаях).

Что может быть хорошим условием для определения того, нужно ли остановить отслеживание оптического потока или нет?

Я думал о некоторых возможных решений, как таких:

  • дисперсия расстояния для векторов каждой отслеживаемой функции (если движение является линейным, расстояние должно быть почти то же самое, но если что-то произошло, расстояния будут разными).
  • Сравнение формы и размера области, содержащей исходное положение отслеживаемых объектов с областью, содержащей текущий. В начале у нас есть квадрат, содержащий черты лица. Но если человек покидает комнату, это может привести к деформации формы.

ответ

1

Вы можете попробовать двунаправленную меру контроля ваших точек следа. Поэтому оцените расположение позиций от img0 до img1 и отслеживаемые позиции назад от img1 до img0. Если функции двойного отслеживания вблизи оригинала (расстояние должно быть меньше 1 или 0,5 пикселя), чем они будут успешно отслеживаться. Это немного более много, чем SSD, который используется статусным флагом plk opencv. Если определенное количество функций не удалось отследить, событие повышается.

+0

Чтобы завершить ваш ответ, я реализовал много интересного: 1. Мое программное обеспечение способно определять области движения. Итак, я отбрасываю очки, которые не находятся в этих движениях. Это полезно для уменьшения количества точек. 2. Я проверяю размер боулинга точек отслеживания. Если он деформирован, я останавливаю отслеживание. 3. Я анализирую направление каждой отслеживаемой точки между собой, чтобы обнаружить несоответствия. –