我正在尝试使用在线教程学习OPENCV图像处理项目。
opencv文档说waitKey()返回一个int。这应该是按下的键的ASCII值。但大多数在线教程使用以下编译并运行良好的代码。
if ( (char)27==waitKey(1) ) break;
这表明waitKey返回一个char而不是一个int。 有人可以解释一下吗?
答案 0 :(得分:5)
cv::waitKey()
会返回int
。 char 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.04
。 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中的错误。
答案 3 :(得分:0)
由于ASCII字符在0到127之间无关紧要。因此,任何一个演员实际上都会产生相同的结果。
答案 4 :(得分:0)
显然,它使用某种8位数据类型来表示密钥代码。在8位烧结整数数据类型中,-1可以表示为8个1(1111 1111,补充代码)。在C ++中,整数数据类型通常是32位。因此,八个1被解释为255。