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() 返回一个intchar 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.2waitKey() 返回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 3 -- waitKey()函数

waitkey()

opencv-python使用

在 OpenCV 中 waitKey (30) 是啥意思? [复制]

我无法让 OpenCV 中的 CV2.waitKey 正常工作。运行 waitKey 后代码无响应

OpenCV转换成PIL.Image格式