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,那么需要加一个中括号。