最近项目在用opencv处理rtsp流相机,中间也踩了很多坑,这里写篇博客帮助那些可能会遇到相似问题的同胞。
注:我这里同时用到了四个相机
1.电脑同时连接多个相机后,之后去打开rtsp相机时,初次打开特别耗时,甚至打开失败,在Win10上需要修改四个相机的网关,将其修改成不一样的网关,防止网关冲突。(推荐使用CMS软件去修改相机的一些参数和网络配置)
2.如果电脑性能有限制,将rtsp显示frame和处理每一frame的函数放在两个线程中分开执行,一个显示frame,一个对frame进行算法处理。(就是采用
多线程,消息队列等方式:
python环境--(thread,queue,multiprocessing等其他多线程或多进程方式),
PyQt5环境--(QThread,QTimer等其他多线程方式),可以多种组合搭配在一起使用,看个人喜好以及项目需求)
3.
OpenCV 处理rtsp相机可能存在未捕获到帧或者卡帧的情况,中间可能会因为这一帧的错误造成很多乱七八糟的未知bug,这里附上处理的代码:
仅供参考:
# DEMO
import cv2
cap = cv2.VideoCapture('rtsp:*********你的rtsp地址:*********')
# 历史帧
oldFrame = 0.0 # float类型
print("开始")
while True:
ret, frame = cap.read()
# 当前帧的位置
frameTag = cap.get(0)
try:
# 未获得帧
if not ret:
cap.release()
cv2.destroyAllWindows()
cap = cv2.VideoCapture('rtsp:*********你的rtsp地址:*********')
ret,frame = cap.read()
# 相机卡帧(一直卡在同一帧上):
if (oldFrame == frameTag) and (oldFrame != 0.0):
cap.release()
cv2.destroyAllWindows()
cap = cv2.VideoCapture('rtsp:*********你的rtsp地址:*********')
ret,frame = cap.read()
if ret:
oldFrame = frameTag # 成为历史帧
cv2.imshow("Camera", frame)
# 如果是waiteKey(0)就会一直等待
if cv2.waitKey(1) & 0xFF == ord('q'):
break
except Exception:
print("error")
下面是Opencv中,VideoCapture.get()的参数详解:
数值 |
解析 |
cv2.VideoCapture.get(0) |
视频文件的当前位置(播放)以毫秒为单位 |
cv2.VideoCapture.get(1) |
基于以0开始的被捕获或解码的帧索引
|
cv2.VideoCapture.get(2) |
视频文件的相对位置(播放):0=电影开始,1=影片的结尾。 |
cv2.VideoCapture.get(3) |
在视频流的帧的宽度 |
cv2.VideoCapture.get(4) |
在视频流的帧的高度 |
cv2.VideoCapture.get(5) |
帧速率 |
cv2.VideoCapture.get(6) |
编解码的4字-字符代码 |
cv2.VideoCapture.get(7) |
视频文件中的帧数 |
cv2.VideoCapture.get(8) |
返回对象的格式 |
cv2.VideoCapture.get(9) |
返回后端特定的值,该值指示当前捕获模式 |
cv2.VideoCapture.get(10) |
图像的亮度(仅适用于照相机) |
cv2.VideoCapture.get(11) |
图像的对比度(仅适用于照相机) |
cv2.VideoCapture.get(12) |
图像的饱和度(仅适用于照相机) |
cv2.VideoCapture.get(13) |
色调图像(仅适用于照相机) |
cv2.VideoCapture.get(14) |
图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升) |
cv2.VideoCapture.get(15) |
曝光(仅适用于照相机) |
cv2.VideoCapture.get(16) |
指示是否应将图像转换为RGB布尔标志 |
cv2.VideoCapture.get(17) |
暂时不支持 |
cv2.VideoCapture.get(18) |
立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能) |