亡羊补牢——关于waitKey(0)不起作用的问题

本文探讨了在OpenCV程序中使用waitKey(0)遇到的问题及其解决办法。作者在尝试读取文件夹内图片时,发现waitKey(0)无法使程序暂停等待按键输入。文中介绍了两种可行的解决方案,并最终选择了结合使用窗口和waitKey的方法。

今天写了一个程序,其中有一步是自动读取某个文件夹里所有图片,除了一些问题一直无法发现,就用了以下语句检测读到的文件名是否正确。

 

在while的大循环中,插入语句cout<<ImgName<<endl; 后为了判断输出是否正确以便查询问题,在while循环结束前加入了语句waitKey(0);以阻止循环继续进行。

 

但是waitKey(0);这条语句并不起作用,程序仍然没有让我“输入任意键结束"。经查询博客,发现waitKey(0);这条语句只有在至少一个highGUI的交互界面才能起作用,比如一个namedWindow(""); 。

解决方法有两种:

 

  1. 在return前加上system(“pause”)。这条语句的意思是让程序暂停执行,直到你按了任意键,才会继续执行后面的程序。
  2. 在程序中给出一个等待输入的语句,比如char response; std::cin>>response这样控制台就会一直等待你的输入。(注意一定要加上std:: 如果在opencv里使用了using namespace cv的话,不然还是不起作用。)

但这又出现了另一个问题,当我使用了system("pause");语句以后,在while循环的前后两条语句

namedWindow("Image");

imshow("Image",image);

中window是出来了,但是图片一直加载不出来,后来经过查询,发现是和system这条语句线程冲突导致的,因此在想用system("pause");时应尽量避免展示图象。

 

最后解决方案:使用了window+waitKey(0);。

 

 

 

OpenCV中,代码 `if (cv::waitKey(1)==27) { break; }` 不起作用可能有多种原因,以下是一些可能的解决办法: ### 确保焦点在OpenCV窗口上 在按下键的时候,焦点要落在OpenCV窗口上,不能落在cmd窗口或其他窗口上。如果焦点不在OpenCV窗口,按键事件不会被 `waitKey()` 捕获。例如在Python下使用OpenCV时,就需要注意这一点 [^2]。 ### 检查窗口是否正常显示 `waitKey()` 函数必须在有窗口显示的情况下才有作用,否则无效。确保在调用 `waitKey()` 之前已经使用 `cv::imshow()` 创建了窗口。例如在播放视频的代码中,需要先使用 `cv2.imshow('video', frame)` 显示窗口,再调用 `cv2.waitKey(1)` [^1][^2][^3]。 ### 调整等待时间 `waitKey()` 的参数表示等待的毫秒数,参数为 1 毫秒可能时间过短,导致按键很难被捕获。可以适当增加等待时间,如将 `cv::waitKey(1)` 改为 `cv::waitKey(30)` 或 `cv::waitKey(100)` [^1][^2][^4]。 ### 检查按键码 不同的操作系统和环境可能会对按键码产生影响。可以在代码中添加一些调试信息,输出 `waitKey()` 的返回值,确认按下 ESC 键时返回的按键码是否为 27。示例代码如下: ```cpp #include <opencv2/opencv.hpp> #include <iostream> int main() { cv::Mat image = cv::imread("your_image.jpg"); cv::imshow("Image", image); while (true) { int key = cv::waitKey(30); std::cout << "Key code: " << key << std::endl; if (key == 27) { break; } } cv::destroyAllWindows(); return 0; } ``` ### 按位与操作 在某些情况下,需要对 `waitKey()` 的返回值进行按位与操作 `& 0xFF` 来获取正确的按键码。例如在Python-OpenCV中播放视频的代码中,使用 `if cv2.waitKey(1) & 0xFF == 27: break` [^3]。 ### 示例代码 以下是一个完整的示例代码,展示了如何使用 `waitKey()` 并处理按键事件: ```cpp #include <opencv2/opencv.hpp> int main() { cv::Mat image = cv::imread("your_image.jpg"); if (image.empty()) { std::cout << "Could not open or find the image" << std::endl; return -1; } cv::imshow("Image", image); while (true) { int key = cv::waitKey(30); if (key == 27) { break; } } cv::destroyAllWindows(); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值