2015-08-26 3 views
0

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.

Répondre

1

Vous pouvez essayer une mesure de confidenze bidirectionnelle de vos points de suivi. Estimer par conséquent les positions de caractéristiques de img0 à img1 et les positions suivies en arrière de img1 à img0. Si les fonctions à double piste près de l'original (la distance doit être inférieure à 1 ou 0,5 pixel) qu'elles sont suivies avec succès. C'est un peu plus fiable que le SSD qui est utilisé par le drapeau d'état d'opencv's plk. Si une certaine quantité de fonctionnalités n'a pas pu être suivie, l'événement se déclenche.

+0

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. –