實時讀取視頻流(封面使用五個攝像頭是因為我手頭最多只有五個),解決實時讀取延遲卡頓問題
做計算機視覺的算法開發,可能會碰到實時獲取圖像並處理的問題,我寫了一個簡單的實例,可以實時讀取多個網絡攝像頭。運行視頻預覽如下↓ (可以看到視頻播放流暢,達到30fps,同時延遲小於0.3s)
實時讀取多個網絡攝像頭
2018-06-17 初版 Yonv1943 2018-06-25 小修改,deamon,setattr(), if is_opened
2018-07-02 添加單攝像頭run(): # single camera,和多攝像頭run_multi_camera()
2018-11-21 單線程讀取單個攝像頭,多進程讀取多個攝像頭
2019-02-14 將“多線程”改正為“多進程”謝謝 的糾正
2019-05-04 增加大華攝像頭rtsp協議 我在標題里不小心用愛發電了,為了公平起見,我把海康競爭對手大華也加上去。網絡攝像頭基本都支持rtsp協議,所以可以用本方法讀取。
2019-07-04 增加將多個攝像頭的畫面有序地讀取到同一個程序 run_multi_camera_in_a_window()
2019-09-06 回復評論:目標檢測
2019-10-17 回復評論:圖片剛放進去隊列就取出來,隊列里面豈不是沒有圖片?
2019-10-31 回復評論:網絡卡頓而無法獲取視頻信息,這個應該怎么處理?
2019-11-13 回復評論:為何有 ipv4 與ipv6兩種地址?
完整版Demo:
實現上述功能的完整示例Demo (已經盡可能短),你也可以在我的GitHub上下載到最新的代碼,如果星星多,那么我還會繼續加功能:
import cv2 import time import multiprocessing as mp """ Source: Yonv1943 2018-06-17 https://github.com/Yonv1943/Python/tree/master/Demo """ def image_put(q, name, pwd, ip, channel=1): cap = cv2.VideoCapture("rtsp://%s:%s@%s//Streaming/Channels/%d" % (name, pwd, ip, channel)) if cap.isOpened(): print('HIKVISION') else: cap = cv2.VideoCapture("rtsp://%s:%s@%s/cam/realmonitor?channel=%d&subtype=0" % (name, pwd, ip, channel)) print('DaHua') while True: q.put(cap.read()[1]) q.get() if q.qsize() > 1 else time.sleep(0.01) def image_get(q, window_name): cv2.namedWindow(window_name, flags=cv2.WINDOW_FREERATIO) while True: frame = q.get() cv2.imshow(window_name, frame) cv2.waitKey(1) def run_multi_camera(): # user_name, user_pwd = "admin", "password" user_name, user_pwd = "admin", "admin123456" camera_ip_l = [ "172.20.114.26", # ipv4 "[fe80::3aaf:29ff:fed3:d260]", # ipv6 # 把你的攝像頭的地址放到這里,如果是ipv6,那么需要加一個中括號。 ] mp.set_start_method(method='spawn') # init queues = [mp.Queue(maxsize=4) for _ in camera_ip_l] processes = [] for queue, camera_ip in zip(queues, camera_ip_l): processes.append(mp.Process(target=image_put, args=(queue, user_name, user_pwd