python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python桌面变化监控并报警

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

作者:会写代码的青蛙

在这篇博客中,我们将使用Python编程语言和一些常用的库来实现一个简单的区域监控和变化报警系统,文中有详细的代码示例供大家参考,需要的朋友可以参考下

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

实现效果

运行程序后可以看到一个菜单界面

点击开始识别按钮后可以选择你想要监控的区域

如图所示红色部分是点击开始按钮后拖动鼠标会显示的选择范围框,选择好区域后就开始识别该区域前后5秒内的变化。
程序还可以切换模式,可以监控摄像头画面的视频是否有变化,有变化也会报警。
程序运行后

准备工作

在开始之前,确保你已经安装了Python以及以下所需的库:

你可以使用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项目!

到此这篇关于Python实现指定区域桌面变化监控并报警的文章就介绍到这了,更多相关Python桌面变化监控并报警内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文