海康多相机同步取流保存图片

话不多说,直接上代码。代码里包含了多窗口显示图像和保存图片。

python 复制代码
#"rtsp://admin:123456qq@192.168.10.192/stream1"
# rtsp://admin:Admin123@192.168.100.103:554/Streaming/Channels/101
#rtsp://admin:Admin123@192.168.100.103:554/cam/realmonitor?channel=1&subtype=0

import time
import multiprocessing as mp
import cv2
import os

"""
Source: Yonv1943 2018-06-17
https://github.com/Yonv1943/Python
https://zhuanlan.zhihu.com/p/38136322
OpenCV official demo
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html
海康、大华IpCamera RTSP地址和格式(原创,旧版)- 2014年08月12日 23:01:18 xiejiashu
rtsp_path_hikvison = "rtsp://%s:%s@%s/h265/ch%s/main/av_stream" % (user, pwd, ip, channel)
rtsp_path_dahua = "rtsp://%s:%s@%s/cam/realmonitor?channel=%d&subtype=0" % (user, pwd, ip, channel)
https://blog.csdn.net/xiejiashu/article/details/38523437
最新(2017)海康摄像机、NVR、流媒体服务器、回放取流RTSP地址规则说明 - 2017年05月13日 10:51:46 xiejiashu
rtsp_path_hikvison = "rtsp://%s:%s@%s//Streaming/Channels/%d" % (user, pwd, ip, channel)
https://blog.csdn.net/xiejiashu/article/details/71786187
"""


def image_put(q, user, pwd, ip, channel=1):
    # cap = cv2.VideoCapture("rtsp://%s:%s@%s/stream1" % (user, pwd, ip))
    # cap = cv2.VideoCapture("rtsp://%s:%s@%sStreaming/Channels/1701?transportmode=unicast" % (user, pwd, ip))

    # if cap.isOpened():
    #     print('HIKVISION')
    # else:
    #     cap = cv2.VideoCapture("rtsp://%s:%s@%s/cam/realmonitor?channel=%d&subtype=0" % (user, pwd, ip, channel))
    #     print('DaHua')
    cap = cv2.VideoCapture("rtsp://%s:%s@%s/cam/realmonitor?channel=%d&subtype=0" % (user, pwd, ip, channel))
    if cap.isOpened():
        print('HIKVISION')
    else:
        cap = cv2.VideoCapture("rtsp://admin:123456qq@192.168.100.12/stream1")
        print('Genius')

    while True:
        q.put(cap.read()[1])
        q.get() if q.qsize() > 1 else time.sleep(0.01)



def run_opencv_camera():
    user, pwd, ip, channel = "admin", "123456qq", "33.90.7.110", 1

    cap_path = 0  # local camera (e.g. the front camera of laptop)
    # cap_path = 'video.avi'  # the path of video file
    # cap_path = "rtsp://%s:%s@%s/h264/ch%s/main/av_stream" % (user, pwd, ip, channel)  # HIKIVISION old version 2015
    # cap_path = "rtsp://%s:%s@%s//Streaming/Channels/%d" % (user, pwd, ip, channel)  # HIKIVISION new version 2017
    # cap_path = "rtsp://%s:%s@%s/cam/realmonitor?channel=%d&subtype=0" % (user, pwd, ip, channel)  # dahua

    cap = cv2.VideoCapture(cap_path)

    while cap.isOpened():
        is_opened, frame = cap.read()
        cv2.imshow('frame', frame)
        cv2.waitKey(1000)
    cap.release()

def image_get_s(queue_list, ip, img_path):
    """show in single opencv-imshow window"""

    window_name1 = "%s" % ip[0]
    window_name2 = "%s" % ip[1]
    window_name3 = "%s" % ip[2]
    # window_name4 = "%s" % ip[3]

    idx_img = 0
    cv2.namedWindow(window_name1, flags=cv2.WINDOW_FREERATIO)
    cv2.namedWindow(window_name2, flags=cv2.WINDOW_FREERATIO)
    cv2.namedWindow(window_name3, flags=cv2.WINDOW_FREERATIO)
    # cv2.namedWindow(window_name4, flags=cv2.WINDOW_FREERATIO)
    while True:
        imgs = [q.get() for q in queue_list]
        img1 = imgs[0]
        img2 = imgs[1]
        img3 = imgs[2]
        # img4 = imgs[3]

        img1_tmp = cv2.resize(img1, (int(1920/2 ), int(1080/2 )))
        img2_tmp = cv2.resize(img2, (int(1920/2 ), int(1080/2 )))
        img3_tmp = cv2.resize(img3, (int(1920 / 2), int(1080 / 2)))
        # img4_tmp = cv2.resize(img4, (int(1920 / 2), int(1080 / 2)))

        cv2.imshow(window_name1, img1_tmp)
        cv2.imshow(window_name2, img2_tmp)
        cv2.imshow(window_name3, img3_tmp)
        # cv2.imshow(window_name4, img4_tmp)
        # imgs = np.concatenate(imgs, axis=1)
        # cv2.imshow(window_name, imgs)
        key = cv2.waitKey(1)

        if key == ord('s'):
            img_path0 = os.path.join(img_path[0], str(idx_img) + '.jpg')
            cv2.imwrite(img_path0, img1)

            img_path1 = os.path.join(img_path[1], str(idx_img) + '.jpg')
            cv2.imwrite(img_path1, img2)

            img_path2 = os.path.join(img_path[2], str(idx_img) + '.jpg')
            cv2.imwrite(img_path2, img3)

            # img_path3 = os.path.join(img_path[3], str(idx_img) + '.jpg')
            # cv2.imwrite(img_path3, img3)
            # idx_img += 1

def image_get_all(queue_list, ip, img_path):
    """show in single opencv-imshow window"""

    window_name1 = "%s" % ip[0]
    window_name2 = "%s" % ip[1]
    # window_name3 = "%s" % ip[2]
    # window_name4 = "%s" % ip[3]


    idx_img = 0
    cv2.namedWindow(window_name1, flags=cv2.WINDOW_FREERATIO)
    cv2.namedWindow(window_name2, flags=cv2.WINDOW_FREERATIO)
    # cv2.namedWindow(window_name3, flags=cv2.WINDOW_FREERATIO)
    # cv2.namedWindow(window_name4, flags=cv2.WINDOW_FREERATIO)
    while True:
        imgs = [q.get() for q in queue_list]
        img1 = imgs[0]
        img2 = imgs[1]
        # img3 = imgs[2]
        # img4 = imgs[3]

        img1_tmp = cv2.resize(img1, (int(1920/2 ), int(1080/2 )))
        img2_tmp = cv2.resize(img2, (int(1920/2 ), int(1080/2 )))
        # img3_tmp = cv2.resize(img3, (int(1920/4), int(1080/ 4)))
        # img4_tmp = cv2.resize(img4, (int(1920 / 4), int(1080 / 4)))
        # print('11',len(img1_tmp))
        cv2.imshow(window_name1, img1_tmp)
        cv2.imshow(window_name2, img2_tmp)
        # cv2.imshow(window_name3, img3_tmp)
        # cv2.imshow(window_name4, img4_tmp)
        # imgs = np.concatenate(imgs, axis=1)
        # cv2.imshow(window_name, imgs)
        cv2.waitKey(1)

        cv2.imwrite(img_path[0]+str(idx_img)+'.jpg', img1)
        cv2.imwrite(img_path[1]+str(idx_img)+'.jpg', img2)
        # cv2.imwrite(img_path[2]+str(idx_img)+'.jpg', img3)
        # cv2.imwrite(img_path[3]+str(idx_img) +'.jpg',img4)
        idx_img +=1


def run_single_camera():
    # user_name, user_pwd, camera_ip = "admin", "admin123456", "172.20.114.196"
    # user_name, user_pwd, camera_ip = "admin", "Admin123", "192.168.100.103:554"
    user_name, user_pwd, camera_ip = "admin", "Admin123", "192.168.100.100:554"


    mp.set_start_method(method='spawn')  # init
    queue = mp.Queue(maxsize=2)
    processes = [mp.Process(target=image_put, args=(queue, user_name, user_pwd, camera_ip)),
                 mp.Process(target=image_get_s, args=(queue, camera_ip))]

    [process.start() for process in processes]
    [process.join() for process in processes]


def run_multi_camera():
    user_name, user_pwd = "admin", "Admin123"

    camera_ip_l = [
        # "172.20.114.196",  # ipv4
        # "[fe80::3aaf:29ff:fed3:d260]",  # ipv6
        # "192.168.100.180:554",
        # "192.168.100.182:554",
        "192.168.100.181:554",
        "192.168.100.184:554",
    ]

    mp.set_start_method(method='spawn')  # init
    queues = [mp.Queue(maxsize=len(camera_ip_l)) for _ in camera_ip_l]


    imgs_path = []
    for i in range(len(camera_ip_l)):
        imgs_path.append("E:/dataset_0902/images/{}/".format(camera_ip_l[i].split('.')[-1].split(':')[0]))
        if not os.path.exists(imgs_path[-1]):
            os.makedirs(imgs_path[-1])

    processes = [mp.Process(target=image_get_all, args=(queues, camera_ip_l, imgs_path))]

    for queue, camera_ip, img_path in zip(queues, camera_ip_l, imgs_path):
        processes.append(mp.Process(target=image_put, args=(queue, user_name, user_pwd, camera_ip)))



    for process in processes:
        process.daemon = True
        process.start()
    for process in processes:
        process.join()
    # p.join()

def image_collect(queue_list, camera_ip_l):
    import numpy as np

    """show in single opencv-imshow window"""
    window_name1 = "%s_and_so_no" % camera_ip_l[0]
    window_name2 = "%s_and_so_no" % camera_ip_l[1]
    cv2.namedWindow(window_name1, flags=cv2.WINDOW_FREERATIO)
    cv2.namedWindow(window_name2, flags=cv2.WINDOW_FREERATIO)
    while True:
        imgs = [q.get() for q in queue_list]
        img1 = imgs[0]
        img2 = imgs[1]

        # cv2.imshow(window_name1, img1)
        # cv2.imshow(window_name2, img2)

        img1_tmp = cv2.resize(img1, (int(1920 / 2), int(1080 / 2)))
        img2_tmp = cv2.resize(img2, (int(1920 / 2), int(1080 / 2)))
        cv2.imshow(window_name1, img1_tmp)
        cv2.imshow(window_name2, img2_tmp)
        # imgs = np.concatenate(imgs, axis=1)
        # cv2.imshow(window_name, imgs)
        cv2.waitKey(1)

        # if key == ord('s'):
        #     img_path = os.path.join(img_folder, str(idx_img) + '.jpg')
        #     cv2.imwrite(img_path, img)
        #     idx_img += 1
    # """show in multiple opencv-imshow windows"""
    # [cv2.namedWindow(window_name, flags=cv2.WINDOW_FREERATIO)
    #  for window_name in camera_ip_l]
    # while True:
    #     for window_name, q in zip(camera_ip_l, queue_list):
    #         cv2.imshow(window_name, q.get())
    #         cv2.waitKey(1)


def run_multi_camera_in_a_window():
    user_name, user_pwd = "admin", "Admin123"
    camera_ip_l = [
        # "172.20.114.196",  # ipv4
        # "[fe80::3aaf:29ff:fed3:d260]",  # ipv6
        "192.168.100.182:554",
        "192.168.100.183:554"
    ]

    mp.set_start_method(method='spawn')  # init
    queues = [mp.Queue(maxsize=2) for _ in camera_ip_l]

    processes = [mp.Process(target=image_collect, args=(queues, camera_ip_l))]
    for queue, camera_ip in zip(queues, camera_ip_l):
        processes.append(mp.Process(target=image_put, args=(queue, user_name, user_pwd, camera_ip)))

    for process in processes:
        process.daemon = True  # setattr(process, 'deamon', True)
        process.start()
    for process in processes:
        process.join()



def get_biaoding():
    user, pwd, ip, channel = "admin", "Admin123", "192.168.100.182:554", 1
    cap = cv2.VideoCapture("rtsp://%s:%s@%s/cam/realmonitor?channel=%d&subtype=0" % (user, pwd, ip, channel))
    if cap.isOpened():
        print('HIKVISION')
    idx_img = 20
    img_folder = "D:/20210226/camera{}".format(ip.split('.')[-1].split(':')[0])
    if not os.path.exists(img_folder):
        os.makedirs(img_folder)
    while True:
        img = cap.read()[1]
        img_tmp = cv2.resize(img, (1920 // 2, 1080 // 2))
        cv2.imshow('image', img_tmp)
        key = cv2.waitKey(1)
        if key == ord('s'):
            img_path = os.path.join(img_folder, str(idx_img) + '.jpg')
            cv2.imwrite(img_path, img)
            idx_img += 1




def get_img():
    cap1 = cv2.VideoCapture("rtsp://%s:%s@%s/cam/realmonitor?channel=%d&subtype=0" % ("admin", "Admin123", "192.168.100.181:554/", 1))
    # cap2 = cv2.VideoCapture("rtsp://%s:%s@%s/cam/realmonitor?channel=%d&subtype=0" % ("admin", "Admin123", "192.168.100.182:554/", 1))
    # cap3 = cv2.VideoCapture("rtsp://%s:%s@%s/cam/realmonitor?channel=%d&subtype=0" % ("admin", "Admin123", "192.168.100.183:554/", 1))
    # cap4 = cv2.VideoCapture("rtsp://%s:%s@%s/cam/realmonitor?channel=%d&subtype=0" % ("admin", "Admin123", "192.168.100.184:554/", 1))

    img_save1 = "E:/dataset_0902/calibrate_intri/181"
    # img_save1 = "D:/20210308/camera/181"
    # img_save2 = "D:/20210225/camera/182"
    # img_save3 = "D:/20210225/camera/183"
    # img_save4 = "D:/20210225/camera/184"
    if not os.path.exists(img_save1):
        os.makedirs(img_save1)
    # if not os.path.exists(img_save2):
    #     os.makedirs(img_save2)
    # if not os.path.exists(img_save3):
    #     os.makedirs(img_save3)
    # if not os.path.exists(img_save4):
    #     os.makedirs(img_save4)

    if cap1.isOpened():
        print('HIKVISION')

    idx_img = 0
    while True:

        time1 = cap1.get(cv2.CAP_PROP_POS_MSEC)

        print(time1)

        img1 = cap1.read()[1]
        if (img1 is None):
            print("ok")
            continue

        cv2.imwrite(img_save1 + '/' + str(idx_img) + '.jpg', img1)
        idx_img = idx_img + 1


        # key = cv2.waitKey(1)
        # if key == ord('s'):
        #     cv2.imwrite()
        #     cv2.imwrite(iimg_save1 + '/' + str(idx_img) + '.jpg', img1mg_save2 + '/' + str(idx_img) + '.jpg', img2)
        #     cv2.imwrite(img_save3 + '/' + str(idx_img) + '.jpg', img3)
        #     cv2.imwrite(img_save4 + '/' + str(idx_img) + '.jpg', img4)
        #     idx_img += 1

        img1 = cv2.resize(img1, (int(1920 / 4), int(1080 / 4)))

        cv2.imshow('1', img1)
        cv2.waitKey(1)


if __name__ == '__main__':

    # get_biaoding()
    # get_img()

    run_multi_camera()
相关推荐
沪漂阿龙2 小时前
LangChain 系列之 Messages:为什么大模型对话不是简单字符串?
人工智能·深度学习·langchain
DXM05212 小时前
第13期|遥感语义分割模型:U-Net核心原理+遥感落地优势
人工智能·python·深度学习·目标检测·随机森林·机器学习·支持向量机
叫我:松哥3 小时前
基于Python的共享单车租赁数据分析与预测系统,技术栈flask+boostrap+随机森林+XGBoost
人工智能·python·深度学习·算法·随机森林·数据分析·flask
王小王-1234 小时前
基于深度学习的个性化音乐推荐系统的设计与开发
人工智能·深度学习·mysql·vue·推荐算法·个性化音乐推荐系统·音乐预测
ʜᴇɴʀʏ4 小时前
SSVOD 基础知识
人工智能·目标检测·计算机视觉
现代野蛮人4 小时前
【深度学习】 —— 几种优化器对比实验
人工智能·深度学习·分类·tensorflow
AI浩4 小时前
用于无人机目标检测的三模态融合 Transformer
目标检测·transformer·无人机
YOLO视觉与编程4 小时前
jetson orin nano烧录jetpack7.2系统
人工智能·深度学习·yolo·目标检测·机器学习
DeniuHe4 小时前
什么是嵌入空间?听起来高大上,其实。。。
深度学习
qq_291579255 小时前
电商主图优化实战指南:AI工具如何提升点击率与转化率
大数据·人工智能·深度学习