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 一个 int
。 char 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.2
。 waitKey()
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。
我正在尝试使用在线教程为图像处理项目学习 OPENCV。
opencv 文档说 waitKey() returns 是一个 int。这应该是按下的键的 ASCII 值。但是大多数在线教程都使用以下代码编译并运行良好。
if ( (char)27==waitKey(1) ) break;
这表明 waitKey returns 是一个字符而不是一个整数。 有人可以解释一下吗?
这无关紧要,因为 ASCII 字符介于 0 和 127 之间。所以两种转换结果实际上都是一样的。
cv::waitKey()
return 一个 int
。 char 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.2
。 waitKey()
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。