屏幕数字监控 + 警报

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

相关推荐
M0066889 小时前
低代码平台使用留存的技术基础与系统设计逻辑
android·rxjava
nono牛9 小时前
深入理解gatekeeperd 与 android.hardware.gatekeeper@1.0-service调用规则
android
lxysbly9 小时前
红白机模拟器安卓版带金手指
android
·云扬·9 小时前
【实操教程】Excel文件转CSV并导入MySQL的完整步骤
android·mysql·excel
触想工业平板电脑一体机9 小时前
【触想智能】工业触控一体机在船舶海运设备上应用的特点和具体场景分析
android·网络·计算机外设·电脑·智能电视
Change_JW9 小时前
reserved mem addr & size
android
汤面不加鱼丸9 小时前
android实践:生成.9.png图片
android
叶羽西9 小时前
下载Android源代码
android
nono牛9 小时前
android.hardware.gatekeeper@1.0-service 与 gatekeeperd 区别
android