87 lines
3.2 KiB
Python
87 lines
3.2 KiB
Python
|
|
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
|