Opencv-python3,处理rtsp流视频-----踩坑总结+VideoCapture.get()详解:

最近项目在用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后端支持这个功能)

你可能感兴趣的:(OpenCV,PyQt5,Python3)