在openCV中,可以用cv2.VideoCapture 方法来从各种源拉取视频流,包括本地文件,摄像头,以及网络流(如RTSP,HTTP).下面是一个简单的方法,说明如何使用openCV从网络中拉取视频.
额外学习:中间添加了队列,添加队列对线程安全,内存控制等方面有多个好处.
#引用
import cv2
from que import Queue
##创建一个队列,我这里最大容量为2
frame_queue = Queue(maxsize=2)
#定义拉流函数
def capture_stream(stream_url):
cap = cv2.VideoCapture(stream_url)
while True:
ret,frame =cap.read()
if not ret :
print("Faild to grab frame")
break
# 如果队列已满,丢弃最旧的帧(即队列里的第一帧)
if frame_queue.full():
frame_queue.get()
#放入新帧
frame_queue.put(frame)
if cv2.waitKey(1) &0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
#定义处理队列中帧的函数
def process_frame():
while True:
if not frame_queue.empty():
#获取队列中的帧进行处理
frame = frame_queue.get()
#这里处理帧
# '''
#显示帧
cv2.imshow('Processed Frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
#整体代码:
import cv2
from queue import Queue
# 创建一个最大容量为2的队列
frame_queue = Queue(maxsize=2)
# 定义拉流函数
def capture_stream(stream_url):
cap = cv2.VideoCapture(stream_url)
while True:
ret, frame = cap.read()
if not ret:
print("Failed to grab frame")
break
# 如果队列已满,丢弃最旧的帧(即队列中的第一帧)
if frame_queue.full():
frame_queue.get()
# 放入新帧
frame_queue.put(frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
# 定义处理队列中帧的函数
def process_frames():
while True:
if not frame_queue.empty():
# 获取队列中的帧进行处理
frame = frame_queue.get()
# 这里处理帧
# ...
# 显示帧
cv2.imshow('Processed Frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break