简述空白答题卡识别并自动打0分

前因

简短版:帮妈妈改答题卡。
详细版:我快步走到书房,打开笔记本电脑,屏幕的蓝光映在脸上。对着空白的答题卡,我陷入了沉思,开始思考:如何自动批改空白卷?

过程

环境

本项目采用Python作为编程环境。

依赖库

  • cv2 (OpenCV): 用于图像处理

  • numpy: 数值计算

  • pyautogui: 屏幕截图和鼠标操作

  • time: 时间控制

  • winsound: 发出提示音

  • keyboard: 检测键盘输入

  • json: 读取配置文件

项目文件

main.py(主文件)

config.json

  • 监控区域(SCREEN_REGION)

  • 点击位置(CLICK_POSITION)

  • 空白阈值(BLANK_THRESHOLD)

主程序(main.py)

主要函数

  • 配置读取:从config.json文件中读取配置参数并转换为Python变量

  • is_blank_screen函数

    功能:判断指定屏幕区域是否为空白

    处理流程:

    1. 使用pyautogui截取指定区域

    2. 将图像转换为OpenCV格式(BGR)

    3. 转换为灰度图并应用高斯模糊减少噪声

    4. 使用自适应阈值处理将图像二值化

    5. 计算非零像素比例并与阈值比较

  • monitor_screen函数

    1、主监控循环

    2、每隔CHECK_INTERVAL秒检查一次屏幕区域

    3、如果检测到空白:

    • 打印提示信息

    • 发出2000Hz、持续500ms的提示音

    • CLICK_POSITION位置模拟鼠标点击

    • 退出方式:

      • 按下Ctrl+Q组合键

      • 或使用Ctrl+C中断程序

工作原理

  1. 程序持续监控屏幕上的一个特定区域(由SCREEN_REGION定义)

  2. 通过图像处理技术分析该区域内容

  3. 当该区域的"空白程度"超过设定的阈值(BLANK_THRESHOLD)时:

    判定为空白屏幕

    在预设位置(CLICK_POSITION)执行点击操作

    同时发出声音提示

  4. 检查间隔为0.2秒(可配置),确保及时响应(注:经本人测试,检查间隔为0.1或0.2s时反应最稳定,不会出现反应过快导致重复点击0分的后果)

由于某些原因,主程序暂无法公开。如有需要,请联系本人。

配置文件(config.json)

{
    "SCREEN_REGION": [x, y, width, height],
    "BLANK_THRESHOLD": 0.99,
    "CLICK_POSITION": [x, y],
    "CHECK_INTERVAL": 0.2
}

参数说明

  1. SCREEN_REGION: 定义了屏幕监控区域的坐标和大小,格式为[x, y, width, height]

    • x: 区域左上角的X坐标(x像素)

    • y: 区域左上角的Y坐标(y像素)

    • width: 区域宽度(width像素)

    • height: 区域高度(height像素)

  2. BLANK_THRESHOLD: 空白阈值(0.99),用于判断屏幕区域是否为空白。值越高,对"空白"的判断越严格。

  3. CLICK_POSITION: 当检测到空白时自动点击的位置坐标[x, y]

    • x: 点击位置的X坐标(x像素)

    • y: 点击位置的Y坐标(y像素)

  4. CHECK_INTERVAL: 检查间隔时间(0.2秒),即程序每隔0.2秒检查一次屏幕区域。

注意事项

  1. 使用前需要根据实际屏幕分辨率调整区域坐标和点击位置

  2. 空白阈值可能需要根据具体应用场景调整

  3. 程序运行时需要保持监控区域可见

  4. 使用Ctrl+Q可以安全退出程序(经实测,Ctrl+C无法退出运行,慎用)

评论