摄像头监视脚本
摄像头监视脚本,若检测到摄像头画面有变化,保存这一段视频
一、使用方法
1.运行脚本
默认参数Threshold=3, Period=3, path=./recordings
python cam.py --threshold=30 --period=3 --path=./recordings
2.参数说明
threshold:摄像头捕获到的画面变化量阈值,阈值越小越敏感
period:摄像头捕获周期,单位秒
path:捕获图片保存路径
import cv2
import numpy as np
import time
import argparse
import osdef detect_motion(img1, img2, threshold=25):"""检测两帧之间的变化区域: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, iterations=2)thresh = cv2.erode(thresh, kernel, iterations=1)# 找到轮廓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(period=3, video_duration=5):"""监视程序入口:param period: 检查周期(秒):param video_duration: 录制视频长度(秒)"""print(f'监视器启动!\nParams:\nThreshold={args.threshold}, Period={period}, Save Path={args.path}')# 构建RTSP URLrtsp_url = f'rtsp://{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, f'motion_{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', type=int, default=3, help='移动侦测阈值')
parser.add_argument('--period', type=int, default=1, help='监控周期(秒)')
parser.add_argument('--path', type=str, default='./recordings', help='保存录制文件的路径')# 添加RTSP相关参数
parser.add_argument('--ip', type=str, default='192.168.11.23', help='摄像机的 IP 地址')
parser.add_argument('--port', type=str, default='554', help='RTSP 端口(默认值:554)')
parser.add_argument('--username', type=str, default='admin', help='RTSP 用户名')
parser.add_argument('--password', type=str, default='admin123', help='RTSP 密码')
parser.add_argument('--channel', type=str, default='/cam/realmonitor?channel=1&subtype=1', help='RTSP 通道或流路径')args = parser.parse_args()# 确保存储目录存在
if not os.path.exists(args.path):os.makedirs(args.path)if __name__ == '__main__':try:camera_monitor(period=args.period)except KeyboardInterrupt:print("\n用户停止的监控")finally:cv2.destroyAllWindows()相关文章:
摄像头监视脚本
摄像头监视脚本,若检测到摄像头画面有变化,保存这一段视频 一、使用方法 1.运行脚本 默认参数Threshold3, Period3, path./recordings python cam.py --threshold30 --period3 --path./recordings 2.参数说明 threshold:摄像头捕获到的画面变化量阈值…...
FreeRTOS的内存管理(选择heap4.c文件的理由)
目录 1. 了解FreeRTOS内存管理 2. 了解内存碎片 3.了解各个heap.c的内存分配方法 1.heap1.c 2.heap2.c 3.heap3.c 4.heap4.c 5.heap5.c 总结: 内存管理是一个系统基本组成部分,FreeRTOS 中大量使用到了内存管理,比如创建任务、信号量…...
SQL-leetcode-183. 从不订购的客户
183. 从不订购的客户 Customers 表: -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | -------------------- 在 SQL 中,id 是该表的主键。 该表的每一行都表示客户的 ID 和名称。 Orders 表&#…...
苹果系统MacOS下ObjectC建立的App程序访问opencv加载图片程序
前言 苹果系统下使用opencv感觉还是有些不太方便,总是感觉有点受到限制。本博客描述的是在MacOS下建立App程序然后调用opencv显示图片时出现的一些问题并最后解决的一个过程。 一、程序的建立 选择程序的类型: 选择界面模式和编程语言: 其余…...
《代码随想录》Day21打卡!
写在前面:祝大家新年快乐!!!2025年快乐,2024年拜拜~~~ 《代码随想录》二叉树:修剪二叉搜索树 本题的完整题目如下: 本题的完整思路如下: 1.本题使用递归进行求解,所以分…...
Dell服务器升级ubuntu 22.04失败解决
ubuntu系统原版本20.04,服务器dell T40. 执行apt update后,再执行apt upgrade。 apt update执行成功,但apt upgrade执行中断,提示如下: Checking package manager Reading package lists... Done Building dependen…...
构建全志 T113 Tina SDK
1、环境配置: 准备一个 Ubuntu 系统,可以是 WSL,虚拟机等,建议版本是 20.04。 1.1、安装必要的软件 进入系统后,输入下方命令安装需要的工具 : sudo apt update -y sudo apt full-upgrade -y sudo apt i…...
(推荐)【通用业务分发架构】1.业务分发 2.rpc调用 3.Event事件系统
一.Reflections和SpringUtil完成扫描包的(反射缓存) 二.id与class的映射泛型上下文(玩家是否登录,rpc调用SeqId,class类名)反射调用 1.netty层的 AccountMsgParam // 登录前 OnlineMsgParam // 登录后 SceneMsgParam // 发到场景层的 2.跨进程rpc调用的…...
最近的一些事情
正义不会缺席 这家公司违法辞退不给工资乱开离职证明。严重影响个人发展。 今天终于收到法院的判决书。 警醒自身发展与社会之间密切交流,敲响警钟。 虽然最终得到的法院的支持,但过程举步维艰。 这其中的过程,也让我对律师、法院和中国…...
CP AUTOSAR标准之FlexRayDriver(AUTOSAR_SWS_FlexRayDriver)(更新中……)
1 简介和功能概述 FlexRay驱动程序(Fr)抽象了特定FlexRay通信控制器(CC)的硬件相关实现细节。本规范主要依赖于符合FlexRay规范[13]的FlexRay CC。此外,本规范还支持符合FlexRay规范[14]的旧版FlexRay控制器。本SWS中因支持的FlexRay规范不同而导致的不同行为在适用的情况下以…...
Cesium 实战 27 - 三维视频融合(视频投影)
Cesium 实战 27 - 三维视频融合(视频投影) 核心代码完整代码在线示例在 Cesium 中有几种展示视频的方式,比如墙体使用视频材质,还有地面多边形使用视频材质,都可以实现视频功能。 但是随着摄像头和无人机的流行,需要视频和场景深度融合,简单的实现方式则不能满足需求。…...
GraphRAG实践:docker部署neo4j
概述 随着图数据库(Graph Database)的流行,越来越多的应用场景开始采用图数据库来处理复杂的关系数据。Neo4j作为领先的图数据库之一,提供了强大的图形查询语言Cypher、高效的存储结构和丰富的生态系统,使得它成为开发…...
常用的数据库类型都有哪些
在Java开发和信息系统架构中,数据库扮演着存储和管理数据的关键角色。数据库种类繁多,各有特色,适用于不同的应用场景。 1. 关系型数据库(RDBMS): • 关系型数据库是最为人熟知的数据库类型,数据…...
swiftui开发页面加载发送请求初始化@State变量
在SwiftUI中,你不能直接在init中更新State变量,因为State是由SwiftUI框架管理的,初始化时不允许直接修改。所以需要在onAppear发送请求然后修改State状态。 在SwiftUI中,如果希望在页面加载时立即发送网络请求,可以使…...
Ribbon和Eureka的集成
Ribbon和Eureka的集成是Spring Cloud Netflix生态系统的一部分,通常用于微服务架构中,以实现客户端负载均衡和服务发现。以下是更详细的集成步骤: 1. 引入依赖 在你的Spring Boot项目的pom.xml文件中添加Eureka客户端和Ribbon的依赖&#x…...
关于UE加载osgb数据的研究(一)
最近关于倾斜数据在UE中加载显示的问题,直接转换格式本地加载的方式避免了数据延迟加载、缓存加载,动态刷新等问题,但是也暴露了突出的问题:常规的模型格式会丢失掉倾斜数据的lod,致使效果缺失。 故而需要深入研究一下UE加载osgb数据的方式方法。 首先,我们需得学习一下…...
探索数据之美,Plotly引领可视化新风尚
在数据如潮的今天,如何精准捕捉信息的脉搏,让数据说话?Plotly,这款强大的数据可视化工具,正以其卓越的性能和丰富的功能,成为数据分析师、科学家及工程师们的得力助手。 Plotly不仅仅是一个绘图库…...
List排序的方法
List 排序方法: 1. list 的 sort() package com.example.a; import java.util.ArrayList; import java.util.Comparator; import java.util.List; class User{private Integer score;private Integer age;public User(Integer score, Integer age){super();this.…...
BurstAttention:高效的分布式注意力计算框架
BurstAttention:高效的分布式注意力计算框架 在现代大型语言模型(LLMs)的应用中,提升注意力机制的计算效率已成为研究的热点。当前,提升计算效率主要有两种方法:一种是优化单设备的计算和存储能力…...
大数据治理:构建稳健的数据生态系统
引言 随着信息技术的迅猛发展,企业每天都在生成海量的数据。这些数据不仅来自传统的业务交易系统,还包括社交媒体、物联网设备、移动应用程序等多个渠道。大数据治理旨在确保组织能够有效地管理其拥有的所有数据资产,以支持决策制定、优化业…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
