您当前的位置: 首页 >  ide

Xavier Jiezou

暂无认证

  • 1浏览

    0关注

    394博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【OpenCV】记录cv2.VideoCapture的一个坑

Xavier Jiezou 发布时间:2022-07-19 13:31:40 ,浏览量:1

项目场景

需要使用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.
关注
打赏
1661408149
查看更多评论
立即登录/注册

微信扫码登录

0.0797s