import os import threading from datetime import datetime import cv2 import time def capture_camera_images(rtsp_url, save_dir, camera_name, img_count=10, interval=0.5, reverse=False): """ 从RTSP摄像头抓取指定数量图片并保存 :param rtsp_url: 摄像头RTSP地址 :param save_dir: 保存目录 :param camera_name: 摄像头名称(用于文件名区分) :param img_count: 抓取图片数量 :param interval: 抓取间隔(秒) :param reverse: 是否翻转180 """ # 创建摄像头专属保存目录 camera_save_dir = os.path.join(save_dir, camera_name) if not os.path.exists(camera_save_dir): os.makedirs(camera_save_dir) # 抓取并保存图片 for i in range(img_count): cap = None try: # 打开RTSP流 cap = cv2.VideoCapture(rtsp_url, cv2.CAP_FFMPEG) if not cap.isOpened(): continue cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) ret, frame = cap.read() if reverse: # 镜像翻转 frame = cv2.flip(frame, -1) if ret and frame is not None: img_filename = f"{camera_name}_{datetime.now().strftime('%Y%m%d%H%M%S')}_{i+1}.jpg" img_path = os.path.join(camera_save_dir, img_filename) cv2.imwrite(img_path, frame) time.sleep(interval) except Exception as e: print(f"⚠ 摄像头 {camera_name} 第 {i+1} 次截图异常:{e},跳过") finally: if cap is not None and cap.isOpened(): cap.release() print(f"✅ 摄像头 {camera_name} 完成,共保存 {img_count} 张浇筑满的图片") def save_camera_picture(save_dir="full_images", img_count=15, interval=1.5, camera_60_rtsp=None, camera_61_rtsp=None): """ 执行摄像头截图保存: 1. 创建以时间戳命名的目录,统一存放日志和图片 2. 抓取60和61摄像头各img_count张图片 :param save_dir: 保存浇筑满图片的顶级目录 :param img_count: 每次浇筑满, 保存的图片的总数量 :param interval: 保存两张浇筑满图片之间的时间间隔 """ # 0. 先创建上级目录save_dir(若不存在) if not os.path.exists(save_dir): os.makedirs(save_dir) # 1. 创建保存浇筑满图片的根目录 root_dir = f"{save_dir}/PourFull_{datetime.now().strftime('%Y%m%d%H%M%S')}" if not os.path.exists(root_dir): os.makedirs(root_dir) # 2. 抓取两个摄像头的图片 if camera_60_rtsp is None: camera_60_rtsp = "rtsp://admin:XJ123456@192.168.250.60:554/streaming/channels/101" if camera_61_rtsp is None: camera_61_rtsp = "rtsp://admin:XJ123456@192.168.250.61:554/streaming/channels/101" # 并行抓取 t1 = threading.Thread( target=capture_camera_images, args=(camera_60_rtsp, root_dir, "camera60", img_count, interval, False), daemon=True ) t2 = threading.Thread( target=capture_camera_images, args=(camera_61_rtsp, root_dir, "camera61", img_count, interval, True), daemon=True ) t1.start() t2.start() return root_dir