我是靠谱客的博主 愉快狗,最近开发中收集的这篇文章主要介绍【OpenCV】记录cv2.VideoCapture的一个坑,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

项目场景

需要使用cv2.VideoCapture来获取海康摄像机的RTSP流视频。

问题描述

如果RTSP流视频的链接是正确的,那么很好,没有任何问题,访问也很快。如何链接的IP或端口不对,那么延时就非常高:

import cv2
import time
t1 = time.time()
tmp1 = cv2.VideoCapture('rtsp://admin:12345678@192.168.1.101:554')
tmp1.release()
print(time.time()-t1) # 1.36(秒)
t1 = time.time()
tmp2 = cv2.VideoCapture('rtsp://admin:12345678@192.168.1.101:555')
tmp2.release()
print(time.time()-t1) # 32.3(秒)

为了不一直等待下去,我们需要做一个延时判断,给定一个最大响应时间,如果在该时间内程序仍未执行完成,则立即结束。

解决方案

  1. 安装第三方库 func_timeout
pip install func_timeout
  1. 按照如下形式改写程序
import cv2
import time
from func_timeout import func_timeout, FunctionTimedOut
t1 = time.time()
tmp1 = cv2.VideoCapture('rtsp://admin:12345678@192.168.1.101:554')
tmp1.release()
print(time.time()-t1)  # 1.36(秒)
t1 = time.time()
try:
    tmp2 = func_timeout(3, cv2.VideoCapture, ('rtsp://admin:12345678@192.168.1.101:555',))
except FunctionTimedOut:
    print('执行超时')
print(time.time()-t1)  # 3.07(秒)

注意事项

值得注意的是,上述方案虽然解决了当IP或端口有误时cv2.VideoCapture的延时问题,但如果再一次对正常的IP和端口调用cv2.VideoCapture竟然又有非常大的延时,所以就很懵????,完全弄不清楚cv2.VideoCapture的逻辑和缓存机制,有兴趣的看一下C++源码吧。

引用参考

  • python timeout(设置函数超时退出)
  • Python module to support running any existing function with a given timeout.

最后

以上就是愉快狗为你收集整理的【OpenCV】记录cv2.VideoCapture的一个坑的全部内容,希望文章能够帮你解决【OpenCV】记录cv2.VideoCapture的一个坑所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部