не может захватить удары клавиатуры с помощью cvWaitKey () - PullRequest
0 голосов
/ 05 марта 2011

У меня проблема здесь, и мне нужна ваша помощь.Я пытался захватить удары клавиатуры с помощью функции cvWaitKey ().cvWaitKey (10) должен возвращать нажатие клавиши каждые 10 мс.Но в моем случае я получаю каждые 18 секунд все клавиши, которые я нажимал в течение этого периода в 18 секунд, сразу.И окно, которое обычно должно закрываться при нажатии клавиши «esc» (см. Код), все еще открыто.

В консоли я получаю следующее:

VIDIOC_QUERYMENU: Неверный аргумент
VIDIOC_QUERYMENU: Неверноаргумент
VIDIOC_QUERYMENU: неверный аргумент
-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-111536870939-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-1-1-1-1-1

С:
1536870939 соответствует тому, когда я нажал 'esc
-1 соответствует тому, когда ни одна клавиша не была нажата

Спасибо за помощь.


#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;
}

Я использую: Opencv 2.2.0, Ubuntu 10.04 LTS, CodeBlocks8,02

Ответы [ 2 ]

3 голосов
/ 28 ноября 2012

попробуйте использовать маску 0xff для возврата 27 при нажатии клавиши ESC :

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

В качестве альтернативы, вы можете привести к персонажу:

if( (char)cvWaitKey(10) == 27 ) break;
1 голос
/ 05 марта 2011

Причиной проблемы является то, как работает cout: он буферизует символы и отправляет их на консоль, только если вы отправляете символ новой строки или если вы явно просите это сделать.(Третий случай: буфер переполняется ... но это то, что вам нужно ждать 18 секунд.)

Так что ставьте либо cout << '\n';, либо cout.flush(); после вашего текущего оператора cout.

(Кстати: VIDIOC_QUERYMENU:Invalid argument от драйвера v4l (веб-камера) ... и я понятия не имею, откуда приходит 1536870939, ESC должно быть 27 :)))

...