OPENCV waitKey() 方法 return 类型

OPENCV waitKey() method return type

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

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

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

这表明 waitKey returns 是一个字符而不是一个整数。 有人可以解释一下吗?

这无关紧要,因为 ASCII 字符介于 0 和 127 之间。所以两种转换结果实际上都是一样的。

cv::waitKey() return 一个 intchar key = cv::waitKey(1) 起作用的原因是 C++ 中的隐式转换。在这种情况下,cv::waitKey()int 类型的 return 值隐式转换为 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

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

我已经为 Ubuntu 16.04 编译了 opencv3.2waitKey() returns int,其中只有char部分有用,其余的int似乎是垃圾。所以,在视频处理循环中有这样一行

if (cv::waitKey(10) > 0) break; // if key pressed then break

几乎肯定会中断,因为即使您不按键,non-zero 垃圾也会为您 "press key"。但是像这样的一行

if ((char)cv::waitKey(10) > 0) break; // if key pressed then break

按预期工作,只有在按下某个键时才会中断。当您将它与 27 进行比较时,应用类似的逻辑。return 值中的垃圾可能确实是 OpenCV 中的一个错误。

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