OpenCV的waitKey()方法返回类型是什么?

4

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

opencv文档说waitKey()返回一个整数,这应该是按下的键的ASCII值。但是大多数在线教程使用以下代码,它可以编译和运行正常。

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

这表明waitKey返回一个字符而不是整数。有人能解释一下吗?

5个回答

7

cv::waitKey()会返回一个int类型的值。在C++中,char key = cv::waitKey(1)之所以有效是因为存在隐式转换。在这种情况下,cv::waitKey()返回的int类型的值被隐式地转换为char类型,并赋值给了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,然后与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

1
我已经为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中的一个错误。


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

0

显然,它使用某种8位数据类型来表示键码。在8位有符号整数数据类型中,-1可以表示为八个1(1111 1111,补码)。而在C++中,整数数据类型通常是32位的。因此,八个1被解释为255。


0

这并不重要,因为ASCII字符的范围在0到127之间。所以无论哪种类型转换实际上都是一样的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接