opencv waitkey使用注意点
2015-08-08 15:22
260 查看
转自http://blog.csdn.net/autocyz/article/details/46941031
楼主在运行一个链接了opencv库的程序时,发现了一个奇怪的现象,就是我的在程序中调用的等待函数waitKey()不起作用,不管是是使用waitKey(100),waitKey(0),waitKey(-1),或者是使用if(waitKey(0) == ‘q’),waitKey总是不起作用。
举个简单的例子:
结果程序运行的时候会发现控制台窗口一闪而过。
当时笔者很迷惑,按道理我得随便按一个按键之后,窗口才会消失啊。
后来笔者想可能是我不小心碰到了,于是就改写了程序:
结果还是这样,控制台窗口一闪而过。
这时笔者就觉得应该是waitKey这个函数有些问题了,于是查阅了opencv的参考手册(PS:真心觉得opencv的官方参考手册很有用,尤其是这个文件opencv2refman.pdf),我搜索到waitKey这个函数,发现这个函数说明的最后,有这么一个note:
The function only works if there is at least one HighGUI window created and the window is active. If there are several HighGUI windows, any of them can be active.
此时我才恍然大悟,原来waitKey的使用,必须是在程序中至少有一个HighGUI交互界面,比如,我们最常用的imshow()等这种函数。而我程序中只有一个控制台命令窗口,这个是不属于HighGUI交互界面的,所以此时waitKey是失效的。
在第二个程序中,因为waitKey(0)根本就没有生效,所以也不会一直等待按键’q’的到来,当然窗口也是会一闪而过。
但是,如果我的程序中没有HighGUI交互界面,但是我如果只有控制台窗口,而且我也想让他停在当前界面,不会一闪而过,该如何?
笔者给出两个简单方法:
在return前加上system(“pause”)。这条语句的意思是让程序暂停执行,直到你按了任意键,才会继续执行后面的程序。
在程序中给出一个等待输入的语句,比如
至此,问题成功解决。
楼主在运行一个链接了opencv库的程序时,发现了一个奇怪的现象,就是我的在程序中调用的等待函数waitKey()不起作用,不管是是使用waitKey(100),waitKey(0),waitKey(-1),或者是使用if(waitKey(0) == ‘q’),waitKey总是不起作用。
举个简单的例子:
<code class="language-c++ hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> main() { <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span><<<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"I am so cool "</span><<endl; waitKey(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>); <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>
结果程序运行的时候会发现控制台窗口一闪而过。
当时笔者很迷惑,按道理我得随便按一个按键之后,窗口才会消失啊。
后来笔者想可能是我不小心碰到了,于是就改写了程序:
<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> main() { <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span><<<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"I am so cool "</span><<endl; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(waitKey(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) == <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'q'</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>
结果还是这样,控制台窗口一闪而过。
这时笔者就觉得应该是waitKey这个函数有些问题了,于是查阅了opencv的参考手册(PS:真心觉得opencv的官方参考手册很有用,尤其是这个文件opencv2refman.pdf),我搜索到waitKey这个函数,发现这个函数说明的最后,有这么一个note:
The function only works if there is at least one HighGUI window created and the window is active. If there are several HighGUI windows, any of them can be active.
此时我才恍然大悟,原来waitKey的使用,必须是在程序中至少有一个HighGUI交互界面,比如,我们最常用的imshow()等这种函数。而我程序中只有一个控制台命令窗口,这个是不属于HighGUI交互界面的,所以此时waitKey是失效的。
在第二个程序中,因为waitKey(0)根本就没有生效,所以也不会一直等待按键’q’的到来,当然窗口也是会一闪而过。
但是,如果我的程序中没有HighGUI交互界面,但是我如果只有控制台窗口,而且我也想让他停在当前界面,不会一闪而过,该如何?
笔者给出两个简单方法:
在return前加上system(“pause”)。这条语句的意思是让程序暂停执行,直到你按了任意键,才会继续执行后面的程序。
在程序中给出一个等待输入的语句,比如
char response; std::cin>>response这样控制台就会一直等待你的输入
至此,问题成功解决。
相关文章推荐
- LeetCode(70)题解: climbing-stairs
- 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATI
- POJ 3007 Organize Your Train part II(枚举)
- uva 529 - Addition Chains
- Snail—1-9这9个数字划分成三个3位数,第一个分别是第二、三个的2倍,3倍
- Spartan6 slave SelectMap configuration fails owing to JTAG?
- JBoss 4.2 MBeans waiting for other MBeans (PersistenceUnit)
- HDU 5358 First One( 2015 Multi-University Training Contest 6)
- fzu 1001 Duplicate Pair
- fzu 1001 Duplicate Pair
- Thai language
- [CareerCup] 4.8 Contain Tree 包含树
- scala学习之:trait的理解
- 算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)
- Duplicate Emails
- hdu 5306 Hiking || 2015 Multi-University Training Contest 6 (优先队列 为小疯子而生)
- U盘无法启动 Ubuntu 的解决方法——基于 UltraISO
- [LeetCode]217-Contains Duplicate 几种解法
- 2015 Multi-University Training Contest 6 Solutions
- POJ 1273 && HDU 1532 Drainage Ditches(最大流-Dinic)