我正在尝试学习OPENCV的一个图像处理项目使用在线教程。
opencv文档说waitKey()返回一个int。这应该是按下的键的ASCII值。但是大多数在线教程都使用以下代码,这些代码编译并运行良好。
if ( (char)27==waitKey(1) ) break;
这意味着waitKey返回一个字符,而不是一个int。谁能解释一下吗?
发布于 2015-08-14 20:29:34
cv::waitKey()
返回一个int
。char key = cv::waitKey(1)
工作的原因是C++中的隐式转换。在这种情况下,int
类型cv::waitKey()
的返回值被隐含地转换为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
发布于 2016-10-17 11:31:26
在Ubuntu14.04中,我必须使用cv::waitKey()%256
来获得正确的ASCII代码。您可以打印cv::waitKey()
的结果,以确定它是否适合于您:)
发布于 2017-02-08 06:55:24
我已经为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中的一个bug。
https://stackoverflow.com/questions/29411301
复制相似问题