屏幕数字监控 + 警报

解析:定时截取屏幕指定区域的图像,通过 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()阻塞:触发警报后,程序会停在这一行,直到你按下回车键,才会停止警报并退出。

相关推荐
JMchen1233 小时前
现代Android图像处理管道:从CameraX到OpenGL的60fps实时滤镜架构
android·图像处理·架构·kotlin·android studio·opengl·camerax
快点好好学习吧4 小时前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
是誰萆微了承諾4 小时前
php 对接deepseek
android·开发语言·php
Dxy12393102165 小时前
MySQL如何加唯一索引
android·数据库·mysql
冠希陈、7 小时前
PHP 判断是否是移动端,更新鸿蒙系统
android·开发语言·php
晚霞的不甘9 小时前
Flutter for OpenHarmony从零到一:构建《冰火人》双人合作闯关游戏
android·flutter·游戏·前端框架·全文检索·交互
2601_949833399 小时前
flutter_for_openharmony口腔护理app实战+饮食记录实现
android·javascript·flutter
独自破碎E9 小时前
【滑动窗口+字符计数数组】LCR_014_字符串的排列
android·java·开发语言
stevenzqzq9 小时前
compose 中 align和Arrangement的区别
android·compose
VincentWei9510 小时前
Compose:MutableState 和 mutableStateOf
android