Python实现指定区域桌面变化监控并报警
在这篇博客中,我们将使用Python编程语言和一些常用的库来实现一个简单的区域监控和变化报警系统。我们将使用Tkinter库创建一个图形界面,允许用户选择监控区域,并使用OpenCV库进行图像处理和相似性比较,以检测区域内的变化,并通过播放声音进行报警。
实现效果
运行程序后可以看到一个菜单界面
点击开始识别按钮后可以选择你想要监控的区域
如图所示红色部分是点击开始按钮后拖动鼠标会显示的选择范围框,选择好区域后就开始识别该区域前后5秒内的变化。
程序还可以切换模式,可以监控摄像头画面的视频是否有变化,有变化也会报警。
程序运行后
准备工作
在开始之前,确保你已经安装了Python以及以下所需的库:
- tkinter: 用于创建图形界面
- numpy: 用于处理图像数据
- cv2 (OpenCV): 用于图像处理和相似性比较
- pyautogui: 用于截取屏幕图像
- pygame: 用于播放声音
- PIL (Python Imaging Library): 用于图像处理
你可以使用pip命令来安装这些库:
pip install tkinter numpy opencv-python pyautogui pygame pillow
选择监控区域
首先,让我们创建一个函数来选择监控区域。我们使用Tkinter库创建一个全屏的图形窗口,让用户通过鼠标点击和拖拽来选择监控区域。我们将保存选定的区域的坐标以供后续使用。
import tkinter as tk
from PIL import Image, ImageTkstart_x, start_y, end_x, end_y = None, None, None, Nonedef select_screen_region():global start_x, start_y, end_x, end_ydef on_press(event):global start_x, start_ystart_x, start_y = event.x, event.ydef on_move(event):global end_x, end_yend_x, end_y = event.x, event.ycanvas.coords(rect, start_x, start_y, end_x, end_y)def on_release(event):global end_x, end_yend_x, end_y = event.x, event.ycanvas.coords(rect, start_x, start_y, end_x, end_y)root = tk.Tk()root.title("选择监控区域")root.attributes('-fullscreen', True)screenshot = pyautogui.screenshot()screenshot.save('desktop_screenshot.png', format='png')canvas = tk.Canvas(root, bg='white')canvas.pack(fill=tk.BOTH, expand=True)desktop_image = ImageTk.PhotoImage(file='desktop_screenshot.png')canvas.create_image(0, 0, anchor=tk.NW, image=desktop_image)rect = canvas.create_rectangle(0, 0, 0, 0, outline='red')canvas.bind("<ButtonPress-1>", on_press)canvas.bind("<B1-Motion>", on_move)canvas.bind("<ButtonRelease-1>", on_release)root.mainloop()
调用select_screen_region()函数后,会弹出一个全屏的窗口,你可以通过鼠标点击和拖拽来选择监控区域。选定区域后,关闭窗口即可。
监控区域变化
接下来,我们将创建一个函数来监控选定区域内的变化。我们将使用OpenCV库对图像进行处理,并使用相似性比较来检测区域内的变化。如果检测到较大的变化,我们将播放声音进行报警。
import cv2
import numpy as np
import threading# 初始化pygame库
pygame.init()
pygame.mixer.init()# 全局变量,加载MP3文件
def load_alarm_sound(file_path):try:pygame.mixer.music.load(file_path)except pygame.error:print(f"无法加载音频文件:{file_path}")# 封装一个播放MP3警报的函数
def play_alarm():try:# 播放MP3文件pygame.mixer.music.play()except pygame.error:print("播放警报音频失败")# 调用load_alarm_sound函数,加载警报音频
load_alarm_sound("警报声.mp3")should_exit = False
is_alarm = False
prev_frame_image, current_frame_image = None, Nonedef monitor(data_source):global should_exit, is_alarm, prev_frame_image, current_frame_imageif data_source == "screenshot":prev_frame = capture_screen()elif data_source == "camera":cap = cv2.VideoCapture(0)prev_frame = capture_video_frame(cap)while not should_exit:current_frame = Noneif data_source == "screenshot":current_frame = capture_screen()elif data_source == "camera":current_frame = capture_video_frame(cap)if current_frame is not None:prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY)current_gray = cv2.cvtColor(current_frame, cv2.COLOR_BGR2GRAY)similarity = ssim(prev_gray, current_gray)threshold = 0.95if similarity < threshold and not is_alarm:print("检测到较大变化,进行报警!")is_alarm = Trueplay_alarm()# 保存变化前后的照片prev_frame_image = prev_frame.copy()current_frame_image = current_frame.copy()# 在5秒后重置is_alarm标志threading.Timer(5, reset_alarm_flag).start()else:print("没有变化")# 更新前一帧图像prev_frame = current_frametime.sleep(5) # 等待5秒后再获取下一帧# 释放资源if data_source == "camera":cap.release()cv2.destroyAllWindows()def start_recognition():global should_exitshould_exit = Falseprint("开始监控")th_monitor = threading.Thread(target=monitor, args=("screenshot",))th_monitor.daemon = Trueth_monitor.start()def end_program():global should_exitshould_exit = Trueprint("结束程序")sys.exit(1)
现在,我们已经准备好了选择监控区域和监控区域变化的功能。你可以将它们集成到完整的应用程序中,例如创建一个Tkinter界面,提供开始监控和结束程序的按钮。
import sys
import tkinter as tk
import time
import cv2
import numpy as np
import pyautogui
import pygame
from skimage.metrics import structural_similarity as ssim
from PIL import Image, ImageTk# ... 在此添加上面的选择监控区域和监控区域变化的函数 ...# 创建主窗口
root = tk.Tk()
root.title("区域监控和变化报警")# 添加按钮
btn_start = tk.Button(root, text="开始监控", command=start_recognition)
btn_end = tk.Button(root, text="结束程序", command=end_program)# 使用pack布局并设置side参数为LEFT实现横向排列
btn_start.pack(side=tk.LEFT, padx=10, pady=10)
btn_end.pack(side=tk.LEFT, padx=10, pady=10)# 进入事件循环
root.mainloop()
这样,我们就实现了一个简单的区域监控和变化报警系统。当你点击"开始监控"按钮后,可以选择监控区域,然后程序会持续监测该区域的变化,并在检测到较大变化时进行报警。点击"结束程序"按钮后,程序将退出。希望这篇博客对你有所帮助,欢迎探索更多有趣的Python项目!
相关文章:

Python实现指定区域桌面变化监控并报警
在这篇博客中,我们将使用Python编程语言和一些常用的库来实现一个简单的区域监控和变化报警系统。我们将使用Tkinter库创建一个图形界面,允许用户选择监控区域,并使用OpenCV库进行图像处理和相似性比较,以检测区域内的变化&#x…...

【数据结构】实验五:栈
实验五 栈 一、实验目的与要求 1)熟悉栈的类型定义和基本操作; 2)灵活应用栈解决具体应用问题。 二、实验内容 1、判断回文数,回文是指正读反读均相同的字符序列,如“1221”和“12321”均是回文,但“…...

⚡️⚡️Java多线程编程的高效、安全实践
⚡️ Java多线程编程的高效、安全实践⚡️ ☀️ 1 摘要☀️2 多线程编程基础☀️ 3 线程同步与互斥☀️ 4 并发集合类与原子操作☀️ 5 线程池与执行器框架☀️ 6 并发编程的最佳实践🌄 7 总结 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客…...

【云原生】Docker私有仓库registry
目录 1)用docker容器运行registry私有仓库服务。 2)运行私有仓库服务 3)镜像重命名(要上传的镜像名需要注明私仓的ip) 4)编辑docker配置文件(因为默认是拉取docker官方的镜像,需要重新指定) 5)其他dock…...

第十四届蓝桥杯大赛青少年省赛C++组试题真题 2023年5月
一、选择题 第 1 题 单选题 C中,bool类型的变量占用字节数为 ( )。 A. 1 B. 2 C. 3 D. 4 第 2 题 单选题 以下关于C结构体的说法,正确的是 ( )。 A. 结构体中只能包含成员变量,不能包含成员函数 B. 结构体不能从另一个结构体继承 …...

GAN论文精读
标题:Generative Adversarial Nets 摘要: 简写:作者提出了一个framework通过一个对抗的过程,在这里面会同时训练两个模型。 第一个模型为生成模型G,是用来抓住整个数据的分布 第二个模型为辨别模型D,是用来估计一个样本是否从G中产生。 …...
数据结构:计数排序(详解)
思路详解: 1 找到数组中的最大值、最小值 2 开辟一个统计每个数据出现次数的数组(总个数是最大值-最小值1,因为下标范围是0~最大值-最小值,闭区间统计个数要1) 3 遇到一个元素,在此元素-最小值作为下标的…...

1 请使用js、css、html技术实现以下页面,表格内容根据查询条件动态变化。
1.1 创建css文件,用于编辑style 注意: 1.背景颜色用ppt的取色器来获取: 先点击ppt的形状轮廓,然后点击取色器,吸颜色,然后再点击形状轮廓的其他轮廓颜色,即可获取到对应颜色。 2.表格间的灰色线…...

react-native项目安卓版本升级 compileSdkVersion 29->31
因为 react-native-ble-manager添加过程及碰到的问题 依赖 https://github.com/innoveit/react-native-ble-manager 参考:https://blog.csdn.net/withings/article/details/71378562 iOS 按react-native-ble-manager 文档在 【Info.plist】加了key之后能正常使用…...

【学习笔记】目标跟踪领域SOTA方法比较
目录 前言方法1 TraDeS:2 FairMOT:3 SMILEtrack:4 ByteTrack: 前言 常用于行人跟踪的多目标跟踪数据集包括:MOT 15/16/17/20、PersonPath22等… 为更好比较现有SOTA算法的检测性能,本博客将针对在各数据集上表现较优的算法模型进行介绍。(表…...

机器学习 深度学习编程笔记
sigmoid函数 def sigmoid(x):return 1.0 / (1np.exp((-x)))定义最小平方和损失函数 loss torch.nn.MSELoss()线性回归编程 如果不加噪音就成了正常的线性函数了,所以要加噪音。 torch.normal(0, 0.01, y.shape)torch.normal(0, 0.01, y.shape)是一个用于生成服从…...

18.背景轮播
背景轮播 html部分 <div class"container"><div class"slide active" style"background-image: url(./static/20180529205331_yhGyf.jpeg);"></div><div class"slide " style"background-image: url(./s…...

论文代码学习—HiFi-GAN(2)——鉴别器discriminator代码
文章目录 引言正文鉴别器多周期鉴定器多尺度鉴定器问题 总结 引言 这里翻译了HiFi-GAN这篇论文的具体内容,具体链接。这篇文章还是学到了很多东西,从整体上说,学到了生成对抗网络的构建思路,包括生成器和鉴定器。细化到具体实现的…...
Linux Shell 脚本编程学习之【第3章 正则表达式 (第二部分) grep命令】
第3章 正则表达式 (第二部分) 4 grep命令4.1 基本用法4.2 参考命令4.2.1 双引号4.2.2 -c 输出匹配行数4.2.3 -h 或 -l 不显示或只显示文件名4.2.4 -s 不显示错误信息4.2.5 -r 递归显示本级目录及下级目录4.2.6 -w 匹配完整词 -x 匹配完整行4.2.7 -q 退出…...

大语言模型LLM
目录 一、语言模型的发展 语言模型(Language Model,LM)目标是建模自然语言的概率分布,具体目标是构建词序列w1,w2,...,wm的概率分布,即计算给定的词序列作为一个句子出现可能的大小P(w1w2...wm)。但联合概率P的参数量…...

自学网络安全(黑客)的误区
前言 网络安全入门到底是先学编程还是先学计算机基础?这是一个争议比较大的问题,有的人会建议先学编程,而有的人会建议先学计算机基础,其实这都是要学的。而且这些对学习网络安全来说非常重要。 一、网络安全学习的误区 1.不要…...

@Conditional
Conditional Conditional 是 spring framework 中提供的一个条件注解,,满足条件就注入,不满足就不注入ioc Condtional 需要和 Condition接口 一起用: 返回true注入,返回false不注入,, 里面有一…...

【Linux】网络基础之TCP协议
目录 🌈前言🌸1、基本概念🌺2、TCP协议报文结构🍨2.1、源端口号和目的端口号🍩2.2、4位首部长度🍪2.3、32位序号和确认序号(重点)🍫2.4、16位窗口大小🍬2.5、…...
Java设计模式之装饰器(Decorator)模式
装饰器(Decorator)设计模式允许动态地将新功能添加到对象中,同时又不改变其结构。 什么是装饰器模式 装饰器(Decorator)模式通过将对象进行包装,以扩展其功能,而不需要修改其原始类。装饰器模…...
element ui树组件render-content 树节点的内容区的渲染另一种方式
直接上代码吧,不用h的写法。 <el-tree :data"data" node-key"id" default-expand-all :expand-on-click-node"false" :props"defaultProps":render-content"renderContentTree" node-click"handleNodeClick"&g…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...

【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...