Отслеживание оптического потока Opencv: условие остановки

В настоящее время я пытаюсь реализовать отслеживание лица, используя оптический поток с opencv.

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

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

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

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

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

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

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

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

person Simon Ninon    schedule 26.08.2015    source источник


Ответы (1)


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

person Tobias Senst    schedule 05.11.2015
comment
Чтобы завершить ваш ответ, я реализовал много интересных вещей: 1. Моя программа умеет определять области движения. Итак, я отбрасываю точки, которые не находятся в этих движениях. Это полезно для уменьшения количества точек. 2. Проверяю размер будки по точкам слежения. Если он деформируется, я прекращаю отслеживание. 3. Я анализирую направление каждой отслеживаемой точки между собой, чтобы обнаружить несоответствия. - person Simon Ninon; 06.11.2015