繁体   English   中英

OPENCV waitKey()方法返回类型

[英]OPENCV waitKey() method return type

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

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

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

这表明waitKey返回一个char而不是int。 有人可以解释一下吗?

cv::waitKey()返回一个int char key = cv::waitKey(1)的原因是由于C ++中的隐式转换。 在这种情况下, 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;

我在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()返回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中的错误。

无关紧要,因为ASCII字符在0到127之间。因此,任何一个演员实际上都会产生相同的结果。

显然,它使用某种8位数据类型来表示密钥代码。 在8位烧结整数数据类型中,-1可以表示为8个1(1111 1111,补充代码)。 在C ++中,整数数据类型通常是32位。 因此,八个1被解释为255。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM