网站建设技术人员招聘,wordpress淘客主题,wordpress p,链接生成器在这篇博客中#xff0c;我们将使用Python编程语言和一些常用的库来实现一个简单的区域监控和变化报警系统。我们将使用Tkinter库创建一个图形界面#xff0c;允许用户选择监控区域#xff0c;并使用OpenCV库进行图像处理和相似性比较#xff0c;以检测区域内的变化#x…在这篇博客中我们将使用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, formatpng)canvas tk.Canvas(root, bgwhite)canvas.pack(filltk.BOTH, expandTrue)desktop_image ImageTk.PhotoImage(filedesktop_screenshot.png)canvas.create_image(0, 0, anchortk.NW, imagedesktop_image)rect canvas.create_rectangle(0, 0, 0, 0, outlinered)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(targetmonitor, 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开始监控, commandstart_recognition)
btn_end tk.Button(root, text结束程序, commandend_program)# 使用pack布局并设置side参数为LEFT实现横向排列
btn_start.pack(sidetk.LEFT, padx10, pady10)
btn_end.pack(sidetk.LEFT, padx10, pady10)# 进入事件循环
root.mainloop()
这样我们就实现了一个简单的区域监控和变化报警系统。当你点击开始监控按钮后可以选择监控区域然后程序会持续监测该区域的变化并在检测到较大变化时进行报警。点击结束程序按钮后程序将退出。希望这篇博客对你有所帮助欢迎探索更多有趣的Python项目