Python实现指定区域桌面变化监控并报警

这篇具有很好参考价值的文章主要介绍了Python实现指定区域桌面变化监控并报警。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

实现效果

运行程序后可以看到一个菜单界面
Python实现指定区域桌面变化监控并报警,python,pygame,开发语言
点击开始识别按钮后可以选择你想要监控的区域
Python实现指定区域桌面变化监控并报警,python,pygame,开发语言
如图所示红色部分是点击开始按钮后拖动鼠标会显示的选择范围框,选择好区域后就开始识别该区域前后5秒内的变化。
程序还可以切换模式,可以监控摄像头画面的视频是否有变化,有变化也会报警。
程序运行后
Python实现指定区域桌面变化监控并报警,python,pygame,开发语言

准备工作

在开始之前,确保你已经安装了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, ImageTk

start_x, start_y, end_x, end_y = None, None, None, None

def select_screen_region():
    global start_x, start_y, end_x, end_y

    def on_press(event):
        global start_x, start_y
        start_x, start_y = event.x, event.y

    def on_move(event):
        global end_x, end_y
        end_x, end_y = event.x, event.y
        canvas.coords(rect, start_x, start_y, end_x, end_y)

    def on_release(event):
        global end_x, end_y
        end_x, end_y = event.x, event.y
        canvas.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, None

def monitor(data_source):
    global should_exit, is_alarm, prev_frame_image, current_frame_image

    if 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 = None
        if 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.95
            if similarity < threshold and not is_alarm:
                print("检测到较大变化,进行报警!")
                is_alarm = True
                play_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_frame

        time.sleep(5)  # 等待5秒后再获取下一帧

    # 释放资源
    if data_source == "camera":
        cap.release()
    cv2.destroyAllWindows()

def start_recognition():
    global should_exit
    should_exit = False
    print("开始监控")
    th_monitor = threading.Thread(target=monitor, args=("screenshot",))
    th_monitor.daemon = True
    th_monitor.start()

def end_program():
    global should_exit
    should_exit = True
    print("结束程序")
    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项目!文章来源地址https://www.toymoban.com/news/detail-612278.html

到了这里,关于Python实现指定区域桌面变化监控并报警的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python实现监控指定进程的CPU利用率、内存占用

            因为需要一直关注被测软件的CPU利用率和内存占用,人工记录十分麻烦,所以想做一个应用程序来代替手工记录。 思路: 1.弹窗,输入进程号 2.获取进程对象 3.日志保存在一个csv文件中,文件命名方式为:进程名+Process+进程号 4.文件第一行写入进程名,第二行表

    2023年04月12日
    浏览(46)
  • Python-openpyxl-在Excel表格指定区域写入指定数据

    重点1:指定值要写成列表list形式,一行一个list,区域为一个大list; 重点2:定义的函数可以将Values按指定区域传入,在函数参数中指定起始行号和列号,即可通过函数遍历所有取值,得到该区域。

    2024年03月08日
    浏览(73)
  • Open3D 点云分割之区域生长(Python版本,指定种子点)

    点云分割作为许多应用的前提,其直接会关乎到后续利用点云数据进行曲面重建、特征提取等处理的效果。区域生长算法做为一种较为经典的聚类分割算法,具有很广泛的应用,算法过程如下所述: 1、首先将按照每个点的曲率值由小到大进行排序。 2、选择曲率值最小的那个

    2024年02月03日
    浏览(41)
  • Prometheus实现系统监控报警邮件

    Prometheus将数据采集和报警分成了两个模块。报警规则配置在Prometheus Servers上, 然后发送报警信息到AlertManger,然后我们的AlertManager就来管理这些报警信息,聚合报警信息过后通过email、PagerDuty、HipChat、Slack 等方式发送消息提示。本文演示通过email发送告警信息。 中文技术文档

    2024年02月14日
    浏览(40)
  • (保姆级)服务器-Zabbix6.0使用Python脚本实现带图片的邮箱的报警

    近期在琢磨Zabbix邮箱报警的功能,但是网上的教程通常是4.0或5.0版本Zabbix,并使用Python2.7环境,运行在新版本Zabbix6.0上有颇多问题,为此我基于原先教程修改基于Zabbix6.0并使用Python3+的解决方案。期间遇到不少坑,特此分享。 Zabbix是自带的邮箱的报警功能有限,比如不能实现诸

    2024年01月24日
    浏览(45)
  • 【华为OD机试】数据单元的变化替换(Java&Python&C++&JS实现)

    本文收录于专栏:算法之翼 本专栏所有题目均包含优质解题思路,高质量解题代码(JavaPythonC++JS分别实现),详细代码讲解,助你深入学习,深度掌握!

    2024年04月08日
    浏览(64)
  • 使用Python实现Open3D区域生长分割算法

    Open3D是一个用于三维数据处理的先进工具包,拥有丰富的函数和类来处理点云、网格等各种三维数据。而区域生长分割是一种普遍使用的方法,用于将点云分成不同的部分,以便进行后续处理。 本文将详细介绍如何使用Python编写Open3D区域生长分割算法,并给出完整代码和运行

    2024年02月10日
    浏览(53)
  • 基于RAM树莓派实现智能家居:语音识别控制,Socket网络控制,火灾报警检测,实时监控

    目录 一   项目说明 ①   设计框架 ②   功能说明 ③   硬件说明 ④   软件说明 二   项目代码 1 mainPro.c 主函数 2 InputCommand.h 控制设备头文件 3 contrlDevices.h 外接设备头文件 4 bathroomLight.c 泳池灯 5 livingroomLight.c 卧室灯 6 restaurantLight.c 餐厅灯 7 upstairLight.c 二楼灯 8 fire.c 火焰

    2024年02月02日
    浏览(59)
  • 基于ARM树莓派实现智能家居:语音识别控制,Socket网络控制,火灾报警检测,实时监控

    目录 一   项目说明 ①   设计框架 ②   功能说明 ③   硬件说明 ④   软件说明 二   项目代码 1 mainPro.c 主函数 2 InputCommand.h 控制设备头文件 3 contrlDevices.h 外接设备头文件 4 bathroomLight.c 泳池灯 5 livingroomLight.c 卧室灯 6 restaurantLight.c 餐厅灯 7 upstairLight.c 二楼灯 8 fire.c 火焰

    2024年02月03日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包