屏幕数字监控 + 警报

解析:定时截取屏幕指定区域的图像,通过 OCR 识别数字,当识别到的数字≥30 时播放警报声

代码:

复制代码
import pytesseract
from PIL import ImageGrab
import cv2,pygame,time
import numpy as np


pygame.mixer.init()
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

def get_result(zuobiao = None):
    # 截取屏幕特定区域
    screenshot = ImageGrab.grab(zuobiao)
    # screenshot.save("aa.png")
    # 预处理图像
    gray = cv2.cvtColor(np.array(screenshot), cv2.COLOR_BGR2GRAY)
    _, thresh = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY_INV)

    # 保存处理后的图像
    cv2.imwrite("save_path.png", thresh)
    # 使用 Tesseract 识别
    text = pytesseract.image_to_string(thresh, config='--oem 3 --psm 6 outputbase digits')
    # print(f"识别结果: {text}")
    return text



error_num = 0
num = 1
while True:
    print(f"----------------------\n第{num}次检查中....")
    num+=1
    zb = (832, 243, 908, 952)
    re = get_result(zb).strip("\n").replace("-","").split("\n")
    # print(re)
    if "." not in re[-1]:pass
    else:
        try:
            a = float(re[-1])
            print(a)
            if a>=30:
                print("到达预警值,开始播放警报声.........")
                pygame.mixer.init()
                pygame.mixer.music.load("警报1.mp3")
                pygame.mixer.music.play(-1)
                input()
                pygame.mixer.music.stop()
                break
            else:
                print("安全范围!!")
        except Exception as e:
            print(e)
            error_num+=1
            if error_num == 10:
                break
    time.sleep(3)
  1. 导入依赖库
  • pytesseract:调用 Tesseract OCR 引擎,实现图像文字识别(重点识别数字);
  • PIL.ImageGrab/Image:PIL 库的截图、图像处理功能,ImageGrab.grab()用于截取屏幕;
  • cv2:OpenCV 库,用于图像预处理(灰度化、二值化);
  • pygame:主要用于播放音频(警报声);
  • time:实现定时等待(每次检查间隔 3 秒);
  • numpy:数组处理,OpenCV 处理图像依赖 NumPy 数组格式。
2. 初始化配置
复制代码
pygame.mixer.init()
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
  • pygame.mixer.init():初始化 pygame 的音频播放模块,为后续播放警报声做准备;
  • pytesseract.pytesseract.tesseract_cmd:指定 Tesseract OCR 的安装路径(必须配置,否则会找不到引擎)。
3. 核心函数:截图 + 预处理 + OCR 识别
复制代码
def get_result(zuobiao = None):
    # 截取屏幕特定区域
    screenshot = ImageGrab.grab(zuobiao)
    # screenshot.save("aa.png")  # 注释掉的保存原始截图代码,用于调试
    
    # 预处理图像(提升识别准确率)
    gray = cv2.cvtColor(np.array(screenshot), cv2.COLOR_BGR2GRAY)  # 彩色转灰度图
    _, thresh = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY_INV)  # 反相二值化
    
    # 保存处理后的图像(用于调试,查看预处理效果)
    cv2.imwrite("save_path.png", thresh)
    
    # 使用Tesseract识别数字
    text = pytesseract.image_to_string(thresh, config='--oem 3 --psm 6 outputbase digits')
    return text
  • 参数zuobiao :屏幕截取区域的坐标,格式是(x1, y1, x2, y2),代表从左上角(x1,y1)到右下角(x2,y2)的矩形区域;
  • 图像预处理
    • np.array(screenshot):将 PIL 截图转为 OpenCV 支持的 NumPy 数组;
    • 灰度化 + 反相二值化:目的是把数字区域变成白色、背景变成黑色,大幅提升数字识别成功率;
  • OCR 识别配置
    • --oem 3:使用默认的 OCR 引擎模式(混合引擎,兼容性最好);
    • --psm 6:假设图像是单一均匀的文本块(适合数字识别);
    • outputbase digits:只识别数字(过滤所有字母、符号,只保留 0-9 和小数点);
  • 返回值:识别出的文本(主要是数字)。
  1. 主循环:监控逻辑
复制代码
error_num = 0
num = 1
while True:
    print(f"----------------------\n第{num}次检查中....")
    num+=1
    zb = (832, 243, 908, 952)
    re = get_result(zb).strip("\n").replace("-","").split("\n")
    # print(re)
    if "." not in re[-1]:pass
    else:
        try:
            a = float(re[-1])
            print(a)
            if a>=30:
                print("到达预警值,开始播放警报声.........")
                pygame.mixer.init()
                pygame.mixer.music.load("警报1.mp3")
                pygame.mixer.music.play(-1)
                input()
                pygame.mixer.music.stop()
                break
            else:
                print("安全范围!!")
        except Exception as e:
            print(e)
            error_num+=1
            if error_num == 10:
                break
    time.sleep(3)
  • 坐标zb = (832, 243, 908, 952):这是你要监控的屏幕区域,需要根据实际数字位置调整;
  • 结果处理re = ...
    • strip("\n"):去掉识别结果首尾的换行符;
    • replace("-",""):去掉识别结果中的短横线(防止-30这类带符号的数字干扰,或误识别的横线);
    • split("\n"):按换行符分割成列表(比如识别结果有多行时,取最后一行作为目标数字);
  • 异常处理 :如果识别结果不是数字(比如识别出乱码、空字符串),会触发float()转换异常,此时累计失败次数,达到 10 次就退出;
  • input()阻塞:触发警报后,程序会停在这一行,直到你按下回车键,才会停止警报并退出。

相关推荐
赏金术士8 小时前
Compose 教学项目
android·kotlin·compose
晓梦林8 小时前
ximai靶场学习笔记
android·笔记·学习
十六年开源服务商12 小时前
2026服务器配置优化与WordPress运维实战指南
android·运维·服务器
音视频牛哥14 小时前
大牛直播SDK(SmartMediaKit)Android平台Unity3D RTSP/RTMP播放器集成实践
android·unity3d·rtsp播放器·rtmp播放器·unity3d rtmp播放器·安卓unity rtsp播放器·安卓unity rtmp播放器
w1wi14 小时前
安卓抓包完全指南(一):从入门到 SSL Pinning 绕过
android·网络协议·ssl
aqi0016 小时前
一文理清 HarmonyOS 6.0.2 涵盖的十个升级点
android·华为·harmonyos·鸿蒙·harmony
赏金术士17 小时前
Jetpack Compose 状态提升(State Hoisting)完全指南
android·kotlin·compose
BoomHe17 小时前
git Rebase 为任意一笔提交补上 Change-Id
android·git·android studio
TDengine (老段)18 小时前
TDengine 超级表/子表/普通表 — 设计理念与内部表示
android·大数据·数据库·物联网·时序数据库·tdengine·涛思数据