OPENCV waitKey()方法返回类型

时间:2015-04-02 11:01:02

标签: c++ opencv image-processing

我正在尝试使用在线教程学习OPENCV图像处理项目。

opencv文档说waitKey()返回一个int。这应该是按下的键的ASCII值。但大多数在线教程使用以下编译并运行良好的代码。

if ( (char)27==waitKey(1) ) break;

这表明waitKey返回一个char而不是一个int。 有人可以解释一下吗?

5 个答案:

答案 0 :(得分:5)

cv::waitKey()会返回intchar key = cv::waitKey(1)起作用的原因是由于C ++中的隐式转换。在这种情况下,int的{​​{1}}类型的返回值会被隐含地转换为cv::waitKey(),然后分配给char。请参阅this link以供参考。以下陈述是等效的:

key

对于char key = (char) cv::waitKey(30); // explicit cast char key = cv::waitKey(30); // implicit cast if ((char)27 == waitKey(1)) break;的输出可能会隐式转换为waitKey(1),然后与char字符(ASCII代码27)进行比较。我会用显式转换重写它以避免歧义。

esc

我看到它在OpenCV示例cpp文件中经常完成的方式:

if ( (char)27 == (char) waitKey(1) ) break;

以下也是可能的,但第一种方法更清洁:

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

答案 1 :(得分:1)

使用Ubuntu 14.04,我必须使用cv::waitKey()%256来获取正确的ASCII码。 您可以打印cv::waitKey()的结果,看看它是否适合您:)

答案 2 :(得分:1)

我为opencv3.2编译了Ubuntu 16.04waitKey()会返回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中的错误。

答案 3 :(得分:0)

由于ASCII字符在0到127之间无关紧要。因此,任何一个演员实际上都会产生相同的结果。

答案 4 :(得分:0)

显然,它使用某种8位数据类型来表示密钥代码。在8位烧结整数数据类型中,-1可以表示为8个1(1111 1111,补充代码)。在C ++中,整数数据类型通常是32位。因此,八个1被解释为255。