opencv使用waitKey()函数

时间:2017-08-09 02:59:59

标签: opencv keyboard

我想处理箭头键。但是当我打印出waitKey()函数的输入值时,它的0。 我不知道为什么。 我试着改变" int"到" char" ,但它不起作用。 我该如何解决这个问题。

int pos = 100;
imshow("image", image);
onChange(pos, (void *)&image);
createTrackbar("threshold", "image", &pos, 255, onChange, (void*)&image);
while (1) {
    int Key = waitKey();
    cout << Key << endl;
    if (Key == 27) break;
    if (Key == 2490368) {
        pos--;
        onChange(pos, (void *)&image);
    }
    if(Key == 2621440){
        pos++;
        onChange(pos, (void *)&image);
    }
    if (pos < 0 || pos > 255) pos = 0;
}

4 个答案:

答案 0 :(得分:12)

请改用waitKeyEx()功能。正如文档所说:

  

与waitKey()类似,但返回完整的密钥代码。

     

密钥代码是特定于实现的,取决于使用的后端:   QT / GTK / Win32的

在我的系统上它给出: 左:2424832 上:2490368 右:2555904 下:2621440

虽然有许多在线消息来源称waitKey()使用箭头,但它并没有在我的Windows系统上返回正确的密钥代码(总是返回0)。猜猜这也是特定于实现的。也许是因为waitKey()会返回ASCII代码,但是箭头键没有它们(如here所述)。

答案 1 :(得分:2)

请注意,这取决于版本,在具有3.0 waitKey()的窗口上给出了完整的密钥代码,但是当我更改为3.3时,它突然返回0表示箭头键。

答案 2 :(得分:0)

以下是我的临时解决方法

#ifndef _WIN32
int myWaitKey(int wait) {
    int c = cv::waitKey(wait);
    return c;
}
#pragma message("linux..")
#else
#include <conio.h> // to support _getch
int myWaitKey(int wait) {
    int c = cvWaitKey(wait);
    if (c == 0) {
        int c = _getch();   //capture the key code and insert into c
        if (c == 0 || c == 224)
            c = _getch();
    }
    //if (c!=-1) printf("%d\n",c);
    return c;
}
#endif

答案 3 :(得分:0)

在代码中使用waitkey(),保持按住cv2.trackbar图标的左键单击并使用箭头键以1的增量移动