我正在调试一些在Ubuntu 14上使用OpenCV的C ++代码,Ubuntu 14已知可以在Ubuntu 12上运行,也可能与其他OpenCV库构建一起工作。
之前的事情
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
?
答案 0 :(得分:6)
此函数高度依赖于操作系统:/其中一些函数会向整数添加一个位....
它应该返回按键的ascii代码,例如27
是ESC
键的ascii代码...
现在,问题是要知道将int转换为char
时会发生什么。
在这种情况下:它是实现定义的....(这就是标准所说的)这里是类似案例的link
一些解决方案:
1)将它放入char变量中......即使它是实现定义的,它似乎是最常用的工作解决方案之一(在一些opencv样本中它们使用它)
2)使用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
正如您所看到的那样,它们的区别在于......最安全,最便携的方法是使用按位逻辑运算将其删除,例如我的2号解决方案。其他人使用一些十六进制值而不是255,例如0xEFFFFF,二进制中它将是
00000000 11101111 11111111 11111111
为什么会这样?
我搜索了一次,如果你有numslock
或capslock
或ctrl
键活动,似乎某些位会发生变化...再次,这是平台相关的。< / p>