В настоящее время я пытаюсь реализовать отслеживание лица с помощью оптического потока с opencv.
Чтобы добиться этого, я определяю лица с помощью детектора лиц openCV, определяю функции для отслеживания обнаруженных областей, вызывая goodFeaturesToTrack
и я работаю отслеживания по телефону calcOpticalFlowPyrLK
,
Это дает хорошие результаты.
Однако я хотел бы знать, когда лицо, которое я сейчас отслеживаю, больше не видно (человек покидает комнату, прячется за объектом или другим человеком, …), но calcOpticalFlowPyrLK
ничего не говорит мне об этом.
Параметр состояния calcOpticalFlowPyrLK
Функция редко сообщает об ошибках, связанных с отслеживаемой функцией (поэтому, если человек исчезнет, у меня все еще будет достаточное количество отслеживаемых функций).
Я попытался вычислить векторы направления для каждого объекта, чтобы определить перемещение между предыдущим и фактическим кадром для каждого объекта лица (например, определив, что некоторая точка лица переместилась влево между двумя кадрами) и рассчитать дисперсию этих векторов (если векторы в основном разные, дисперсия высока, в противном случае это не так), но она не дала ожидаемых результатов (хорошо в некоторых ситуациях, но плохо в других случаях).
Что может быть хорошим условием для определения того, должно ли отслеживание оптического потока быть остановлено или нет?
Я подумал о некоторых возможных решениях, таких как эти:
Вы можете попробовать двунаправленную конфиденциальную меру ваших точек трека.
Поэтому оцените позиции элементов от img0 до img1, а затем отслеживаемые позиции в обратном направлении от img1 до img0. Если объекты с двойным отслеживанием расположены рядом с оригиналом (расстояние должно быть менее 1 или 0,5 пикселя), то они успешно отслеживаются. Это немного более надежно, чем SSD, который используется флагом состояния openkv plk. Если определенное количество функций не может быть отслежено, событие возникает.