J'essaie actuellement de mettre en œuvre un suivi de visage en utilisant un flux optique avec opencv. Pour ce faire, je détecte les faces avec le détecteur de visage openCV, je détermine les caractéristiques à suivre sur les zones détectées en appelant goodFeaturesToTrack
et j'opère le suivi en appelant calcOpticalFlowPyrLK
.Opencv Suivi de flux optique: condition d'arrêt
Il donne de bons résultats.
Cependant, j'aimerais savoir quand le visage que je suis en train de suivre n'est plus visible (la personne quitte la pièce, se cache derrière un objet ou une autre personne, ...) mais calcOpticalFlowPyrLK
ne me dit rien il.
Le paramètre d'état de la fonction calcOpticalFlowPyrLK
signale rarement des erreurs concernant une fonction suivie (si la personne disparaît, j'aurai toujours une bonne quantité de fonctions valides à suivre). J'ai essayé de calculer les vecteurs directionnels pour chaque entité afin de déterminer le déplacement entre la trame précédente et la trame réelle pour chaque entité du visage (par exemple, déterminer qu'un point du visage a été déplacé vers la gauche entre les deux trames) et pour calculer la variance de ces vecteurs (si les vecteurs sont majoritairement différents, la variance est élevée, sinon ce n'est pas le cas) mais n'a pas donné les résultats attendus (bon dans certains cas).
Quelle pourrait être une bonne condition pour déterminer si le suivi du flux optique doit être arrêté ou non?
J'ai pensé à des solutions possibles comme celles-ci:
- variance de la distance pour les vecteurs de chaque élément suivi (si le déplacement est linéaire, les distances doivent être à peu près les mêmes, mais si quelque chose arrivé, les distances seront différentes).
- Comparer la forme et la taille de la zone contenant la position d'origine des entités suivies avec la zone contenant celle en cours. Au début, nous avons un carré contenant les caractéristiques du visage. Mais si la personne quitte la pièce, cela peut entraîner une déformation de la forme.
Pour compléter votre réponse, j'ai mis en place beaucoup de choses intéressantes: 1. Mon logiciel est capable de déterminer les zones de mouvement. Donc, je rejette les points qui ne sont pas situés dans ces mouvements. Ceci est utile pour réduire le nombre de points. 2. Je vérifie la taille de la boîte de suspension des points de suivi. S'il est déformé, j'arrête le suivi. 3. J'analyse la direction de chaque point suivi l'un par rapport à l'autre pour détecter les incohérences. –