OPENCV waitKey() 方法返回类型
Posted
技术标签:
【中文标题】OPENCV waitKey() 方法返回类型【英文标题】:OPENCV waitKey() method return type 【发布时间】:2015-04-02 11:01:02 【问题描述】:我正在尝试使用在线教程为图像处理项目学习 OPENCV。
opencv 文档说 waitKey() 返回一个 int。这应该是按下的键的 ASCII 值。但是大多数在线教程使用以下代码,可以正常编译和运行。
if ( (char)27==waitKey(1) ) break;
这表明 waitKey 返回的是 char 而不是 int。 谁能解释一下?
【问题讨论】:
【参考方案1】:cv::waitKey()
返回一个int
。 char key = cv::waitKey(1)
起作用的原因是由于 C++ 中的隐式转换。在这种情况下,cv::waitKey()
的 int
类型的返回值被隐式转换为 char
,然后分配给 key
。请参阅this link 以供参考。以下语句是等价的:
char key = (char) cv::waitKey(30); // explicit cast
char key = cv::waitKey(30); // implicit cast
在 if ((char)27 == waitKey(1)) break;
的情况下,waitKey(1)
的输出可能会隐式转换为 char
,然后与 esc
字符(ASCII 代码 27)进行比较。我会用显式转换重写它以避免歧义。
if ( (char)27 == (char) waitKey(1) ) break;
我在 OpenCV 示例 cpp 文件中看到它通常是如何完成的:
char key = (char) cv::waitKey(30); // explicit cast
if (key == 27) break; // break if `esc' key was pressed.
if (key == ' ') do_something(); // do_something() when space key is pressed
以下也是可能的,但第一种方法更简洁:
int key = cv::waitKey(30) & 255; // key is an integer here
if (key == 27) break; // break when `esc' key is pressed
【讨论】:
【参考方案2】:在 Ubuntu 14.04 中,我必须使用 cv::waitKey()%256
来获取正确的 ASCII 码。
您可以打印cv::waitKey()
的结果,看看它是否适合您:)
【讨论】:
【参考方案3】:我为Ubuntu 16.04
编译了opencv3.2
。 waitKey()
返回int
,其中只有char
部分有用,其余int
似乎是垃圾。所以,在视频处理循环中这样一行
if (cv::waitKey(10) > 0) break; // if key pressed then break
几乎肯定会中断,因为即使您不按键,非零垃圾也会为您“按键”。但是这样的一行
if ((char)cv::waitKey(10) > 0) break; // if key pressed then break
按预期工作,仅在按下某个键时才会中断。与 27 比较时,应用类似的逻辑。返回值中的垃圾可能确实是 OpenCV 中的错误。
【讨论】:
【参考方案4】:ASCII 字符在 0 到 127 之间并不重要。所以任何一种转换的结果实际上都是一样的。
【讨论】:
【参考方案5】:显然,它使用某种 8 位数据类型来表示键码。在 8 位单数整数数据类型中,-1 可以表示为八个 1(1111 1111,补码)。而在 C++ 中,整数数据类型通常是 32 位的。因此,8 个 1 被解释为 255。
【讨论】:
以上是关于OPENCV waitKey() 方法返回类型的主要内容,如果未能解决你的问题,请参考以下文章
在 OpenCV 中 waitKey (30) 是啥意思? [复制]