我在这里遇到问题,需要您的帮助。我一直在尝试使用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
最佳答案
问题的原因是cout的工作方式:它缓冲字符,并且仅在您发送换行符或明确要求这样做时才将它们发送到控制台。 (第三种情况:缓冲区已满...但这就是您需要等待18秒的时间。)
因此,在您当前的cout << '\n';
语句之后放置cout.flush();
或cout
。
(顺便说一句:VIDIOC_QUERYMENU:Invalid argument
来自v4l(网络摄像头)驱动程序...我不知道1536870939来自何处,ESC应该是27 :))
关于keyboard - 无法使用cvWaitKey()捕获键盘笔触,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5205173/