当前位置: 首页 > 工具软件 > VideoCapture > 使用案例 >

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

夔高寒
2023-12-01

项目场景

需要使用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++源码吧。

引用参考

 类似资料: