浅谈OpenCV的imshow与waitkey关系

刚入门OpenCV,就遇上了一个难题,代码如下:

import cv2
rtsp_url  = 'rtsp://admin:******@192.168.1.123:554/Streaming/Channels/1'

cap = cv2.VideoCapture(rtsp_url)
if not cap.isOpened():
    print("无法打开视频流")
    exit()
while True:
    ret, frame = cap.read()
    if not ret:
        break
    cv2.imshow('Video', frame)

运行起来,弹出的窗口没有任何画面,并且始终无响应

但是下面的代码却能正常运行

import cv2
rtsp_url  = 'rtsp://admin:******@192.168.1.123:554/Streaming/Channels/1'

cap = cv2.VideoCapture(rtsp_url)
if not cap.isOpened():
    print("无法打开视频流")
    exit()
while True:
    ret, frame = cap.read()
    if not ret:
        break
    cv2.imshow('Video', frame)
    cv2.waitKey(1)

显而易见,问题就出在

 cv2.waitKey(1)

查询相关资料,结论如下:

waitKey(Delay),这个函数表面上是指等待用户操作Delay毫秒,在这个过程中的按键和鼠标操作都可以被检测到

但更准确地而言,waitKey给程序分配了Delay毫秒来暂停运行程序的主逻辑,转而去运行GUI的使事件循环。在这个事件循环中,

回到imshow函数上来,查询资料可知,它的作用实际上并不是把图片渲染到GUI界面上,而是把图像加载到操作系统的绘图队列中,并通知事件循环,这样在下一次事件循环执行时,就会把图片从缓存中来出来渲染到GUI界面。

所以问题根源就了然了,缺少waitKey函数后,imshow发出的绘图请求并不会被窗口处理,窗口没有时间分配给事件循环。

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值