我在这里遇到问题,需要你的帮助。我一直在尝试使用cvWaitKey()函数捕获键盘敲击。 cvWaitKey(10)应该返回每10ms按下的键盘行程。 但在我的情况下,我每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,CodeBlocks 8.02
答案 0 :(得分:3)
尝试使用0xff掩码在 ESC 键按下时返回27:
if( (cvWaitKey(10)&0xff) == 27 ) break;
或者,您可以转换为角色:
if( (char)cvWaitKey(10) == 27 ) break;
答案 1 :(得分:1)
问题的原因是cout的工作方式:它缓冲字符,只有在你发送换行符或者明确要求它这样做时才将它们发送到控制台。 (第三种情况:缓冲区已满:但这就是你需要等待18秒的时间。)
在您当前的cout << '\n';
声明之后放置cout.flush();
或cout
。
(顺便说一下:VIDIOC_QUERYMENU:Invalid argument
来自v4l(网络摄像头)驱动程序......我不知道1536870939来自哪里,ESC应该是27:))