web-dev-qa-db-fra.com

Que fait la fonction cvWaitKey () d'OpenCV?

Que se passe-t-il pendant l'exécution de cvWaitKey()? Quels sont certains cas d'utilisation typiques? Je l'ai vu dans OpenCV référence mais la documentation n'est pas claire sur son but exact.

73
Simplicity

cvWaitKey(x) / cv::waitKey(x) fait deux choses:

  1. Il attend x millisecondes l’appui d’une touche sur une fenêtre OpenCV (c’est-à-dire créé à partir de cv::imshow()). Notez qu'il n'écoute pas sur stdin pour les entrées de console. Si une touche a été enfoncée pendant ce temps, le code ASCII de la clé est renvoyé. Sinon, il retourne -1. (Si x est zéro, il attend indéfiniment que la touche soit enfoncée.)
  2. Il gère tous les événements fenêtrés, tels que la création de fenêtres avec cv::namedWindow() ou l'affichage d'images avec cv::imshow().

Une erreur courante pour les nouveaux venus d’openv consiste à appeler cv::imshow() en boucle dans les images vidéo, sans suivre chaque tirage avec cv::waitKey(30). Dans ce cas, rien n’apparaît à l’écran car highgui n’a jamais le temps de traiter les demandes de tirage de cv::imshow().

130
SuperElectric

Tout simplement, cvWaitKey() dort pendant X miliseconds, en attendant que vous appuyiez sur une touche.

int cvWaitKey(int X);

Si une touche est enfoncée, cette fonction renvoie le code de la touche ASCII. Ou renvoie - 1 si aucune touche n’a été enfoncée pendant cette période.

18
karlphillip

cvWaitKey(0) arrête votre programme jusqu'à ce que vous appuyiez sur une touche.

cvWaitKey(10) n'arrête pas votre programme mais se réveille et alerte pour mettre fin à votre programme lorsque vous appuyez sur un bouton. Son utilisé dans les boucles parce que cvWaitkey n'arrête pas de boucle.

Utilisation normale

char k;

k=cvWaitKey(0);

if(k == 'ESC')

avec k, vous pouvez voir quelle touche a été enfoncée.

12

. l'argument de 0 est interprété comme infinite

. pour faire glisser les fenêtres highGUI, vous devez appeler en permanence la fonction cv::waitKey(). par exemple pour des images statiques:

cv::imshow("winname", img);

while(cv::waitKey(1) != 27); // 27 = ascii value of ESC

8
user1564486

Remarque pour tous ceux qui peuvent avoir eu des problèmes avec la fonction cvWaitKey( ). Si vous constatez que cvWaitKey(x) n’attend pas du tout, assurez-vous d’avoir une fenêtre ouverte (c.-à-d. cvNamedWindow(...)). Placez la déclaration cvNamedWindow(...) AVANT tout appel de fonction cvWaitKey().

8
Andy
/* Assuming this is a while loop -> e.g. video stream where img is obtained from say web camera.*/    
cvShowImage("Window",img);

/* A small interval of 10 milliseconds. This may be necessary to display the image correctly */
cvWaitKey(10);  

/* to wait until user feeds keyboard input replace with cvWaitKey(0); */
5
enthusiasticgeek

Le cvWaitKey fournit simplement un délai. Par exemple:

char c = cvWaitKey(33);
if( c == 27 ) break;

Cela faisait partie de mon code dans lequel une vidéo était chargée dans openCV et les images émises. Le 33 nombre dans le code signifie qu'après 33ms, un nouveau cadre serait affiché. Il s’agit donc d’un intervalle de temps ou de temps de 33ms entre chaque image affichée à l'écran. J'espère que cela t'aides.

4
sue-ling

cvWaitKey(milliseconds) attendez simplement les millisecondes fournies en tant que paramètre pour un prochain trait de touche du clavier.

Les yeux humains sont incapables de voir la chose bouger en moins de 1/10 de seconde. Nous l'utilisons donc pour conserver le même cadre d'image pendant un certain temps à l'écran. Dès que vous appuierez sur la touche du clavier, l'opération suivante sera effectuée.

En bref, cvWaitKey(milliseconds) attend soit l'appui sur la touche, soit millisecond l'heure fournie.

1
Pravin Dahale