我正在使用在线教程学习OPENCV进行图像处理项目。
opencv文档说waitKey()返回一个整数,这应该是按下的键的ASCII值。但是大多数在线教程使用以下代码,它可以编译和运行正常。
if ( (char)27==waitKey(1) ) break;
这表明waitKey返回一个字符而不是整数。有人能解释一下吗?
我正在使用在线教程学习OPENCV进行图像处理项目。
opencv文档说waitKey()返回一个整数,这应该是按下的键的ASCII值。但是大多数在线教程使用以下代码,它可以编译和运行正常。
if ( (char)27==waitKey(1) ) break;
这表明waitKey返回一个字符而不是整数。有人能解释一下吗?
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;
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
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中的一个错误。
cv::waitKey()%256
来获取正确的ASCII代码。
您可以打印cv::waitKey()
的结果,以查看它是否适用于您:)显然,它使用某种8位数据类型来表示键码。在8位有符号整数数据类型中,-1可以表示为八个1(1111 1111,补码)。而在C++中,整数数据类型通常是32位的。因此,八个1被解释为255。
这并不重要,因为ASCII字符的范围在0到127之间。所以无论哪种类型转换实际上都是一样的。