cv2.waitKey的入门级理解

最初用opencv处理图像时,大概查过cv2.waitKey这个函数,当时查的迷迷糊糊的,只知道加上cv2.waitKey之后cv2.imshow就可以显示图像了。今天做视频逐帧截取时再次碰见了它,我盯着它想了半天也不知道这个函数有什么用,于是打开浏览器,一逛就是大半天。现在把我的收获及想法总结一下。

为什么cv2.imshow之后要跟cv2.waitkey

我们先说说它的好兄弟cv2.imshow。我们都知道imshow的作用是在GUI里显示一幅图像,但是它有个特点我们没有太注意,就是它的持续时间。看看下面的测试你就明白了。

无waitkey

waitkey1

waitkey1000

实际上,waitkey控制着imshow的持续时间,当imshow之后不跟waitkey时,相当于没有给imshow提供时间展示图像,所以只有一个空窗口一闪而过。添加了waitkey后,哪怕仅仅是cv2.waitkey(1),我们也能截取到一帧的图像。所以cv2.imshow后边是必须要跟cv2.waitkey的。

给一段imshow源码里的注释来印证下:This function should be followed by cv::waitKey function which displays the image for specified . milliseconds. Otherwise, it won't display the image.

非官方翻译:这个函数之后应接cv2.waitKey函数来显示指定图像。否则,它不会显示图像。

为什么要这么麻烦的设计

来自官方的解释:This function is the only method in HighGUI that can fetch and handle events, so it needs to be .

非官方翻译:这个函数是HighGUI窗口中唯一的获取和处理事件的方法,因此它必须存在。

cv2.waitKey(1000) & 0xFF == ord(‘q’) 是什么意思

先解释下字面意思:

  • cv2.waitKey(1000):在1000ms内根据键盘输入返回一个值
  • 0xFF :一个十六进制数
  • ord('q') :返回q的ascii码

0xFF是一个十六进制数,转换为二进制是11111111。waitKey返回值的范围为(0-255),刚好也是8个二进制位。那么我们将 cv2.waitKey(1) & 0xFF计算一下(不知怎么计算的可以百度位与运算)发现结果仍然是waitKey的返回值,那为何要多次一举呢?直接 cv2.waitKey(1) == ord('q')不就好了吗。

实际上在linux上使用waitkey有时会出现waitkey返回值超过了(0-255)的范围的现象。通过cv2.waitKey(1) & 0xFF运算,当waitkey返回值正常时 cv2.waitKey(1) = cv2.waitKey(1000) & 0xFF,当返回值不正常时,cv2.waitKey(1000) & 0xFF的范围仍不超过(0-255),就避免了一些奇奇怪怪的BUG。

cv2.waitkey和time.sleep的区别

肯定有人写在代码时把waitkey当sleep用过,你会发现有时waitkey并不起作用。

先来一段官方解释:The function only works if there is at least one HighGUI window created and the window is active

非官方翻译:这个函数只有在至少一个HighGUI窗口存在的情况下才会起作用。

也就是说waitkey的延时机制是有条件的,必须在它之前创造HighGUI窗口它才会起作用。而time.sleep是无条件的延时机制。

那么cv2.waitKey能不能代替time.sleepcv2.imshow心中的地位呢?

waitkey
sleep
答案很清楚:不能。

  • 436
    点赞
  • 757
    收藏
    觉得还不错? 一键收藏
  • 41
    评论
waitkey函数是OpenCV中常用的一个函数,它通常用于在图像界面上显示图像并等待用户按键响应。一般来说,waitkey会在等待用户按下某个键之前一直阻塞程序的执行。但是在某些情况下,可能会出现waitkey不执行的情况。 waitkey函数不执行的可能原因有以下几种: 1. 图像没有成功加载:如果图像读取或加载出现问题,那么在执行waitkey之前就会导致程序中断,从而waitkey不执行。 2. 程序没有进入图像显示的环节:如果在waitkey之前存在某个条件或循环,导致程序直接跳出图像显示的环节,那么waitkey自然不会执行。 3. 图像显示窗口被关闭:如果在waitkey之前,程序中的窗口被手动关闭,那么waitkey也就无法执行。 4. 背景线程或其他操作导致的阻塞:在某些情况下,可能存在背景线程或其他操作导致程序一直处于阻塞状态,从而无法执行waitkey函数。 针对以上情况,我们可以通过以下方法来解决waitkey不执行的问题: 1. 确保图像成功加载并正确显示。 2. 确保程序正常执行,并在waitkey函数之前没有跳出图像显示的环节。 3. 确保图像显示窗口没有被关闭或者重新创建一个显示窗口。 4. 检查是否存在其他操作或线程导致程序阻塞,并解决相应的问题。 总的来说,一般情况下waitkey函数是会执行的,如果遇到waitkey不执行的情况,需要仔细检查相关的代码逻辑以及图像显示的环节,找出问题所在并进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值