2016-04-26 125 views
2

我正在调试一些在Ubuntu 14上使用OpenCV的C++代码,这已知可以在Ubuntu 12上运行,也可能与其他OpenCV库构建一起使用。Opencv cv :: waitKey()返回值

什么

int key_pressed = waitKey(0); 
cout << "key_pressed " << int(key_pressed) << endl; 
switch(key_pressed) 
{ 
    case 27: //esc 
    { 
     //close all windows and quit 
     destroyAllWindows(); 
    } 

    ... 

之前但是这个代码不工作,并在输出我有key_pressed 1048603

此代码的工作:

char key_pressed = cv::waitKey(); 
cout << "key_pressed " << int(key_pressed) << endl; 
switch(key_pressed) 
{ 
    case 27: //esc 
    { 
     //close all windows and quit 
     destroyAllWindows(); 
    } 

    ... 

此代码工作,在输出我有key_pressed 27

可能是什么原因行为?

P.S. documentation says即cv :: waitKey()返回int,那么为什么我们应该将其转换为char

回答

4

此功能是高度依赖于操作系统:/他们中的一些位添加到整数....

它应该返回按键的ASCII码,例如,27是ASCII代码为ESC键...

现在,问题是要知道当您将int转换为char时会发生什么。

在这种情况下:这是实现定义....(这是标准说什么),这里是一个link到一个类似的案件

一些解决方案

1)把它变成char变量......尽管它是实现定义的,但它似乎是最常用的工作解决方案之一(在一些opencv样本中,它们使用它)

2)use int key = cv::waitKey(1) & 255。这将消除额外的比特...

要走远一点,让检查值:

You obtained as an int: 1048603 
in binary it will be: 00000000 00010000 00000000 00011011 
27 in binary is:  00000000 00000000 00000000 00011011 

正如你可以看到他们在孤立比特的不同....的safetest和最可移植的方式是使用按位逻辑操作(如我的第2号解决方案)将其删除。其他人使用一些十六进制值而不是255,如0xEFFFFF在二进制中它将是

00000000 11101111 11111111 11111111 

为什么会发生这种情况?

我搜索了一次,似乎有一些位变化,如果你有numslockcapslockctrl键激活...再次,这是平台相关的。