1

J'ai écrit un programme en C# en utilisant EmguCV (wrapper de openCV). Le programme suit un objet en utilisant l'algorithme camshift. Un rectangle est dessiné autour de l'objet. Le curseur est déplacé par le centre du rectangle. L'entrée est prise à partir d'une webcam. Au début, le problème était que le curseur ne pouvait pas couvrir tout l'écran. Son mouvement était limité à la taille du cadre. Et donc j'ai appliqué un facteur de multiplication:Contrôle du pointeur de la souris à travers l'algorithme camshift d'OpenCV (ou comment fonctionne la souris)

largeur d'écran/largeur de trame pour le mouvement dans la direction X.

screenheight/FrameHeight pour un mouvement dans la direction Y

Avec cette souris couvre toute la zone. Mais le mouvement de la souris n'est plus lisse. Je suis incapable de pointer vers deux icônes étroitement situées. Comment faire pour que le mouvement de la souris soit lisse tout en couvrant tout l'écran, comme c'est le cas avec une vraie souris?

Répondre

5

Pour souligner l'évidence: la non-régularité de votre mise en œuvre de la souris vient du fait que le rectangle donné par Camshift est seulement une précision de la précision d'un pixel d'image, de sorte que le plus petit mouvement possible sera screensize/encadrer arrondi au pixel d'écran le plus proche. Si tel est le cas, une sorte d'accélération du pointeur pourrait être appliquée, comme c'est le cas lorsque de vraies souris de faible qualité sont utilisées (bien sûr, dans le cas de plusieurs souris laser de 1000 dpi, il n'y a pas besoin pour une telle chose). Fondamentalement, la distance parcourue par le curseur sur l'écran n'est pas la distance prise par l'entrée du pointeur (dans ce cas, le déplacement rectangle camshift), mais une fonction judicieusement choisie. Ainsi, en utilisant une fonction d'accélération f (x), les étapes consistant à déplacer le pointeur sera comme suit:

  1. Calculer le vecteur de déplacement d'entrée de pointeur, sans que l'on désignera par v.
  2. Calculer le vecteur de longueur unitaire correspondant, soit u.
  3. Le sur l'écran de déplacement de pointeur est v » = f (| v |) * u

je choisi f (x) sous une forme analogue bêta * e^(alpha * x - 1), où 0 < alpha et 0 < beta < = 1 sont des paramètres qui doivent être choisis de façon empirique. Fondamentalement, n'importe quelle fonction qui a un dérivé de 1 ou moins à 0 (vous permet d'utiliser la pleine précision de l'entrée pour des mouvements précis du curseur), va à l'infini lorsque x augmente (les grands mouvements doivent correspondre à grands mouvements du curseur), augmente de façon monotone et a un premier dérivé monotone croissant. Editer: Il est également nécessaire que la fonction d'accélération ait une valeur de 0 à 0, sinon des mouvements très étranges se produiront.:)

Il est également souhaitable d'avoir f (FrameWidth) = screenwidth de sorte que le déplacement de l'objet suivi à travers les résultats de la trame dans le curseur étant déplacé à travers l'écran. Une formule exponentielle est très agréable à utiliser, mais l'utilisation d'un polynôme quadratique ou de degré supérieur peut s'avérer plus simple en fonction des exigences de performance ...

+0

Je ferai les calculs et je reviendrai vers vous. – nishant

+0

J'ai le même problème, monsieur pourriez-vous me référer à quelques liens avec plus de matériel sur ce que vous avez expliqué? J'ai besoin d'effectuer le regard estimé mouvement du curseur pour mon projet HCI de suivi des yeux basé sur la webcam. J'ai des emplacements de pupilles qui varient avec le regard, mais j'ai besoin de les cartographier pour un mouvement de curseur en bonne santé et en douceur. Ce serait utile, merci. –

Questions connexes