首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OPENCV waitKey()方法返回类型

OPENCV waitKey()方法返回类型
EN

Stack Overflow用户
提问于 2015-04-02 11:01:02
回答 5查看 30.5K关注 0票数 4

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

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

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

这意味着waitKey返回一个字符,而不是一个int。谁能解释一下吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-08-14 20:29:34

cv::waitKey()返回一个intchar key = cv::waitKey(1)工作的原因是C++中的隐式转换。在这种情况下,int类型cv::waitKey()的返回值被隐含地转换为char,然后分配给key。参考见此链接。以下声明相当于:

代码语言:javascript
运行
复制
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)进行比较。我会用显式转换重写它,以避免模棱两可。

代码语言:javascript
运行
复制
if ( (char)27 == (char) waitKey(1) ) break;

在OpenCV示例cpp文件中,我经常看到这样做的方式:

代码语言:javascript
运行
复制
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

以下也是可能的,但第一种方法要干净得多:

代码语言:javascript
运行
复制
int key = cv::waitKey(30) & 255; // key is an integer here
if (key == 27) break;            // break when `esc' key is pressed
票数 7
EN

Stack Overflow用户

发布于 2016-10-17 11:31:26

在Ubuntu14.04中,我必须使用cv::waitKey()%256来获得正确的ASCII代码。您可以打印cv::waitKey()的结果,以确定它是否适合于您:)

票数 1
EN

Stack Overflow用户

发布于 2017-02-08 06:55:24

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

代码语言:javascript
运行
复制
if (cv::waitKey(10) > 0) break; // if key pressed then break

断点几乎是肯定的,因为即使你没有按下键,非零垃圾也会为你“按下键”。但是像这样的一条线

代码语言:javascript
运行
复制
if ((char)cv::waitKey(10) > 0) break; // if key pressed then break

按照预期工作,只有按下键时才会中断。当您将其与27进行比较时,也会应用类似的逻辑。返回值中的垃圾可能确实是OpenCV中的一个bug。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29411301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档