电子销售网站模板免费下载,王野发动机怎么样,宿迁网站建设介绍公司,建设部网站公示摄像头监视脚本#xff0c;若检测到摄像头画面有变化#xff0c;保存这一段视频
一、使用方法
1.运行脚本 默认参数Threshold3, Period3, path./recordings
python cam.py --threshold30 --period3 --path./recordings 2.参数说明 threshold:摄像头捕获到的画面变化量阈值…摄像头监视脚本若检测到摄像头画面有变化保存这一段视频
一、使用方法
1.运行脚本 默认参数Threshold3, Period3, path./recordings
python cam.py --threshold30 --period3 --path./recordings 2.参数说明 threshold:摄像头捕获到的画面变化量阈值阈值越小越敏感 period:摄像头捕获周期单位秒 path:捕获图片保存路径 import cv2
import numpy as np
import time
import argparse
import osdef detect_motion(img1, img2, threshold25):检测两帧之间的变化区域:param img1: 当前帧:param img2: 上一帧:param threshold: 像素差异阈值:return: 变化区域掩码和是否检测到变化# 转换为灰度图gray1 cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)gray2 cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)# 计算差异frame_diff cv2.absdiff(gray1, gray2)# 应用阈值_, thresh cv2.threshold(frame_diff, threshold, 255, cv2.THRESH_BINARY)# 应用形态学操作去噪kernel np.ones((5, 5), np.uint8)thresh cv2.dilate(thresh, kernel, iterations2)thresh cv2.erode(thresh, kernel, iterations1)# 找到轮廓contours, _ cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 判断是否检测到显著变化has_motion Falsemin_area 500 # 最小变化区域面积for contour in contours:if cv2.contourArea(contour) min_area:has_motion Truebreakreturn thresh, has_motiondef camera_monitor(period3, video_duration5):监视程序入口:param period: 检查周期秒:param video_duration: 录制视频长度秒print(f监视器启动!\nParams:\nThreshold{args.threshold}, Period{period}, Save Path{args.path})# 构建RTSP URLrtsp_url frtsp://{args.username}:{args.password}{args.ip}:{args.port}{args.channel}print(f连接到 RTSP 流: {rtsp_url})# 设置RTSP连接cap cv2.VideoCapture(rtsp_url)# 设置RTSP缓冲区大小cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)if not cap.isOpened():print(错误无法连接到 RTSP 流)return# 获取视频参数frame_width int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))frame_height int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))fps 20.0# 读取第一帧_, last_frame cap.read()while True:ret, current_frame cap.read()if not ret:print(错误无法读取帧)break# 检测变化motion_mask, has_motion detect_motion(current_frame, last_frame, args.threshold)if has_motion:print(检测到运动录制视频...)# 创建视频写入器修改为MP4格式timestamp time.strftime(%Y_%m_%d_%H_%M_%S, time.localtime())video_path os.path.join(args.path, fmotion_{timestamp}.mp4)# 使用H.264编码器if os.name nt: # Windows系统video_writer cv2.VideoWriter(video_path,cv2.VideoWriter_fourcc(*H264),fps,(frame_width, frame_height))else: # Linux/Mac系统video_writer cv2.VideoWriter(video_path,cv2.VideoWriter_fourcc(*avc1),fps,(frame_width, frame_height))# 记录检测到运动的时间点start_time time.time()# 录制视频片段while time.time() - start_time video_duration:ret, frame cap.read()if not ret:break# 标记变化区域motion_mask, _ detect_motion(frame, last_frame, args.threshold)contours, _ cv2.findContours(motion_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 在原图上画出变化区域frame_marked frame.copy()for contour in contours:if cv2.contourArea(contour) 500:cv2.drawContours(frame_marked, [contour], -1, (0, 255, 0), 2)video_writer.write(frame_marked)last_frame frame.copy()video_writer.release()print(f视频保存到: {video_path})last_frame current_frame.copy()time.sleep(period)cap.release()# 参数设置
parser argparse.ArgumentParser(description移动侦测摄像机监视器)
parser.add_argument(--threshold, typeint, default3, help移动侦测阈值)
parser.add_argument(--period, typeint, default1, help监控周期秒)
parser.add_argument(--path, typestr, default./recordings, help保存录制文件的路径)# 添加RTSP相关参数
parser.add_argument(--ip, typestr, default192.168.11.23, help摄像机的 IP 地址)
parser.add_argument(--port, typestr, default554, helpRTSP 端口默认值554)
parser.add_argument(--username, typestr, defaultadmin, helpRTSP 用户名)
parser.add_argument(--password, typestr, defaultadmin123, helpRTSP 密码)
parser.add_argument(--channel, typestr, default/cam/realmonitor?channel1subtype1, helpRTSP 通道或流路径)args parser.parse_args()# 确保存储目录存在
if not os.path.exists(args.path):os.makedirs(args.path)if __name__ __main__:try:camera_monitor(periodargs.period)except KeyboardInterrupt:print(\n用户停止的监控)finally:cv2.destroyAllWindows()