Python實(shí)現(xiàn)指定區(qū)域桌面變化監(jiān)控并報(bào)警
本文我們將使用Python編程語(yǔ)言和一些常用的庫(kù)來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的區(qū)域監(jiān)控和變化報(bào)警系統(tǒng)。我們將使用Tkinter庫(kù)創(chuàng)建一個(gè)圖形界面,允許用戶選擇監(jiān)控區(qū)域,并使用OpenCV庫(kù)進(jìn)行圖像處理和相似性比較,以檢測(cè)區(qū)域內(nèi)的變化,并通過(guò)播放聲音進(jìn)行報(bào)警。
實(shí)現(xiàn)效果
運(yùn)行程序后可以看到一個(gè)菜單界面
點(diǎn)擊開始識(shí)別按鈕后可以選擇你想要監(jiān)控的區(qū)域
如圖所示紅色部分是點(diǎn)擊開始按鈕后拖動(dòng)鼠標(biāo)會(huì)顯示的選擇范圍框,選擇好區(qū)域后就開始識(shí)別該區(qū)域前后5秒內(nèi)的變化。
程序還可以切換模式,可以監(jiān)控?cái)z像頭畫面的視頻是否有變化,有變化也會(huì)報(bào)警。
程序運(yùn)行后
準(zhǔn)備工作
在開始之前,確保你已經(jīng)安裝了Python以及以下所需的庫(kù):
- tkinter: 用于創(chuàng)建圖形界面
- numpy: 用于處理圖像數(shù)據(jù)
- cv2 (OpenCV): 用于圖像處理和相似性比較
- pyautogui: 用于截取屏幕圖像
- pygame: 用于播放聲音
- PIL (Python Imaging Library): 用于圖像處理
你可以使用pip命令來(lái)安裝這些庫(kù):
pip install tkinter numpy opencv-python pyautogui pygame pillow
選擇監(jiān)控區(qū)域
首先,讓我們創(chuàng)建一個(gè)函數(shù)來(lái)選擇監(jiān)控區(qū)域。我們使用Tkinter庫(kù)創(chuàng)建一個(gè)全屏的圖形窗口,讓用戶通過(guò)鼠標(biāo)點(diǎn)擊和拖拽來(lái)選擇監(jiān)控區(qū)域。我們將保存選定的區(qū)域的坐標(biāo)以供后續(xù)使用。
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("選擇監(jiān)控區(qū)域") 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()
調(diào)用select_screen_region()函數(shù)后,會(huì)彈出一個(gè)全屏的窗口,你可以通過(guò)鼠標(biāo)點(diǎn)擊和拖拽來(lái)選擇監(jiān)控區(qū)域。選定區(qū)域后,關(guān)閉窗口即可。
監(jiān)控區(qū)域變化
接下來(lái),我們將創(chuàng)建一個(gè)函數(shù)來(lái)監(jiān)控選定區(qū)域內(nèi)的變化。我們將使用OpenCV庫(kù)對(duì)圖像進(jìn)行處理,并使用相似性比較來(lái)檢測(cè)區(qū)域內(nèi)的變化。如果檢測(cè)到較大的變化,我們將播放聲音進(jìn)行報(bào)警。
import cv2 import numpy as np import threading # 初始化pygame庫(kù) pygame.init() pygame.mixer.init() # 全局變量,加載MP3文件 def load_alarm_sound(file_path): try: pygame.mixer.music.load(file_path) except pygame.error: print(f"無(wú)法加載音頻文件:{file_path}") # 封裝一個(gè)播放MP3警報(bào)的函數(shù) def play_alarm(): try: # 播放MP3文件 pygame.mixer.music.play() except pygame.error: print("播放警報(bào)音頻失敗") # 調(diào)用load_alarm_sound函數(shù),加載警報(bào)音頻 load_alarm_sound("警報(bào)聲.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("檢測(cè)到較大變化,進(jìn)行報(bào)警!") is_alarm = True play_alarm() # 保存變化前后的照片 prev_frame_image = prev_frame.copy() current_frame_image = current_frame.copy() # 在5秒后重置is_alarm標(biāo)志 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("開始監(jiān)控") 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("結(jié)束程序") sys.exit(1)
現(xiàn)在,我們已經(jīng)準(zhǔn)備好了選擇監(jiān)控區(qū)域和監(jiān)控區(qū)域變化的功能。你可以將它們集成到完整的應(yīng)用程序中,例如創(chuàng)建一個(gè)Tkinter界面,提供開始監(jiān)控和結(jié)束程序的按鈕。
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 # ... 在此添加上面的選擇監(jiān)控區(qū)域和監(jiān)控區(qū)域變化的函數(shù) ... # 創(chuàng)建主窗口 root = tk.Tk() root.title("區(qū)域監(jiān)控和變化報(bào)警") # 添加按鈕 btn_start = tk.Button(root, text="開始監(jiān)控", command=start_recognition) btn_end = tk.Button(root, text="結(jié)束程序", command=end_program) # 使用pack布局并設(shè)置side參數(shù)為L(zhǎng)EFT實(shí)現(xiàn)橫向排列 btn_start.pack(side=tk.LEFT, padx=10, pady=10) btn_end.pack(side=tk.LEFT, padx=10, pady=10) # 進(jìn)入事件循環(huán) root.mainloop()
這樣,我們就實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的區(qū)域監(jiān)控和變化報(bào)警系統(tǒng)。當(dāng)你點(diǎn)擊"開始監(jiān)控"按鈕后,可以選擇監(jiān)控區(qū)域,然后程序會(huì)持續(xù)監(jiān)測(cè)該區(qū)域的變化,并在檢測(cè)到較大變化時(shí)進(jìn)行報(bào)警。點(diǎn)擊"結(jié)束程序"按鈕后,程序?qū)⑼顺觥OM@篇博客對(duì)你有所幫助,歡迎探索更多有趣的Python項(xiàng)目!
到此這篇關(guān)于Python實(shí)現(xiàn)指定區(qū)域桌面變化監(jiān)控并報(bào)警的文章就介紹到這了,更多相關(guān)Python桌面變化監(jiān)控并報(bào)警內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python如何根據(jù)字幕文件自動(dòng)給視頻添加字幕效果
視頻中字幕的重要性不用多說(shuō)了,下面這篇文章主要給大家介紹了關(guān)于Python如何根據(jù)字幕文件自動(dòng)給視頻添加字幕效果的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02python3 設(shè)置多進(jìn)程名稱并在ps命令中可見(Centos7 系統(tǒng))
setproctitle 是一個(gè) Python 模塊,用于設(shè)置進(jìn)程標(biāo)題(process title),通過(guò)設(shè)置進(jìn)程標(biāo)題,可以讓進(jìn)程在系統(tǒng)級(jí)的進(jìn)程管理工具中展示自定義的名稱,方便用戶查看和管理進(jìn)程,本文介紹python3 設(shè)置多進(jìn)程名稱并在ps命令中可見,感興趣的朋友一起看看吧2024-03-03在Windows中安裝Spire.XLS?for?Python的操作指南
Spire.XLS?for?Python?是一款專業(yè)的?Python?Excel?庫(kù),可用于在各種?Python?應(yīng)用程序中讀取、創(chuàng)建、編輯和轉(zhuǎn)換?Excel?(.xls?&?.xlsx)?文件,本文將介紹如何在?Windows?中安裝?Spire.XLS?for?Python,需要的朋友可以參考下2025-02-02python正則表達(dá)式查找和替換內(nèi)容的實(shí)例詳解
在本篇文章里小編給大家整理的是一篇關(guān)于python正則表達(dá)式查找和替換內(nèi)容的實(shí)例詳解內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。2021-10-10Python調(diào)用百度AI實(shí)現(xiàn)圖片上表格識(shí)別功能
這篇文章主要給大家介紹了關(guān)于Python調(diào)用百度AI實(shí)現(xiàn)圖片上表格識(shí)別功能的相關(guān)資料,在Python環(huán)境下,利用百度AI開放平臺(tái)文字識(shí)別技術(shù),對(duì)表格類圖片進(jìn)行識(shí)別,需要的朋友可以參考下2021-09-09如何在django里上傳csv文件并進(jìn)行入庫(kù)處理的方法
這篇文章主要介紹了如何在django里上傳csv文件并進(jìn)行入庫(kù)處理的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01使用Python制作新型冠狀病毒實(shí)時(shí)疫情圖
最近被新型冠狀病毒搞的人心惶惶,很多城市被病毒感染,今天小編給大家分享使用Python制作新型冠狀病毒實(shí)時(shí)疫情圖,感興趣的朋友跟隨小編一起看看吧2020-01-01Python?encode()方法和decode()方法詳解
encode() 方法為字符串類型(str)提供的方法,用于將 str 類型轉(zhuǎn)換成 bytes 類型,這個(gè)過(guò)程也稱為“編碼”,這篇文章主要介紹了Python?encode()方法和decode()方法,需要的朋友可以參考下2022-12-12