刚入门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发出的绘图请求并不会被窗口处理,窗口没有时间分配给事件循环。