先来看一个简单的读取RTSP的示例程序
import cv2
cap=cv2.VideoCapture("rtsp://admin:admin_123@172.0.0.0")
ret,frame = cap.read()
while ret:
ret,frame = cap.read()
cv2.imshow("frame",frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
cap.release()
其中frame值为每一帧的图像。但是如果在while 代码块中添加对每一帧的识别操作,比如加入Tensorflow识别一下其中的小动物,则会报出这样的错误导致这个while循环由于这个异常而中断。
原来是由于FFMPEG Lib对在rtsp协议中的H264 vidos不支持,所以处理办法就是自己写两个不同的线程单独去处理接收每一帧的图像,然后另一个线程处理这每一帧的图像。
思路如下:使用队列,采取先入先出策略,在一个线程中开始接收数据,在另一个线程中处理逐帧数据
代码如下:
import cv2
import queue
import time
import threading
q=queue.Queue()
def Receive():
print("start Reveive")
cap = cv2.VideoCapture("rtsp://admin:admin_123@172.0.0.0")
ret, frame = cap.read()
q.put(frame)
while ret:
ret, frame = cap.read()
q.put(frame)
def Display():
print("Start Displaying")
while True:
if q.empty() !=True:
frame=q.get()
cv2.imshow("frame1", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
if __name__=='__main__':
p1=threading.Thread(target=Receive)
p2 = threading.Thread(target=Display)
p1.start()
p2.start()
Receive作为接收数据线程,Display作为简单的处理即显示。