2011-03-05 1 views
0

J'ai un problème ici et j'ai besoin de votre aide. J'ai essayé de capturer des coups de clavier en utilisant la fonction cvWaitKey(). cvWaitKey (10) devrait retourner le coup de clavier appuyé toutes les 10ms. Mais dans mon cas, je reçois toutes les 18 secondes, toutes les touches que j'ai appuyées pendant cette période de 18 secondes, à la fois. Et la fenêtre qui devrait normalement se fermer quand j'appuie sur 'esc' (voir le code) est toujours ouverte.ne peut pas capturer les coups de clavier avec cvWaitKey()

Dans la console, je reçois ceci:

VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
-1-1-1-1-1-1-1-1-1 -1-1-1-1-1-1-1-1-13536870939-1-1-1-1-1-1-1-1-1-1-1-1-1-1 -1-1-1-1-1-1-1-11536870939-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1 -1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1 -1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1 -1

Avec:
1536870939 corres étangs à quand j'ai appuyé sur 'esc'
-1 correspondent à quand aucune touche n'a été pressée

Merci pour l'aide.


#include "opencv/cv.h" 
#include "opencv/highgui.h" 
#include "iostream" 

using namespace std; 

int main() 
{ 

    IplImage *src=cvCreateImage(cvSize(640,480), 8, 3); 
    CvCapture* capture =cvCaptureFromCAM(CV_CAP_ANY); 

    int key; 
    while(1){ 

     src = cvRetrieveFrame(capture); 

     cvNamedWindow("out", CV_WINDOW_AUTOSIZE); 
     cvShowImage("out", src); 

     key = cvWaitKey(10); 
     cout<<key; 

     if(key == 1536870939) break; //if 'esc' is pressed (in ubuntu 10.04) 
     cvGrabFrame(capture); 
    } 

cvDestroyAllWindows(); 
cvReleaseCapture(&capture); 
return 0; 
} 

J'utilise: OpenCV 2.2.0, ubuntu 10.04 LTS, CodeBlocks 8,02

+0

Pourquoi créez-vous une nouvelle fenêtre sur tous les boucle itération? –

Répondre

1

La cause du problème est la façon dont fonctionne Cout: il tamponne les caractères et les envoie uniquement à la console si vous envoyez un caractère de retour à la ligne ou si vous lui demandez explicitement de le faire. (Troisième cas: le tampon est plein ... mais c'est ce que vous devez attendre 18 secondes.)

Mettez donc cout << '\n'; ou cout.flush(); après votre instruction cout actuelle.

(Soit dit en passant: VIDIOC_QUERYMENU:Invalid argument est du pilote v4l (webcam) ... et je ne sais pas où 1536870939 vient, ESC devrait être 27 :))

+0

Cela fonctionne !! Merci:) –

3

essayez d'utiliser un masque 0xff pour revenir 27 sur une ESC appuyer sur la touche:

if((cvWaitKey(10)&0xff) == 27) break; 

Alternativement, vous pouvez jeter à un personnage:

if((char)cvWaitKey(10) == 27) break; 
Questions connexes